diff options
Diffstat (limited to 'test/Transforms/SimplifyCFG')
34 files changed, 706 insertions, 142 deletions
diff --git a/test/Transforms/SimplifyCFG/2009-01-19-UnconditionalTrappingConstantExpr.ll b/test/Transforms/SimplifyCFG/2009-01-19-UnconditionalTrappingConstantExpr.ll index e2765e5f50e6..740ea25f93ae 100644 --- a/test/Transforms/SimplifyCFG/2009-01-19-UnconditionalTrappingConstantExpr.ll +++ b/test/Transforms/SimplifyCFG/2009-01-19-UnconditionalTrappingConstantExpr.ll @@ -4,7 +4,7 @@ @G = extern_weak global i32 -; CHECK: @test( +; CHECK-LABEL: @test( ; CHECK: br i1 %tmp25 ; CHECK: bb1: ; CHECK: sdiv @@ -23,7 +23,7 @@ bb6: ret i32 927 } -; CHECK: @test2( +; CHECK-LABEL: @test2( ; CHECK: br i1 %tmp34 ; CHECK: bb5: ; CHECK: sdiv diff --git a/test/Transforms/SimplifyCFG/CoveredLookupTable.ll b/test/Transforms/SimplifyCFG/CoveredLookupTable.ll new file mode 100644 index 000000000000..8b45a590bb1f --- /dev/null +++ b/test/Transforms/SimplifyCFG/CoveredLookupTable.ll @@ -0,0 +1,48 @@ +; RUN: opt -simplifycfg -S %s | FileCheck %s +; rdar://15268442 + +target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-apple-darwin12.0.0" + +; CHECK-LABEL: define i3 @coveredswitch_test( +; CHECK: entry: +; CHECK-NEXT: sub i3 %input, -4 +; CHECK-NEXT: zext i3 %switch.tableidx to i24 +; CHECK-NEXT: mul i24 %switch.cast, 3 +; CHECK-NEXT: lshr i24 7507338, %switch.shiftamt +; CHECK-NEXT: trunc i24 %switch.downshift to i3 +; CHECK-NEXT: ret i3 %switch.masked + +define i3 @coveredswitch_test(i3 %input) { +entry: + switch i3 %input, label %bb8 [ + i3 0, label %bb7 + i3 1, label %bb + i3 2, label %bb3 + i3 3, label %bb4 + i3 4, label %bb5 + i3 5, label %bb6 + ] + +bb: ; preds = %entry + br label %bb8 + +bb3: ; preds = %entry + br label %bb8 + +bb4: ; preds = %entry + br label %bb8 + +bb5: ; preds = %entry + br label %bb8 + +bb6: ; preds = %entry + br label %bb8 + +bb7: ; preds = %entry + br label %bb8 + +bb8: ; preds = %bb7, %bb6, %bb5, %bb4, %bb3, %bb, %entry + %result = phi i3 [ 0, %bb7 ], [ 1, %bb6 ], [ 2, %bb5 ], [ 3, %bb4 ], [ 4, %bb3 ], [ 5, %bb ], [ 6, %entry ] + ret i3 %result +} diff --git a/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll b/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll index 912c7556e006..b07ef970a20a 100644 --- a/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll +++ b/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll @@ -1,8 +1,18 @@ ; Test merging of blocks with phi nodes. ; -; RUN: opt < %s -simplifycfg -S | not grep N: +; RUN: opt < %s -simplifycfg -S > %t +; RUN: not grep N: %t +; RUN: not grep X: %t +; RUN: not grep 'switch i32[^U]+%U' %t +; RUN: not grep "^BB.tomerge" %t +; RUN: grep "^BB.nomerge" %t | count 2 ; +; ModuleID = '<stdin>' +declare i1 @foo() + +declare i1 @bar(i32) + define i32 @test(i1 %a) { Q: br i1 %a, label %N, label %M @@ -16,3 +26,231 @@ M: ; preds = %N, %Q ret i32 %R } +; Test merging of blocks with phi nodes where at least one incoming value +; in the successor is undef. +define i8 @testundef(i32 %u) { +R: + switch i32 %u, label %U [ + i32 0, label %S + i32 1, label %T + i32 2, label %T + ] + +S: ; preds = %R + br label %U + +T: ; preds = %R, %R + br label %U + +U: ; preds = %T, %S, %R + ; We should be able to merge either the S or T block into U by rewriting + ; R's incoming value with the incoming value of that predecessor since + ; R's incoming value is undef and both of those predecessors are simple + ; unconditional branches. + %val.0 = phi i8 [ undef, %R ], [ 1, %T ], [ 0, %S ] + ret i8 %val.0 +} + +; Test merging of blocks with phi nodes where at least one incoming value +; in the successor is undef. +define i8 @testundef2(i32 %u, i32* %A) { +V: + switch i32 %u, label %U [ + i32 0, label %W + i32 1, label %X + i32 2, label %X + i32 3, label %Z + ] + +W: ; preds = %V + br label %U + +Z: + store i32 0, i32* %A, align 4 + br label %X + +X: ; preds = %V, %V, %Z + br label %U + +U: ; preds = %X, %W, %V + ; We should be able to merge either the W or X block into U by rewriting + ; V's incoming value with the incoming value of that predecessor since + ; V's incoming value is undef and both of those predecessors are simple + ; unconditional branches. Note that X has predecessors beyond + ; the direct predecessors of U. + %val.0 = phi i8 [ undef, %V ], [ 1, %X ], [ 1, %W ] + ret i8 %val.0 +} + +define i8 @testmergesome(i32 %u, i32* %A) { +V: + switch i32 %u, label %Y [ + i32 0, label %W + i32 1, label %X + i32 2, label %X + i32 3, label %Z + ] + +W: ; preds = %V + store i32 1, i32* %A, align 4 + br label %Y + +Z: + store i32 0, i32* %A, align 4 + br label %X + +X: ; preds = %V, %Z + br label %Y + +Y: ; preds = %X, %W, %V + ; After merging X into Y, we should have 5 predecessors + ; and thus 5 incoming values to the phi. + %val.0 = phi i8 [ 1, %V ], [ 1, %X ], [ 2, %W ] + ret i8 %val.0 +} + + +define i8 @testmergesome2(i32 %u, i32* %A) { +V: + switch i32 %u, label %W [ + i32 0, label %W + i32 1, label %Y + i32 2, label %X + i32 4, label %Y + ] + +W: ; preds = %V + store i32 1, i32* %A, align 4 + br label %Y + +X: ; preds = %V, %Z + br label %Y + +Y: ; preds = %X, %W, %V + ; Ensure that we deal with both undef inputs for V when we merge in X. + %val.0 = phi i8 [ undef, %V ], [ 1, %X ], [ 2, %W ], [ undef, %V ] + ret i8 %val.0 +} + +; This function can't be merged +define void @a() { +entry: + br label %BB.nomerge + +BB.nomerge: ; preds = %Common, %entry + ; This phi has a conflicting value (0) with below phi (2), so blocks + ; can't be merged. + %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] + br label %Succ + +Succ: ; preds = %Common, %BB.nomerge + %b = phi i32 [ %a, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] + %conde = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %conde, label %Common, label %Exit + +Common: ; preds = %Succ + %cond = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %cond, label %BB.nomerge, label %Succ + +Exit: ; preds = %Succ + ret void +} + +; This function can't be merged +define void @b() { +entry: + br label %BB.nomerge + +BB.nomerge: ; preds = %Common, %entry + br label %Succ + +Succ: ; preds = %Common, %BB.nomerge + ; This phi has confliction values for Common and (through BB) Common, + ; blocks can't be merged + %b = phi i32 [ 1, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] + %conde = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %conde, label %Common, label %Exit + +Common: ; preds = %Succ + %cond = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %cond, label %BB.nomerge, label %Succ + +Exit: ; preds = %Succ + ret void +} + +; This function can be merged +define void @c() { +entry: + br label %BB.tomerge + +BB.tomerge: ; preds = %Common, %entry + br label %Succ + +Succ: ; preds = %Common, %BB.tomerge, %Pre-Exit + ; This phi has identical values for Common and (through BB) Common, + ; blocks can't be merged + %b = phi i32 [ 1, %BB.tomerge ], [ 1, %Common ], [ 2, %Pre-Exit ] + %conde = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %conde, label %Common, label %Pre-Exit + +Common: ; preds = %Succ + %cond = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %cond, label %BB.tomerge, label %Succ + +Pre-Exit: ; preds = %Succ + ; This adds a backedge, so the %b phi node gets a third branch and is + ; not completely trivial + %cond2 = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %cond2, label %Succ, label %Exit + +Exit: ; preds = %Pre-Exit + ret void +} + +; This function can be merged +define void @d() { +entry: + br label %BB.tomerge + +BB.tomerge: ; preds = %Common, %entry + ; This phi has a matching value (0) with below phi (0), so blocks + ; can be merged. + %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] + br label %Succ + +Succ: ; preds = %Common, %BB.tomerge + %b = phi i32 [ %a, %BB.tomerge ], [ 0, %Common ] ; <i32> [#uses=0] + %conde = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %conde, label %Common, label %Exit + +Common: ; preds = %Succ + %cond = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %cond, label %BB.tomerge, label %Succ + +Exit: ; preds = %Succ + ret void +} + +; This function can be merged +define void @e() { +entry: + br label %BB.tomerge + +BB.tomerge: ; preds = %Use, %entry + ; This phi is used somewhere else than Succ, but this should not prevent + ; merging this block + %a = phi i32 [ 1, %entry ], [ 0, %Use ] ; <i32> [#uses=1] + br label %Succ + +Succ: ; preds = %BB.tomerge + %conde = call i1 @foo( ) ; <i1> [#uses=1] + br i1 %conde, label %Use, label %Exit + +Use: ; preds = %Succ + %cond = call i1 @bar( i32 %a ) ; <i1> [#uses=1] + br i1 %cond, label %BB.tomerge, label %Exit + +Exit: ; preds = %Use, %Succ + ret void +} diff --git a/test/Transforms/SimplifyCFG/MagicPointer.ll b/test/Transforms/SimplifyCFG/MagicPointer.ll index 93b9a276eac4..b8b8cbd9dc63 100644 --- a/test/Transforms/SimplifyCFG/MagicPointer.ll +++ b/test/Transforms/SimplifyCFG/MagicPointer.ll @@ -2,15 +2,7 @@ ; ; RUN: opt < %s -simplifycfg -S | FileCheck %s -; CHECK: switch i64 %magicptr -; CHECK: i64 0, label -; CHECK: i64 1, label -; CHECK: i64 2, label -; CHECK: i64 3, label -; CHECK: i64 4, label -; CHECK: } - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" @.str = private constant [5 x i8] c"null\00" ; <[5 x i8]*> [#uses=2] @@ -18,7 +10,24 @@ target triple = "x86_64-apple-darwin10.0.0" @.str2 = private constant [4 x i8] c"two\00" ; <[4 x i8]*> [#uses=2] @.str3 = private constant [5 x i8] c"four\00" ; <[5 x i8]*> [#uses=2] +@.str_as1 = private addrspace(1) constant [5 x i8] c"null\00" ; <[5 x i8]*> [#uses=2] +@.str1_as1 = private addrspace(1) constant [4 x i8] c"one\00" ; <[4 x i8]*> [#uses=2] +@.str2_as1 = private addrspace(1) constant [4 x i8] c"two\00" ; <[4 x i8]*> [#uses=2] +@.str3_as1 = private addrspace(1) constant [5 x i8] c"four\00" ; <[5 x i8]*> [#uses=2] + +declare i32 @puts(i8*) +declare i32 @puts_as1(i8 addrspace(1)*) + define void @f(i8* %x) nounwind ssp { +; CHECK-LABEL: @f( +; CHECK: switch i64 %magicptr +; CHECK: i64 0, label +; CHECK: i64 1, label +; CHECK: i64 2, label +; CHECK: i64 3, label +; CHECK: i64 4, label +; CHECK: } + entry: %tobool = icmp eq i8* %x, null ; <i1> [#uses=1] br i1 %tobool, label %if.then, label %if.else @@ -72,4 +81,69 @@ if.end21: ; preds = %if.end20, %if.then ret void } -declare i32 @puts(i8*) +; Is it useful to test a version where the ptrtoints are to the same +; size? +define void @f_as1(i8 addrspace(1)* %x) nounwind ssp { +; CHECK-LABEL: @f_as1( +; CHECK: ptrtoint i8 addrspace(1)* %x to i16 +; CHECK: switch i16 %magicptr +; CHECK: i16 0, label +; CHECK: i16 1, label +; CHECK: i16 2, label +; CHECK: i16 3, label +; CHECK: i16 4, label +; CHECK: } + +entry: + %tobool = icmp eq i8 addrspace(1)* %x, null ; <i1> [#uses=1] + br i1 %tobool, label %if.then, label %if.else + +if.then: ; preds = %entry + %call = call i32 @puts_as1(i8 addrspace(1)* getelementptr inbounds ([5 x i8] addrspace(1)* @.str_as1, i64 0, i64 0)) nounwind ; <i32> [#uses=0] + br label %if.end21 + +if.else: ; preds = %entry + %cmp = icmp eq i8 addrspace(1)* %x, inttoptr (i64 1 to i8 addrspace(1)*) ; <i1> [#uses=1] + br i1 %cmp, label %if.then2, label %if.else4 + +if.then2: ; preds = %if.else + %call3 = call i32 @puts_as1(i8 addrspace(1)* getelementptr inbounds ([4 x i8] addrspace(1)* @.str1_as1, i64 0, i64 0)) nounwind ; <i32> [#uses=0] + br label %if.end20 + +if.else4: ; preds = %if.else + %cmp6 = icmp eq i8 addrspace(1)* %x, inttoptr (i64 2 to i8 addrspace(1)*) ; <i1> [#uses=1] + br i1 %cmp6, label %if.then9, label %lor.lhs.false + +lor.lhs.false: ; preds = %if.else4 + %cmp8 = icmp eq i8 addrspace(1)* %x, inttoptr (i64 3 to i8 addrspace(1)*) ; <i1> [#uses=1] + br i1 %cmp8, label %if.then9, label %if.else11 + +if.then9: ; preds = %lor.lhs.false, %if.else4 + %call10 = call i32 @puts_as1(i8 addrspace(1)* getelementptr inbounds ([4 x i8] addrspace(1)* @.str2_as1, i64 0, i64 0)) nounwind ; <i32> [#uses=0] + br label %if.end19 + +if.else11: ; preds = %lor.lhs.false + %cmp13 = icmp eq i8 addrspace(1)* %x, inttoptr (i64 4 to i8 addrspace(1)*) ; <i1> [#uses=1] + br i1 %cmp13, label %if.then14, label %if.else16 + +if.then14: ; preds = %if.else11 + %call15 = call i32 @puts_as1(i8 addrspace(1)* getelementptr inbounds ([5 x i8] addrspace(1)* @.str3_as1, i64 0, i64 0)) nounwind ; <i32> [#uses=0] + br label %if.end + +if.else16: ; preds = %if.else11 + %call18 = call i32 @puts_as1(i8 addrspace(1)* %x) nounwind ; <i32> [#uses=0] + br label %if.end + +if.end: ; preds = %if.else16, %if.then14 + br label %if.end19 + +if.end19: ; preds = %if.end, %if.then9 + br label %if.end20 + +if.end20: ; preds = %if.end19, %if.then2 + br label %if.end21 + +if.end21: ; preds = %if.end20, %if.then + ret void +} + diff --git a/test/Transforms/SimplifyCFG/PR16069.ll b/test/Transforms/SimplifyCFG/PR16069.ll new file mode 100644 index 000000000000..0b3d67794513 --- /dev/null +++ b/test/Transforms/SimplifyCFG/PR16069.ll @@ -0,0 +1,28 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s + +@b = extern_weak global i32 + +define i32 @foo(i1 %y) { +; CHECK: define i32 @foo(i1 %y) { + br i1 %y, label %bb1, label %bb2 +bb1: + br label %bb3 +bb2: + br label %bb3 +bb3: + %cond.i = phi i32 [ 0, %bb1 ], [ srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb2 ] +; CHECK: phi i32 {{.*}} srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb2 + ret i32 %cond.i +} + +define i32 @foo2(i1 %x) { +; CHECK: define i32 @foo2(i1 %x) { +bb0: + br i1 %x, label %bb1, label %bb2 +bb1: + br label %bb2 +bb2: + %cond = phi i32 [ 0, %bb1 ], [ srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb0 ] +; CHECK: %cond = phi i32 [ 0, %bb1 ], [ srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb0 ] + ret i32 %cond +} diff --git a/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg b/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg index 786fee9e6610..4d344fa91a9e 100644 --- a/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg +++ b/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg @@ -1,5 +1,3 @@ -config.suffixes = ['.ll', '.c', '.cpp'] - targets = set(config.root.targets_to_build.split()) if not 'Sparc' in targets: config.unsupported = True diff --git a/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll index 9d1568557f30..bb48c80268aa 100644 --- a/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll @@ -26,7 +26,7 @@ return: %retval.0 = phi i32 [ 15, %sw.default ], [ 1, %sw.bb6 ], [ 62, %sw.bb5 ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] ret i32 %retval.0 -; CHECK: @f +; CHECK-LABEL: @f( ; CHECK-NOT: getelementptr ; CHECK: switch i32 %c } diff --git a/test/Transforms/SimplifyCFG/SpeculativeExec.ll b/test/Transforms/SimplifyCFG/SpeculativeExec.ll index dd2e5d1c3a77..83fa41900035 100644 --- a/test/Transforms/SimplifyCFG/SpeculativeExec.ll +++ b/test/Transforms/SimplifyCFG/SpeculativeExec.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-unknown-linux-gnu" define i32 @test1(i32 %a, i32 %b, i32 %c) nounwind { -; CHECK: @test1 +; CHECK-LABEL: @test1( entry: %tmp1 = icmp eq i32 %b, 0 br i1 %tmp1, label %bb1, label %bb3 @@ -31,7 +31,7 @@ bb3: ; preds = %bb2, %entry declare i8 @llvm.cttz.i8(i8, i1) define i8 @test2(i8 %a) { -; CHECK: @test2 +; CHECK-LABEL: @test2( br i1 undef, label %bb_true, label %bb_false bb_true: %b = tail call i8 @llvm.cttz.i8(i8 %a, i1 false) @@ -47,7 +47,7 @@ join: define i8* @test4(i1* %dummy, i8* %a, i8* %b) { ; Test that we don't speculate an arbitrarily large number of unfolded constant ; expressions. -; CHECK: @test4 +; CHECK-LABEL: @test4( entry: %cond1 = load volatile i1* %dummy diff --git a/test/Transforms/SimplifyCFG/UnreachableEliminate.ll b/test/Transforms/SimplifyCFG/UnreachableEliminate.ll index 4a692f3622ec..e1635f491156 100644 --- a/test/Transforms/SimplifyCFG/UnreachableEliminate.ll +++ b/test/Transforms/SimplifyCFG/UnreachableEliminate.ll @@ -1,7 +1,7 @@ ; RUN: opt < %s -simplifycfg -S | FileCheck %s define void @test1(i1 %C, i1* %BP) { -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: entry: ; CHECK-NEXT: ret void entry: @@ -14,7 +14,7 @@ F: } define void @test2() { -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: entry: ; CHECK-NEXT: call void @test2() ; CHECK-NEXT: ret void @@ -28,7 +28,7 @@ N: } define i32 @test3(i32 %v) { -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK: entry: ; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2 ; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1 diff --git a/test/Transforms/SimplifyCFG/X86/lit.local.cfg b/test/Transforms/SimplifyCFG/X86/lit.local.cfg index a8ad0f1a28b2..ba763cf03ffc 100644 --- a/test/Transforms/SimplifyCFG/X86/lit.local.cfg +++ b/test/Transforms/SimplifyCFG/X86/lit.local.cfg @@ -1,5 +1,3 @@ -config.suffixes = ['.ll', '.c', '.cpp'] - targets = set(config.root.targets_to_build.split()) if not 'X86' in targets: config.unsupported = True diff --git a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index 5f70465c64d4..368732711a70 100644 --- a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -52,7 +52,7 @@ return: %retval.0 = phi i32 [ 15, %sw.default ], [ 1, %sw.bb6 ], [ 62, %sw.bb5 ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] ret i32 %retval.0 -; CHECK: @f +; CHECK-LABEL: @f( ; CHECK: entry: ; CHECK-NEXT: %switch.tableidx = sub i32 %c, 42 ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 7 @@ -88,7 +88,7 @@ sw.epilog: call void @dummy(i8 signext %a.0, float %b.0) ret void -; CHECK: @h +; CHECK-LABEL: @h( ; CHECK: entry: ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0 ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 4 @@ -138,7 +138,7 @@ return: [ getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), %entry ] ret i8* %retval.0 -; CHECK: @foostring +; CHECK-LABEL: @foostring( ; CHECK: entry: ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0 ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 4 @@ -171,7 +171,7 @@ sw.epilog: %b.0 = phi i32 [ 10, %sw.default ], [ 5, %sw.bb3 ], [ 1, %sw.bb2 ], [ 4, %sw.bb1 ], [ 3, %entry ] ret i32 %a.0 -; CHECK: @earlyreturncrash +; CHECK-LABEL: @earlyreturncrash( ; CHECK: switch.lookup: ; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i32]* @switch.table3, i32 0, i32 %switch.tableidx ; CHECK-NEXT: %switch.load = load i32* %switch.gep @@ -221,7 +221,7 @@ lor.end: %lor.ext = zext i1 %0 to i32 ret i32 %lor.ext -; CHECK: @crud +; CHECK-LABEL: @crud( ; CHECK: entry: ; CHECK-NEXT: %cmp = icmp ult i8 %c, 33 ; CHECK-NEXT: br i1 %cmp, label %lor.end, label %switch.early.test @@ -263,7 +263,7 @@ if.else: br label %if.end if.end: %dirent_type.0 = phi i32 [ 3, %sw.default ], [ 6, %sw.bb3 ], [ 5, %sw.bb2 ], [ 0, %sw.bb1 ], [ 3, %sw.bb ], [ 0, %if.else ] ret i32 %dirent_type.0 -; CHECK: define i32 @overflow +; CHECK-LABEL: define i32 @overflow( ; CHECK: switch ; CHECK: phi } @@ -284,7 +284,7 @@ bb2: br label %bb3 bb3: %tmp4 = phi i1 [ undef, %bb ], [ false, %bb2 ], [ true, %bb1 ] ret i1 %tmp4 -; CHECK: define i1 @undef +; CHECK-LABEL: define i1 @undef( ; CHECK: %switch.cast = trunc i32 %switch.tableidx to i9 ; CHECK: %switch.downshift = lshr i9 3, %switch.shiftamt } @@ -711,7 +711,7 @@ return: ret i32 %retval.0 } -define i32 @cprop(i32 %x) { +define i32 @cprop(i32 %x, i32 %y) { entry: switch i32 %x, label %sw.default [ i32 1, label %return @@ -727,7 +727,8 @@ sw.bb1: br label %return sw.bb2: %and = and i32 %x, 1 - %tobool = icmp ne i32 %and, 0 + %and.ptr = inttoptr i32 %and to i8* + %tobool = icmp ne i8* %and.ptr, null %cond = select i1 %tobool, i32 -123, i32 456 %sub = sub nsw i32 %x, %cond br label %return @@ -735,16 +736,18 @@ sw.bb2: sw.bb3: %trunc = trunc i32 %x to i8 %sext = sext i8 %trunc to i32 + %select.i = icmp sgt i32 %sext, 0 + %select = select i1 %select.i, i32 %sext, i32 %y br label %return sw.default: br label %return return: - %retval.0 = phi i32 [ 123, %sw.default ], [ %sext, %sw.bb3 ], [ %sub, %sw.bb2 ], [ 42, %sw.bb1 ], [ 5, %entry ] + %retval.0 = phi i32 [ 123, %sw.default ], [ %select, %sw.bb3 ], [ %sub, %sw.bb2 ], [ 42, %sw.bb1 ], [ 5, %entry ] ret i32 %retval.0 -; CHECK: @cprop +; CHECK-LABEL: @cprop( ; CHECK: switch.lookup: ; CHECK: %switch.gep = getelementptr inbounds [7 x i32]* @switch.table5, i32 0, i32 %switch.tableidx } @@ -773,7 +776,7 @@ return: %retval.0 = phi i32 [ 1, %sw.bb3 ], [ -1, %sw.bb2 ], [ 0, %sw.bb ] ret i32 %retval.0 -; CHECK: @unreachable +; CHECK-LABEL: @unreachable( ; CHECK: switch.lookup: ; CHECK: getelementptr inbounds [5 x i32]* @switch.table6, i32 0, i32 %switch.tableidx } @@ -799,7 +802,7 @@ return: %retval.0 = phi i96 [ 15, %sw.default ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] ret i96 %retval.0 -; CHECK: @illegaltype +; CHECK-LABEL: @illegaltype( ; CHECK-NOT: @switch.table ; CHECK: switch i32 %c } diff --git a/test/Transforms/SimplifyCFG/attr-noduplicate.ll b/test/Transforms/SimplifyCFG/attr-noduplicate.ll new file mode 100644 index 000000000000..523aa51bb84e --- /dev/null +++ b/test/Transforms/SimplifyCFG/attr-noduplicate.ll @@ -0,0 +1,37 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s + +; This test checks that the SimplifyCFG pass won't duplicate a call to a +; function marked noduplicate. +; +; CHECK-LABEL: @noduplicate +; CHECK: call void @barrier +; CHECK-NOT: call void @barrier +define void @noduplicate(i32 %cond, i32* %out) { +entry: + %out1 = getelementptr i32* %out, i32 1 + %out2 = getelementptr i32* %out, i32 2 + %cmp = icmp eq i32 %cond, 0 + br i1 %cmp, label %if.then, label %if.end + +if.then: + store i32 5, i32* %out + br label %if.end + +if.end: + call void @barrier() #0 + br i1 %cmp, label %cond.end, label %cond.false + +cond.false: + store i32 5, i32* %out1 + br label %cond.end + +cond.end: + %value = phi i32 [ 1, %cond.false ], [ 0, %if.end ] + store i32 %value, i32* %out2 + ret void +} + +; Function Attrs: noduplicate nounwind +declare void @barrier() #0 + +attributes #0 = { noduplicate nounwind } diff --git a/test/Transforms/SimplifyCFG/basictest.ll b/test/Transforms/SimplifyCFG/basictest.ll index 052e10667da5..9c4edd68b800 100644 --- a/test/Transforms/SimplifyCFG/basictest.ll +++ b/test/Transforms/SimplifyCFG/basictest.ll @@ -5,14 +5,14 @@ define void @test1() { br label %1 ret void -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK-NEXT: ret void } define void @test2() { ret void ret void -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK-NEXT: ret void ; CHECK-NEXT: } } @@ -20,7 +20,7 @@ define void @test2() { define void @test3(i1 %T) { br i1 %T, label %1, label %1 ret void -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK-NEXT: ret void } @@ -38,6 +38,6 @@ define void @test5(i32 %A) { return: ; preds = %entry ret void -; CHECK: @test5 +; CHECK-LABEL: @test5( ; CHECK-NEXT: ret void } diff --git a/test/Transforms/SimplifyCFG/branch-fold-dbg.ll b/test/Transforms/SimplifyCFG/branch-fold-dbg.ll index 0526883fe8f4..9d8086c29769 100644 --- a/test/Transforms/SimplifyCFG/branch-fold-dbg.ll +++ b/test/Transforms/SimplifyCFG/branch-fold-dbg.ll @@ -41,18 +41,19 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.sp = !{!0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 231, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (i32)* @foo, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"a.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"a.i", metadata !"/private/tmp", metadata !"clang (trunk 129006)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 589870, metadata !15, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 231, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 231] [def] [scope 0] [foo] +!1 = metadata !{i32 589865, metadata !15} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 589841, metadata !15, i32 12, metadata !"clang (trunk 129006)", i1 true, metadata !"", i32 0, metadata !4, metadata !4, null, null, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 589845, metadata !15, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{null} !5 = metadata !{i32 131, i32 2, metadata !0, null} !6 = metadata !{i32 134, i32 2, metadata !0, null} !7 = metadata !{i32 590080, metadata !8, metadata !"bar", metadata !1, i32 232, metadata !9, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 231, i32 1, metadata !1, i32 3} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] -!10 = metadata !{i32 589862, metadata !2, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_const_type ] -!11 = metadata !{i32 589860, metadata !2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 589835, metadata !15, metadata !0, i32 231, i32 1, i32 3} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 589839, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] +!10 = metadata !{i32 589862, null, metadata !2, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_const_type ] +!11 = metadata !{i32 589860, null, metadata !2, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !12 = metadata !{i32 232, i32 40, metadata !8, null} !13 = metadata !{i32 234, i32 2, metadata !8, null} !14 = metadata !{i32 274, i32 1, metadata !8, null} +!15 = metadata !{metadata !"a.c", metadata !"/private/tmp"} diff --git a/test/Transforms/SimplifyCFG/common-dest-folding.ll b/test/Transforms/SimplifyCFG/common-dest-folding.ll new file mode 100644 index 000000000000..0aa3b2c560a5 --- /dev/null +++ b/test/Transforms/SimplifyCFG/common-dest-folding.ll @@ -0,0 +1,57 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s + +;CHECK: @foo +;CHECK: and i32 %c1, %k +;CHECK: icmp eq i32 +;CHECK: and i32 %c2, %k +;CHECK: icmp eq i32 +;CHECK: or i1 +;CHECK: ret +define i32 @foo(i32 %k, i32 %c1, i32 %c2) { + %1 = and i32 %c1, %k + %2 = icmp eq i32 %1, 0 + br i1 %2, label %8, label %3 + +; <label>:3 ; preds = %0 + %4 = and i32 %c2, %k + %5 = icmp eq i32 %4, 0 + br i1 %5, label %8, label %6 + +; <label>:6 ; preds = %3 + %7 = tail call i32 (...)* @bar() nounwind + br label %8 + +; <label>:8 ; preds = %3, %0, %6 + ret i32 undef +} + +;CHECK: @conduse +;CHECK: shl i32 1, %c1 +;CHECK-NEXT: shl i32 1, %c2 +;CHECK-NEXT: and i32 +;CHECK-NEXT: icmp eq i32 +;CHECK-NEXT: and i32 +;CHECK-NEXT: icmp eq i32 +;CHECK: ret +define i32 @conduse(i32 %k, i32 %c1, i32 %c2) #0 { +bb: + %tmp = shl i32 1, %c1 + %tmp4 = shl i32 1, %c2 + %tmp1 = and i32 %tmp, %k + %tmp2 = icmp eq i32 %tmp1, 0 + br i1 %tmp2, label %bb9, label %bb3 + +bb3: ; preds = %bb + %tmp5 = and i32 %tmp4, %k + %tmp6 = icmp eq i32 %tmp5, 0 + br i1 %tmp6, label %bb9, label %bb7 + +bb7: ; preds = %bb3 + %tmp8 = tail call i32 (...)* @bar() #1 + br label %bb9 + +bb9: ; preds = %bb7, %bb3, %bb + ret i32 undef +} + +declare i32 @bar(...) diff --git a/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll b/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll index 3996efd82b5f..036a615e7ff0 100644 --- a/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll +++ b/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll @@ -2,7 +2,7 @@ define void @test_br(i32 %x) { entry: -; CHECK: @test_br +; CHECK-LABEL: @test_br( ; CHECK-NEXT: entry: ; CHECK-NEXT: ret void %cmp = icmp eq i32 %x, 10 @@ -17,7 +17,7 @@ if.end: ; preds = %if.else, %if.then define void @test_switch(i32 %x) nounwind { entry: -; CHECK: @test_switch +; CHECK-LABEL: @test_switch( ; CHECK-NEXT: entry: ; CHECK-NEXT: ret void %rem = srem i32 %x, 3 @@ -35,7 +35,7 @@ sw.epilog: ; preds = %sw.bb define void @test_indirectbr(i32 %x) { entry: -; CHECK: @test_indirectbr +; CHECK-LABEL: @test_indirectbr( ; CHECK-NEXT: entry: ; Ideally this should now check: ; CHK-NEXT: ret void diff --git a/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll b/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll index 03053f037d0a..0547fa972017 100644 --- a/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll +++ b/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll @@ -29,25 +29,28 @@ declare i32 @bar(...) declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone +!llvm.module.flags = !{!21} !llvm.dbg.sp = !{!0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32)* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"b.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"b.c", metadata !"/private/tmp", metadata !"clang", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 589870, metadata !20, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 2] [def] [scope 0] [foo] +!1 = metadata !{i32 589865, metadata !20} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 589841, metadata !20, i32 12, metadata !"clang", i1 true, metadata !"", i32 0, metadata !8, metadata !8, null, null, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 589845, metadata !20, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!5 = metadata !{i32 589860, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !6 = metadata !{i32 590081, metadata !0, metadata !"i", metadata !1, i32 16777218, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] !7 = metadata !{i32 2, i32 13, metadata !0, null} !8 = metadata !{i32 0} !9 = metadata !{i32 590080, metadata !10, metadata !"k", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!10 = metadata !{i32 589835, metadata !0, i32 2, i32 16, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 589835, metadata !20, metadata !0, i32 2, i32 16, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 3, i32 12, metadata !10, null} !12 = metadata !{i32 4, i32 3, metadata !10, null} !13 = metadata !{i32 5, i32 5, metadata !14, null} -!14 = metadata !{i32 589835, metadata !10, i32 4, i32 10, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!14 = metadata !{i32 589835, metadata !20, metadata !10, i32 4, i32 10, i32 1} ; [ DW_TAG_lexical_block ] !15 = metadata !{i32 6, i32 3, metadata !14, null} !16 = metadata !{i32 7, i32 5, metadata !17, null} -!17 = metadata !{i32 589835, metadata !10, i32 6, i32 10, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] +!17 = metadata !{i32 589835, metadata !20, metadata !10, i32 6, i32 10, i32 2} ; [ DW_TAG_lexical_block ] !18 = metadata !{i32 8, i32 3, metadata !17, null} !19 = metadata !{i32 9, i32 3, metadata !10, null} +!20 = metadata !{metadata !"b.c", metadata !"/private/tmp"} +!21 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/Transforms/SimplifyCFG/indirectbr.ll b/test/Transforms/SimplifyCFG/indirectbr.ll index 7853e9abd2ea..d0020d001b03 100644 --- a/test/Transforms/SimplifyCFG/indirectbr.ll +++ b/test/Transforms/SimplifyCFG/indirectbr.ll @@ -77,7 +77,7 @@ BB0: ; SimplifyCFG should turn the indirectbr into a conditional branch on the ; condition of the select. -; CHECK: @indbrtest3 +; CHECK-LABEL: @indbrtest3( ; CHECK-NEXT: entry: ; CHECK-NEXT: br i1 %cond, label %L1, label %L2 ; CHECK-NOT: indirectbr @@ -104,7 +104,7 @@ L3: ; As in @indbrtest1, it should really remove the branch entirely, but it doesn't ; because it's in the entry block. -; CHECK: @indbrtest4 +; CHECK-LABEL: @indbrtest4( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label %L1 define void @indbrtest4(i1 %cond) nounwind { @@ -126,7 +126,7 @@ L3: ; SimplifyCFG should turn the indirectbr into an unreachable because neither ; destination is listed as a successor. -; CHECK: @indbrtest5 +; CHECK-LABEL: @indbrtest5( ; CHECK-NEXT: entry: ; CHECK-NEXT: unreachable ; CHECK-NEXT: } @@ -156,7 +156,7 @@ L4: ; The same as above, except the selected addresses are equal. -; CHECK: @indbrtest6 +; CHECK-LABEL: @indbrtest6( ; CHECK-NEXT: entry: ; CHECK-NEXT: unreachable ; CHECK-NEXT: } diff --git a/test/Transforms/SimplifyCFG/invoke.ll b/test/Transforms/SimplifyCFG/invoke.ll index 10dc41b44bc7..5f513ac3e6de 100644 --- a/test/Transforms/SimplifyCFG/invoke.ll +++ b/test/Transforms/SimplifyCFG/invoke.ll @@ -9,7 +9,7 @@ declare i32 @nounwind_fn() nounwind declare i32 @fn() -; CHECK: @f1 +; CHECK-LABEL: @f1( define i8* @f1() nounwind uwtable ssp { entry: ; CHECK: call void @llvm.trap() @@ -28,7 +28,7 @@ lpad: unreachable } -; CHECK: @f2 +; CHECK-LABEL: @f2( define i8* @f2() nounwind uwtable ssp { entry: ; CHECK: call void @llvm.trap() @@ -47,7 +47,7 @@ lpad: unreachable } -; CHECK: @f3 +; CHECK-LABEL: @f3( define i32 @f3() nounwind uwtable ssp { ; CHECK-NEXT: entry entry: @@ -66,7 +66,7 @@ lpad: unreachable } -; CHECK: @f4 +; CHECK-LABEL: @f4( define i32 @f4() nounwind uwtable ssp { ; CHECK-NEXT: entry entry: @@ -86,7 +86,7 @@ lpad: unreachable } -; CHECK: @f5 +; CHECK-LABEL: @f5( define i32 @f5(i1 %cond, i8* %a, i8* %b) { entry: br i1 %cond, label %x, label %y @@ -117,7 +117,7 @@ lpad: unreachable } -; CHECK: @f6 +; CHECK-LABEL: @f6( define void @f6() { entry: invoke void @purefn() diff --git a/test/Transforms/SimplifyCFG/invoke_unwind.ll b/test/Transforms/SimplifyCFG/invoke_unwind.ll index ed7ff8287f20..435bed0c2957 100644 --- a/test/Transforms/SimplifyCFG/invoke_unwind.ll +++ b/test/Transforms/SimplifyCFG/invoke_unwind.ll @@ -5,7 +5,7 @@ declare void @bar() ; This testcase checks to see if the simplifycfg pass is converting invoke ; instructions to call instructions if the handler just rethrows the exception. define i32 @test1() { -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK-NEXT: call void @bar() ; CHECK-NEXT: ret i32 0 invoke void @bar( ) diff --git a/test/Transforms/SimplifyCFG/lit.local.cfg b/test/Transforms/SimplifyCFG/lit.local.cfg deleted file mode 100644 index 19eebc0ac7ac..000000000000 --- a/test/Transforms/SimplifyCFG/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.ll', '.c', '.cpp'] diff --git a/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll b/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll index 028fb0745631..f34aec525df8 100644 --- a/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll +++ b/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll @@ -24,7 +24,7 @@ if.end7: ; preds = %if.else, %if.then4, %tmp9 = load i32* %x.0 ret i32 %tmp9 -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: if.else: ; CHECK: br label %if.end7 @@ -52,7 +52,7 @@ if.end7: ; preds = %if.else, %if.then4, %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] %tmp9 = load i32* %x.0 ret i32 %tmp9 -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: if.else: ; CHECK: unreachable @@ -81,7 +81,7 @@ if.end7: ; preds = %if.else, %if.then4, tail call void @bar() nounwind %tmp9 = load i32* %x.0 ret i32 %tmp9 -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK: if.end7: ; CHECK: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] } @@ -110,6 +110,6 @@ if.end7: ; preds = %if.else, %if.then4, %tmp10 = or i32 %tmp9, 1 store i32 %tmp10, i32* %gep ret i32 %tmp9 -; CHECK: @test4 +; CHECK-LABEL: @test4( ; CHECK-NOT: phi } diff --git a/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll b/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll index 53d5448372da..8cc07e39a180 100644 --- a/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll +++ b/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll @@ -13,7 +13,7 @@ declare void @foo() nounwind uwtable define void @func(i32 %A) nounwind uwtable { -; CHECK: define void @func +; CHECK-LABEL: define void @func( entry: %cmp11 = icmp eq i32 %A, 1 br i1 %cmp11, label %if.then, label %if.else, !prof !0 diff --git a/test/Transforms/SimplifyCFG/preserve-branchweights.ll b/test/Transforms/SimplifyCFG/preserve-branchweights.ll index beef52700820..4022ed6927ee 100644 --- a/test/Transforms/SimplifyCFG/preserve-branchweights.ll +++ b/test/Transforms/SimplifyCFG/preserve-branchweights.ll @@ -3,7 +3,7 @@ declare void @helper(i32) define void @test1(i1 %a, i1 %b) { -; CHECK: @test1 +; CHECK-LABEL: @test1( entry: br i1 %a, label %Y, label %X, !prof !0 ; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !0 @@ -22,7 +22,7 @@ Z: } define void @test2(i1 %a, i1 %b) { -; CHECK: @test2 +; CHECK-LABEL: @test2( entry: br i1 %a, label %X, label %Y, !prof !1 ; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1 @@ -42,7 +42,7 @@ Z: } define void @test3(i1 %a, i1 %b) { -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK-NOT: !prof entry: br i1 %a, label %X, label %Y, !prof !1 @@ -61,7 +61,7 @@ Z: } define void @test4(i1 %a, i1 %b) { -; CHECK: @test4 +; CHECK-LABEL: @test4( ; CHECK-NOT: !prof entry: br i1 %a, label %X, label %Y @@ -156,7 +156,7 @@ sw.epilog: ;; This test is based on test1 but swapped the targets of the second branch. define void @test1_swap(i1 %a, i1 %b) { -; CHECK: @test1_swap +; CHECK-LABEL: @test1_swap( entry: br i1 %a, label %Y, label %X, !prof !0 ; CHECK: br i1 %or.cond, label %Y, label %Z, !prof !4 @@ -175,7 +175,7 @@ Z: } define void @test7(i1 %a, i1 %b) { -; CHECK: @test7 +; CHECK-LABEL: @test7( entry: %c = or i1 %b, false br i1 %a, label %Y, label %X, !prof !0 @@ -195,7 +195,7 @@ Z: ; Test basic folding to a conditional branch. define void @test8(i64 %x, i64 %y) nounwind { -; CHECK: @test8 +; CHECK-LABEL: @test8( entry: %lt = icmp slt i64 %x, %y ; CHECK: br i1 %lt, label %a, label %b, !prof !6 @@ -219,7 +219,7 @@ bees: ; Test edge splitting when the default target has icmp and unconditinal ; branch define i1 @test9(i32 %x, i32 %y) nounwind { -; CHECK: @test9 +; CHECK-LABEL: @test9( entry: switch i32 %x, label %bees [ i32 0, label %a diff --git a/test/Transforms/SimplifyCFG/select-gep.ll b/test/Transforms/SimplifyCFG/select-gep.ll index 3e2a6237b275..96c214cbc81e 100644 --- a/test/Transforms/SimplifyCFG/select-gep.ll +++ b/test/Transforms/SimplifyCFG/select-gep.ll @@ -14,7 +14,7 @@ if.end: %x.addr = phi i8* [ %incdec.ptr, %if.then ], [ %x, %entry ] ret i8* %x.addr -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK-NOT: select ; CHECK: ret i8* %x.addr } @@ -34,7 +34,7 @@ if.end: %x.addr = phi i8* [ %incdec.ptr, %if.then ], [ %y, %entry ] ret i8* %x.addr -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: %incdec.ptr.y = select i1 %cmp, i8* %incdec.ptr, i8* %y ; CHECK: ret i8* %incdec.ptr.y } diff --git a/test/Transforms/SimplifyCFG/speculate-store.ll b/test/Transforms/SimplifyCFG/speculate-store.ll index 8d7fe79dcd4e..e241901a8789 100644 --- a/test/Transforms/SimplifyCFG/speculate-store.ll +++ b/test/Transforms/SimplifyCFG/speculate-store.ll @@ -17,7 +17,7 @@ entry: ; Make sure we speculate stores like the following one. It is cheap compared to ; a mispredicated branch. -; CHECK: @ifconvertstore +; CHECK-LABEL: @ifconvertstore( ; CHECK: %add5.add = select i1 %cmp6, i32 %add5, i32 %add ; CHECK: store i32 %add5.add, i32* %arrayidx2, align 4 if.then: @@ -43,7 +43,7 @@ entry: %cmp6 = icmp sgt i32 %add5, %C br i1 %cmp6, label %if.then, label %ret.end -; CHECK: @noifconvertstore1 +; CHECK-LABEL: @noifconvertstore1( ; CHECK-NOT: select if.then: store i32 %add5, i32* %arrayidx2, align 4 @@ -71,7 +71,7 @@ entry: %cmp6 = icmp sgt i32 %add5, %C br i1 %cmp6, label %if.then, label %ret.end -; CHECK: @noifconvertstore2 +; CHECK-LABEL: @noifconvertstore2( ; CHECK-NOT: select if.then: store i32 %add5, i32* %arrayidx2, align 4 @@ -97,7 +97,7 @@ entry: br i1 %cmp6, label %if.then, label %ret.end ; Make sure we don't speculate volatile stores. -; CHECK: @noifconvertstore_volatile +; CHECK-LABEL: @noifconvertstore_volatile( ; CHECK-NOT: select if.then: store volatile i32 %add5, i32* %arrayidx2, align 4 diff --git a/test/Transforms/SimplifyCFG/speculate-with-offset.ll b/test/Transforms/SimplifyCFG/speculate-with-offset.ll index a737d5602e84..64fed85c795c 100644 --- a/test/Transforms/SimplifyCFG/speculate-with-offset.ll +++ b/test/Transforms/SimplifyCFG/speculate-with-offset.ll @@ -3,7 +3,7 @@ ; This load is safe to speculate, as it's from a safe offset ; within an alloca. -; CHECK: @yes +; CHECK-LABEL: @yes( ; CHECK-NOT: br define void @yes(i1 %c) nounwind { @@ -25,7 +25,7 @@ return: ; preds = %if.end, %if.then ret void } -; CHECK: @no0 +; CHECK-LABEL: @no0( ; CHECK: br i1 %c define void @no0(i1 %c) nounwind { @@ -47,7 +47,7 @@ return: ; preds = %if.end, %if.then ret void } -; CHECK: @no1 +; CHECK-LABEL: @no1( ; CHECK: br i1 %c define void @no1(i1 %c, i64 %n) nounwind { @@ -69,7 +69,7 @@ return: ; preds = %if.end, %if.then ret void } -; CHECK: @no2 +; CHECK-LABEL: @no2( ; CHECK: br i1 %c define void @no2(i1 %c, i64 %n) nounwind { diff --git a/test/Transforms/SimplifyCFG/switch-masked-bits.ll b/test/Transforms/SimplifyCFG/switch-masked-bits.ll index 3b0c48be6e2d..692973c362bf 100644 --- a/test/Transforms/SimplifyCFG/switch-masked-bits.ll +++ b/test/Transforms/SimplifyCFG/switch-masked-bits.ll @@ -13,7 +13,7 @@ b: ret i32 3 c: ret i32 5 -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: %cond = icmp eq i32 %i, 24 ; CHECK: %. = select i1 %cond, i32 5, i32 0 ; CHECK: ret i32 %. @@ -33,6 +33,6 @@ b: ret i32 3 c: ret i32 5 -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: ret i32 0 } diff --git a/test/Transforms/SimplifyCFG/switch-on-const-select.ll b/test/Transforms/SimplifyCFG/switch-on-const-select.ll index 9cd709ff8ecf..dec5f80ab98b 100644 --- a/test/Transforms/SimplifyCFG/switch-on-const-select.ll +++ b/test/Transforms/SimplifyCFG/switch-on-const-select.ll @@ -2,7 +2,7 @@ ; Test basic folding to a conditional branch. define i32 @foo(i64 %x, i64 %y) nounwind { -; CHECK: @foo +; CHECK-LABEL: @foo( entry: %eq = icmp eq i64 %x, %y br i1 %eq, label %b, label %switch @@ -32,7 +32,7 @@ bees: ; Test basic folding to an unconditional branch. define i32 @bar(i64 %x, i64 %y) nounwind { -; CHECK: @bar +; CHECK-LABEL: @bar( entry: ; CHECK-NEXT: entry: ; CHECK-NEXT: tail call void @bees.a() [[NUW:#[0-9]+]] @@ -58,7 +58,7 @@ bees: ; Test the edge case where both values from the select are the default case. define void @bazz(i64 %x, i64 %y) nounwind { -; CHECK: @bazz +; CHECK-LABEL: @bazz( entry: ; CHECK-NEXT: entry: ; CHECK-NEXT: tail call void @bees.b() [[NUW]] @@ -83,7 +83,7 @@ bees: ; Test the edge case where both values from the select are equal. define void @quux(i64 %x, i64 %y) nounwind { -; CHECK: @quux +; CHECK-LABEL: @quux( entry: ; CHECK-NEXT: entry: ; CHECK-NEXT: tail call void @bees.a() [[NUW]] @@ -108,7 +108,7 @@ bees: ; A final test, for phi node munging. define i32 @xyzzy(i64 %x, i64 %y) { -; CHECK: @xyzzy +; CHECK-LABEL: @xyzzy( entry: %eq = icmp eq i64 %x, %y br i1 %eq, label %r, label %cont diff --git a/test/Transforms/SimplifyCFG/switch-to-icmp.ll b/test/Transforms/SimplifyCFG/switch-to-icmp.ll index e9a6db45cb00..bfacf25ca7f7 100644 --- a/test/Transforms/SimplifyCFG/switch-to-icmp.ll +++ b/test/Transforms/SimplifyCFG/switch-to-icmp.ll @@ -15,7 +15,7 @@ lor.end: %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ], [ true, %entry ] ret i1 %0 -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: %x.off = add i32 %x, -1 ; CHECK: %switch = icmp ult i32 %x.off, 3 } @@ -34,7 +34,7 @@ lor.end: %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ] ret i1 %0 -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: %switch = icmp ult i32 %x, 2 } @@ -51,7 +51,7 @@ good: bad: ret i32 1 -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK: entry: ; CHECK-NEXT: ret i32 0 } diff --git a/test/Transforms/SimplifyCFG/switch_create.ll b/test/Transforms/SimplifyCFG/switch_create.ll index 546cc75f2973..e1e91570300c 100644 --- a/test/Transforms/SimplifyCFG/switch_create.ll +++ b/test/Transforms/SimplifyCFG/switch_create.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s +; RUN: opt -S -simplifycfg < %s | FileCheck -check-prefix=CHECK %s +; RUN: opt -S -default-data-layout="p:32:32-p1:16:16" -simplifycfg < %s | FileCheck -check-prefix=CHECK -check-prefix=DL %s declare void @foo1() @@ -15,13 +16,51 @@ T: ; preds = %0 F: ; preds = %0 call void @foo2( ) ret void -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: switch i32 %V, label %F [ ; CHECK: i32 17, label %T ; CHECK: i32 4, label %T ; CHECK: ] } +define void @test1_ptr(i32* %V) { + %C1 = icmp eq i32* %V, inttoptr (i32 4 to i32*) + %C2 = icmp eq i32* %V, inttoptr (i32 17 to i32*) + %CN = or i1 %C1, %C2 ; <i1> [#uses=1] + br i1 %CN, label %T, label %F +T: ; preds = %0 + call void @foo1( ) + ret void +F: ; preds = %0 + call void @foo2( ) + ret void +; CHECK-LABEL: @test1_ptr( +; DL: %magicptr = ptrtoint i32* %V to i32 +; DL: switch i32 %magicptr, label %F [ +; DL: i32 17, label %T +; DL: i32 4, label %T +; DL: ] +} + +define void @test1_ptr_as1(i32 addrspace(1)* %V) { + %C1 = icmp eq i32 addrspace(1)* %V, inttoptr (i32 4 to i32 addrspace(1)*) + %C2 = icmp eq i32 addrspace(1)* %V, inttoptr (i32 17 to i32 addrspace(1)*) + %CN = or i1 %C1, %C2 ; <i1> [#uses=1] + br i1 %CN, label %T, label %F +T: ; preds = %0 + call void @foo1( ) + ret void +F: ; preds = %0 + call void @foo2( ) + ret void +; CHECK-LABEL: @test1_ptr_as1( +; DL: %magicptr = ptrtoint i32 addrspace(1)* %V to i16 +; DL: switch i16 %magicptr, label %F [ +; DL: i16 17, label %T +; DL: i16 4, label %T +; DL: ] +} + define void @test2(i32 %V) { %C1 = icmp ne i32 %V, 4 ; <i1> [#uses=1] %C2 = icmp ne i32 %V, 17 ; <i1> [#uses=1] @@ -33,7 +72,7 @@ T: ; preds = %0 F: ; preds = %0 call void @foo2( ) ret void -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: switch i32 %V, label %T [ ; CHECK: i32 17, label %F ; CHECK: i32 4, label %F @@ -53,7 +92,7 @@ F: ; preds = %N call void @foo2( ) ret void -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK: switch i32 %V, label %F [ ; CHECK: i32 4, label %T ; CHECK: i32 17, label %T @@ -79,8 +118,8 @@ lor.end: ; preds = %lor.rhs, %lor.lhs.f %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp8, %lor.rhs ] %lor.ext = zext i1 %0 to i32 ret i32 %lor.ext - -; CHECK: @test4 + +; CHECK-LABEL: @test4( ; CHECK: switch i8 %c, label %lor.rhs [ ; CHECK: i8 62, label %lor.end ; CHECK: i8 34, label %lor.end @@ -104,7 +143,7 @@ lor.end: ; preds = %entry, %entry, %ent %0 = phi i1 [ true, %entry ], [ %V, %lor.rhs ], [ true, %entry ], [ true, %entry ] %lor.ext = zext i1 %0 to i32 ret i32 %lor.ext -; CHECK: @test5 +; CHECK-LABEL: @test5( ; CHECK: switch i8 %c, label %lor.rhs [ ; CHECK: i8 62, label %lor.end ; CHECK: i8 34, label %lor.end @@ -139,8 +178,8 @@ shortcirc_done.4: ; preds = %shortcirc_next.3, %shortcirc_next.2, UnifiedReturnBlock: ; preds = %shortcirc_done.4, %shortcirc_next.4 %UnifiedRetVal = phi i1 [ %tmp.26, %shortcirc_next.4 ], [ true, %shortcirc_done.4 ] ; <i1> [#uses=1] ret i1 %UnifiedRetVal - -; CHECK: @test6 + +; CHECK-LABEL: @test6( ; CHECK: %tmp.2.i.off = add i32 %tmp.2.i, -14 ; CHECK: %switch = icmp ult i32 %tmp.2.i.off, 6 } @@ -160,8 +199,8 @@ if.then: ; preds = %entry if.end: ; preds = %entry ret void - -; CHECK: @test7 + +; CHECK-LABEL: @test7( ; CHECK: %cmp = icmp ult i32 %x, 32 ; CHECK: br i1 %cmp, label %if.then, label %switch.early.test ; CHECK: switch.early.test: @@ -189,8 +228,8 @@ if.then: ; preds = %entry if.end: ; preds = %entry ret i32 0 - -; CHECK: @test8 + +; CHECK-LABEL: @test8( ; CHECK: switch.early.test: ; CHECK: switch i8 %c, label %if.end [ ; CHECK: i8 99, label %if.then @@ -245,8 +284,8 @@ lor.end: ; preds = %lor.rhs, %lor.lhs.f %0 = phi i1 [ true, %lor.lhs.false36 ], [ true, %lor.lhs.false31 ], [ true, %lor.lhs.false26 ], [ true, %lor.lhs.false21 ], [ true, %lor.lhs.false16 ], [ true, %lor.lhs.false11 ], [ true, %lor.lhs.false6 ], [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp43, %lor.rhs ] %conv46 = zext i1 %0 to i32 ret i32 %conv46 - -; CHECK: @test9 + +; CHECK-LABEL: @test9( ; CHECK: %cmp = icmp ult i8 %c, 33 ; CHECK: br i1 %cmp, label %lor.end, label %switch.early.test @@ -275,7 +314,7 @@ T: F: ret i32 324 -; CHECK: @test10 +; CHECK-LABEL: @test10( ; CHECK: br i1 %Cond, label %switch.early.test, label %F ; CHECK:switch.early.test: ; CHECK: switch i32 %mode, label %T [ @@ -314,7 +353,7 @@ return: ; preds = %if.end, %if.then %retval.0 = phi i32 [ 1, %if.then ], [ 0, %if.end ] ret i32 %retval.0 -; CHECK: @test11 +; CHECK-LABEL: @test11( ; CHECK: switch i32 %bar, label %if.end [ ; CHECK: i32 55, label %return ; CHECK: i32 53, label %return @@ -343,7 +382,7 @@ bb55.us.us: malformed: ret void -; CHECK: @test12 +; CHECK-LABEL: @test12( } @@ -371,7 +410,7 @@ if.then: ; preds = %lor.lhs.false9, %lo if.end: ; preds = %if.then, %lor.lhs.false9 ret void -; CHECK: @test13 +; CHECK-LABEL: @test13( ; CHECK: switch i32 %x, label %if.end [ ; CHECK: i32 6, label %if.then ; CHECK: i32 4, label %if.then @@ -405,7 +444,7 @@ if.then: ; preds = %lor.lhs.false9, %lo if.end: ; preds = %if.then, %lor.lhs.false9 ret void -; CHECK: @test14 +; CHECK-LABEL: @test14( ; CHECK: switch i32 %x, label %if.end [ ; CHECK: i32 6, label %if.then ; CHECK: i32 4, label %if.then @@ -431,7 +470,7 @@ if.then: if.end: ret void -; CHECK: @test15 +; CHECK-LABEL: @test15( ; CHECK-NOT: switch ; CHECK: ret void } @@ -440,7 +479,7 @@ if.end: ; rdar://5134905 define zeroext i1 @test16(i32 %x) nounwind { entry: -; CHECK: @test16 +; CHECK-LABEL: @test16( ; CHECK: %x.off = add i32 %x, -1 ; CHECK: %switch = icmp ult i32 %x.off, 3 %cmp.i = icmp eq i32 %x, 1 @@ -473,9 +512,45 @@ lor.lhs.false8: return: ret void -; CHECK: @test17 +; CHECK-LABEL: @test17( ; CHECK-NOT: switch.early.test ; CHECK-NOT: switch i32 ; CHECK: ret void } +define void @test18(i32 %arg) { +bb: + %tmp = and i32 %arg, -2 + %tmp1 = icmp eq i32 %tmp, 8 + %tmp2 = icmp eq i32 %arg, 10 + %tmp3 = or i1 %tmp1, %tmp2 + %tmp4 = icmp eq i32 %arg, 11 + %tmp5 = or i1 %tmp3, %tmp4 + %tmp6 = icmp eq i32 %arg, 12 + %tmp7 = or i1 %tmp5, %tmp6 + br i1 %tmp7, label %bb19, label %bb8 + +bb8: ; preds = %bb + %tmp9 = add i32 %arg, -13 + %tmp10 = icmp ult i32 %tmp9, 2 + %tmp11 = icmp eq i32 %arg, 16 + %tmp12 = or i1 %tmp10, %tmp11 + %tmp13 = icmp eq i32 %arg, 17 + %tmp14 = or i1 %tmp12, %tmp13 + %tmp15 = icmp eq i32 %arg, 18 + %tmp16 = or i1 %tmp14, %tmp15 + %tmp17 = icmp eq i32 %arg, 15 + %tmp18 = or i1 %tmp16, %tmp17 + br i1 %tmp18, label %bb19, label %bb20 + +bb19: ; preds = %bb8, %bb + tail call void @foo1() + br label %bb20 + +bb20: ; preds = %bb19, %bb8 + ret void + +; CHECK-LABEL: @test18( +; CHECK: %arg.off = add i32 %arg, -8 +; CHECK: icmp ult i32 %arg.off, 11 +} diff --git a/test/Transforms/SimplifyCFG/trap-debugloc.ll b/test/Transforms/SimplifyCFG/trap-debugloc.ll index 24540e5217b9..3b449cb000ab 100644 --- a/test/Transforms/SimplifyCFG/trap-debugloc.ll +++ b/test/Transforms/SimplifyCFG/trap-debugloc.ll @@ -7,13 +7,18 @@ define void @foo() nounwind ssp { ret void, !dbg !7 } +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!10} !llvm.dbg.sp = !{!0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, void ()* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"foo.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"foo.c", metadata !"/private/tmp", metadata !"Apple clang version 3.0 (tags/Apple/clang-206.1) (based on LLVM 3.0svn)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 589870, metadata !8, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void ()* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 0] [foo] +!1 = metadata !{i32 589865, metadata !8} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 589841, metadata !8, i32 12, metadata !"Apple clang version 3.0 (tags/Apple/clang-206.1) (based on LLVM 3.0svn)", i1 true, metadata !"", i32 0, metadata !4, metadata !4, metadata !9, null, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 589845, metadata !8, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{null} !5 = metadata !{i32 4, i32 2, metadata !6, null} -!6 = metadata !{i32 589835, metadata !0, i32 3, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!6 = metadata !{i32 589835, metadata !8, metadata !0, i32 3, i32 12, i32 0} ; [ DW_TAG_lexical_block ] !7 = metadata !{i32 5, i32 1, metadata !6, null} +!8 = metadata !{metadata !"foo.c", metadata !"/private/tmp"} +!9 = metadata !{metadata !0} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll b/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll index 10d6981af0e6..e9d93e834a50 100644 --- a/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll +++ b/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll @@ -17,7 +17,7 @@ bb: ; preds = %entry br label %return return: ; preds = %entry ret void -; CHECK: @test1 +; CHECK-LABEL: @test1( ; CHECK: load volatile } @@ -27,7 +27,7 @@ entry: store i32 4,i32* null ret void -; CHECK: @test2 +; CHECK-LABEL: @test2( ; CHECK: call void @llvm.trap ; CHECK: unreachable } @@ -38,14 +38,14 @@ entry: store volatile i32 4, i32* null ret void -; CHECK: @test3 +; CHECK-LABEL: @test3( ; CHECK: store volatile i32 4, i32* null ; CHECK: ret } ; Check store before unreachable. define void @test4(i1 %C, i32* %P) { -; CHECK: @test4 +; CHECK-LABEL: @test4( ; CHECK: entry: ; CHECK-NEXT: br i1 %C entry: @@ -59,7 +59,7 @@ F: ; Check cmpxchg before unreachable. define void @test5(i1 %C, i32* %P) { -; CHECK: @test5 +; CHECK-LABEL: @test5( ; CHECK: entry: ; CHECK-NEXT: br i1 %C entry: @@ -73,7 +73,7 @@ F: ; Check atomicrmw before unreachable. define void @test6(i1 %C, i32* %P) { -; CHECK: @test6 +; CHECK-LABEL: @test6( ; CHECK: entry: ; CHECK-NEXT: br i1 %C entry: diff --git a/test/Transforms/SimplifyCFG/volatile-phioper.ll b/test/Transforms/SimplifyCFG/volatile-phioper.ll index 164898897eff..1ef3a7ce59b3 100644 --- a/test/Transforms/SimplifyCFG/volatile-phioper.ll +++ b/test/Transforms/SimplifyCFG/volatile-phioper.ll @@ -7,7 +7,7 @@ ; it can no longer use language standard as an excuse. The compiler ; needs to expose the volatile access to the platform. ; -; CHECK: @test +; CHECK-LABEL: @test( ; CHECK: entry: ; CHECK: @Trace ; CHECK: while.body: @@ -41,8 +41,8 @@ end: } declare i32 @Trace(...) #1 -attributes #0 = { nounwind ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } -attributes #1 = { "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } +attributes #0 = { nounwind ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "relocation-model"="pic" "ssp-buffers-size"="8" } +attributes #1 = { "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "relocation-model"="pic" "ssp-buffers-size"="8" } attributes #2 = { nounwind } !0 = metadata !{i32 1039} |
