diff options
Diffstat (limited to 'test/Transforms/BDCE')
-rw-r--r-- | test/Transforms/BDCE/basic.ll | 348 | ||||
-rw-r--r-- | test/Transforms/BDCE/dce-pure.ll | 33 | ||||
-rw-r--r-- | test/Transforms/BDCE/order.ll | 37 |
3 files changed, 418 insertions, 0 deletions
diff --git a/test/Transforms/BDCE/basic.ll b/test/Transforms/BDCE/basic.ll new file mode 100644 index 0000000..6e748c6 --- /dev/null +++ b/test/Transforms/BDCE/basic.ll @@ -0,0 +1,348 @@ +; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s +; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; Function Attrs: nounwind readnone +define signext i32 @bar(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 4 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 8 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %shr = ashr i32 %or15, 4 + ret i32 %shr + +; CHECK-LABEL: @bar +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 + +; Check that instsimplify is not doing this all on its own. +; CHECK-IO-LABEL: @bar +; CHECK-IO: tail call signext i32 @foo(i32 signext 5) +; CHECK-IO: tail call signext i32 @foo(i32 signext 3) +; CHECK-IO: tail call signext i32 @foo(i32 signext 2) +; CHECK-IO: tail call signext i32 @foo(i32 signext 1) +; CHECK-IO: tail call signext i32 @foo(i32 signext 0) +; CHECK-IO: tail call signext i32 @foo(i32 signext 4) +; CHECK-IO: ret i32 +} + +; Function Attrs: nounwind readnone +declare signext i32 @foo(i32 signext) #0 + +; Function Attrs: nounwind readnone +define signext i32 @far(i32 signext %x) #1 { +entry: + %call = tail call signext i32 @goo(i32 signext 5) #1 + %and = and i32 %call, 4 + %or = or i32 %and, %x + %call1 = tail call signext i32 @goo(i32 signext 3) #1 + %and2 = and i32 %call1, 8 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @goo(i32 signext 2) #1 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @goo(i32 signext 1) #1 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @goo(i32 signext 0) #1 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @goo(i32 signext 4) #1 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %shr = ashr i32 %or15, 4 + ret i32 %shr + +; CHECK-LABEL: @far +; Calls to foo(5) and foo(3) are still there, but their results are not used. +; CHECK: tail call signext i32 @goo(i32 signext 5) +; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3) +; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2) +; CHECK: tail call signext i32 @goo(i32 signext 1) +; CHECK: tail call signext i32 @goo(i32 signext 0) +; CHECK: tail call signext i32 @goo(i32 signext 4) +; CHECK: ret i32 + +; Check that instsimplify is not doing this all on its own. +; CHECK-IO-LABEL: @far +; CHECK-IO: tail call signext i32 @goo(i32 signext 5) +; CHECK-IO: tail call signext i32 @goo(i32 signext 3) +; CHECK-IO: tail call signext i32 @goo(i32 signext 2) +; CHECK-IO: tail call signext i32 @goo(i32 signext 1) +; CHECK-IO: tail call signext i32 @goo(i32 signext 0) +; CHECK-IO: tail call signext i32 @goo(i32 signext 4) +; CHECK-IO: ret i32 +} + +declare signext i32 @goo(i32 signext) #1 + +; Function Attrs: nounwind readnone +define signext i32 @tar1(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0 + %shr = ashr i32 %bs, 4 + ret i32 %shr + +; CHECK-LABEL: @tar1 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +declare i32 @llvm.bswap.i32(i32) #0 + +; Function Attrs: nounwind readnone +define signext i32 @tar2(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %shl = shl i32 %or15, 10 + ret i32 %shl + +; CHECK-LABEL: @tar2 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +define signext i32 @tar3(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %add = add i32 %or15, 5 + %shl = shl i32 %add, 10 + ret i32 %shl + +; CHECK-LABEL: @tar3 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +define signext i32 @tar4(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %sub = sub i32 %or15, 5 + %shl = shl i32 %sub, 10 + ret i32 %shl + +; CHECK-LABEL: @tar4 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +define signext i32 @tar5(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %xor = xor i32 %or15, 5 + %shl = shl i32 %xor, 10 + ret i32 %shl + +; CHECK-LABEL: @tar5 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +define signext i32 @tar7(i32 signext %x, i1 %b) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %v = select i1 %b, i32 %or15, i32 5 + %shl = shl i32 %v, 10 + ret i32 %shl + +; CHECK-LABEL: @tar7 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i32 +} + +; Function Attrs: nounwind readnone +define signext i16 @tar8(i32 signext %x) #0 { +entry: + %call = tail call signext i32 @foo(i32 signext 5) #0 + %and = and i32 %call, 33554432 + %or = or i32 %and, %x + %call1 = tail call signext i32 @foo(i32 signext 3) #0 + %and2 = and i32 %call1, 67108864 + %or3 = or i32 %or, %and2 + %call4 = tail call signext i32 @foo(i32 signext 2) #0 + %and5 = and i32 %call4, 16 + %or6 = or i32 %or3, %and5 + %call7 = tail call signext i32 @foo(i32 signext 1) #0 + %and8 = and i32 %call7, 32 + %or9 = or i32 %or6, %and8 + %call10 = tail call signext i32 @foo(i32 signext 0) #0 + %and11 = and i32 %call10, 64 + %or12 = or i32 %or9, %and11 + %call13 = tail call signext i32 @foo(i32 signext 4) #0 + %and14 = and i32 %call13, 128 + %or15 = or i32 %or12, %and14 + %tr = trunc i32 %or15 to i16 + ret i16 %tr + +; CHECK-LABEL: @tar8 +; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) +; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) +; CHECK: tail call signext i32 @foo(i32 signext 2) +; CHECK: tail call signext i32 @foo(i32 signext 1) +; CHECK: tail call signext i32 @foo(i32 signext 0) +; CHECK: tail call signext i32 @foo(i32 signext 4) +; CHECK: ret i16 +} + +attributes #0 = { nounwind readnone } +attributes #1 = { nounwind } + diff --git a/test/Transforms/BDCE/dce-pure.ll b/test/Transforms/BDCE/dce-pure.ll new file mode 100644 index 0000000..6a432fc --- /dev/null +++ b/test/Transforms/BDCE/dce-pure.ll @@ -0,0 +1,33 @@ +; RUN: opt -bdce -S < %s | FileCheck %s + +declare i32 @strlen(i8*) readonly nounwind + +define void @test1() { + call i32 @strlen( i8* null ) + ret void + +; CHECK-LABEL: @test1 +; CHECK-NOT: call +; CHECK: ret void +} + +define i32 @test2() { + ; invoke of pure function should not be deleted! + invoke i32 @strlen( i8* null ) readnone + to label %Cont unwind label %Other + +Cont: ; preds = %0 + ret i32 0 + +Other: ; preds = %0 + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup + ret i32 1 + +; CHECK-LABEL: @test2 +; CHECK: invoke +; CHECK: ret i32 1 +} + +declare i32 @__gxx_personality_v0(...) + diff --git a/test/Transforms/BDCE/order.ll b/test/Transforms/BDCE/order.ll new file mode 100644 index 0000000..301f447 --- /dev/null +++ b/test/Transforms/BDCE/order.ll @@ -0,0 +1,37 @@ +; RUN: opt -bdce -S < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare i32 @__gxx_personality_v0(...) + +define fastcc void @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb() #0 { +entry: + br i1 undef, label %if.else, label %entry.if.end_crit_edge + +if.else: + ret void + +invoke.cont70: + store i32 %call71, i32* undef, align 4 + br label %if.else + +; CHECK-LABEL: @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb +; CHECK: store i32 %call71 + +lpad65.loopexit.split-lp.loopexit.split-lp: + br label %if.else + +lpad65.loopexit.split-lp.loopexit.split-lp.loopexit: + %lpad.loopexit1121 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + br label %lpad65.loopexit.split-lp.loopexit.split-lp + +entry.if.end_crit_edge: + %call71 = invoke i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv() + to label %invoke.cont70 unwind label %lpad65.loopexit.split-lp.loopexit.split-lp.loopexit +} + +declare i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv() + +attributes #0 = { uwtable } + |