diff options
Diffstat (limited to 'test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll')
-rw-r--r-- | test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll b/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll new file mode 100644 index 000000000000..cb015b2d1ce9 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll @@ -0,0 +1,239 @@ +; RUN: opt -S -dse < %s | FileCheck %s +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-bgq-linux" + +%"struct.std::complex" = type { { float, float } } + +define void @_Z4testSt7complexIfE(%"struct.std::complex"* noalias nocapture sret %agg.result, i64 %c.coerce) { +entry: +; CHECK-LABEL: @_Z4testSt7complexIfE + + %ref.tmp = alloca i64, align 8 + %tmpcast = bitcast i64* %ref.tmp to %"struct.std::complex"* + %c.sroa.0.0.extract.shift = lshr i64 %c.coerce, 32 + %c.sroa.0.0.extract.trunc = trunc i64 %c.sroa.0.0.extract.shift to i32 + %0 = bitcast i32 %c.sroa.0.0.extract.trunc to float + %c.sroa.2.0.extract.trunc = trunc i64 %c.coerce to i32 + %1 = bitcast i32 %c.sroa.2.0.extract.trunc to float + call void @_Z3barSt7complexIfE(%"struct.std::complex"* nonnull sret %tmpcast, i64 %c.coerce) + %2 = bitcast %"struct.std::complex"* %agg.result to i64* + %3 = load i64, i64* %ref.tmp, align 8 + store i64 %3, i64* %2, align 4 +; CHECK-NOT: store i64 + + %_M_value.realp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 0 + %4 = lshr i64 %3, 32 + %5 = trunc i64 %4 to i32 + %6 = bitcast i32 %5 to float + %_M_value.imagp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 1 + %7 = trunc i64 %3 to i32 + %8 = bitcast i32 %7 to float + %mul_ad.i.i = fmul fast float %6, %1 + %mul_bc.i.i = fmul fast float %8, %0 + %mul_i.i.i = fadd fast float %mul_ad.i.i, %mul_bc.i.i + %mul_ac.i.i = fmul fast float %6, %0 + %mul_bd.i.i = fmul fast float %8, %1 + %mul_r.i.i = fsub fast float %mul_ac.i.i, %mul_bd.i.i + store float %mul_r.i.i, float* %_M_value.realp.i.i, align 4 + store float %mul_i.i.i, float* %_M_value.imagp.i.i, align 4 + ret void +; CHECK: ret void +} + +declare void @_Z3barSt7complexIfE(%"struct.std::complex"* sret, i64) + +define void @test1(i32 *%ptr) { +entry: +; CHECK-LABEL: @test1 + + store i32 5, i32* %ptr + %bptr = bitcast i32* %ptr to i8* + store i8 7, i8* %bptr + %wptr = bitcast i32* %ptr to i16* + store i16 -30062, i16* %wptr + %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 + store i8 25, i8* %bptr2 + %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 + store i8 47, i8* %bptr3 + %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 + %wptrp = bitcast i8* %bptr1 to i16* + store i16 2020, i16* %wptrp, align 1 + ret void + +; CHECK-NOT: store i32 5, i32* %ptr +; CHECK-NOT: store i8 7, i8* %bptr +; CHECK: store i16 -30062, i16* %wptr +; CHECK-NOT: store i8 25, i8* %bptr2 +; CHECK: store i8 47, i8* %bptr3 +; CHECK: store i16 2020, i16* %wptrp, align 1 + +; CHECK: ret void +} + +define void @test2(i32 *%ptr) { +entry: +; CHECK-LABEL: @test2 + + store i32 5, i32* %ptr + + %bptr = bitcast i32* %ptr to i8* + %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1 + %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 + %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 + %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 + + %wptr = bitcast i8* %bptr to i16* + %wptrm1 = bitcast i8* %bptrm1 to i16* + %wptr1 = bitcast i8* %bptr1 to i16* + %wptr2 = bitcast i8* %bptr2 to i16* + %wptr3 = bitcast i8* %bptr3 to i16* + + store i16 1456, i16* %wptrm1, align 1 + store i16 1346, i16* %wptr, align 1 + store i16 1756, i16* %wptr1, align 1 + store i16 1126, i16* %wptr2, align 1 + store i16 5656, i16* %wptr3, align 1 + +; CHECK-NOT: store i32 5, i32* %ptr + +; CHECK: store i16 1456, i16* %wptrm1, align 1 +; CHECK: store i16 1346, i16* %wptr, align 1 +; CHECK: store i16 1756, i16* %wptr1, align 1 +; CHECK: store i16 1126, i16* %wptr2, align 1 +; CHECK: store i16 5656, i16* %wptr3, align 1 + + ret void + +; CHECK: ret void +} + +define signext i8 @test3(i32 *%ptr) { +entry: +; CHECK-LABEL: @test3 + + store i32 5, i32* %ptr + + %bptr = bitcast i32* %ptr to i8* + %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1 + %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 + %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 + %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 + + %wptr = bitcast i8* %bptr to i16* + %wptrm1 = bitcast i8* %bptrm1 to i16* + %wptr1 = bitcast i8* %bptr1 to i16* + %wptr2 = bitcast i8* %bptr2 to i16* + %wptr3 = bitcast i8* %bptr3 to i16* + + %v = load i8, i8* %bptr, align 1 + store i16 1456, i16* %wptrm1, align 1 + store i16 1346, i16* %wptr, align 1 + store i16 1756, i16* %wptr1, align 1 + store i16 1126, i16* %wptr2, align 1 + store i16 5656, i16* %wptr3, align 1 + +; CHECK: store i32 5, i32* %ptr + + ret i8 %v + +; CHECK: ret i8 %v +} + +%struct.foostruct = type { +i32 (i8*, i8**, i32, i8, i8*)*, +i32 (i8*, i8**, i32, i8, i8*)*, +i32 (i8*, i8**, i32, i8, i8*)*, +i32 (i8*, i8**, i32, i8, i8*)*, +void (i8*, i32, i32)* +} +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) +declare void @goFunc(%struct.foostruct*) +declare i32 @fa(i8*, i8**, i32, i8, i8*) + +define void @test4() { +entry: +; CHECK-LABEL: @test4 + + %bang = alloca %struct.foostruct, align 8 + %v1 = bitcast %struct.foostruct* %bang to i8* + call void @llvm.memset.p0i8.i64(i8* %v1, i8 0, i64 40, i32 8, i1 false) + %v2 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 0 + store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v2, align 8 + %v3 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 1 + store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v3, align 8 + %v4 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 2 + store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v4, align 8 + %v5 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 3 + store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v5, align 8 + %v6 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 4 + store void (i8*, i32, i32)* null, void (i8*, i32, i32)** %v6, align 8 + call void @goFunc(%struct.foostruct* %bang) + ret void + +; CHECK-NOT: memset +; CHECK: ret void +} + +define signext i8 @test5(i32 *%ptr) { +entry: +; CHECK-LABEL: @test5 + + store i32 0, i32* %ptr + + %bptr = bitcast i32* %ptr to i8* + %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 + %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 + %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 + + %wptr = bitcast i8* %bptr to i16* + %wptr1 = bitcast i8* %bptr1 to i16* + %wptr2 = bitcast i8* %bptr2 to i16* + + store i16 65535, i16* %wptr2, align 1 + store i16 1456, i16* %wptr1, align 1 + store i16 1346, i16* %wptr, align 1 + +; CHECK-NOT: store i32 0, i32* %ptr + + ret i8 0 +} + +define signext i8 @test6(i32 *%ptr) { +entry: +; CHECK-LABEL: @test6 + + store i32 0, i32* %ptr + + %bptr = bitcast i32* %ptr to i16* + %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0 + %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1 + + store i16 1456, i16* %bptr2, align 1 + store i16 65535, i16* %bptr1, align 1 + +; CHECK-NOT: store i32 0, i32* %ptr + + ret i8 0 +} + +define signext i8 @test7(i64 *%ptr) { +entry: +; CHECK-LABEL: @test7 + + store i64 0, i64* %ptr + + %bptr = bitcast i64* %ptr to i16* + %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0 + %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1 + %bptr3 = getelementptr inbounds i16, i16* %bptr, i64 2 + %bptr4 = getelementptr inbounds i16, i16* %bptr, i64 3 + + store i16 1346, i16* %bptr1, align 1 + store i16 1756, i16* %bptr3, align 1 + store i16 1456, i16* %bptr2, align 1 + store i16 5656, i16* %bptr4, align 1 + +; CHECK-NOT: store i64 0, i64* %ptr + + ret i8 0 +} |