diff options
Diffstat (limited to 'llvm/test/Transforms/SimplifyCFG')
194 files changed, 0 insertions, 19057 deletions
diff --git a/llvm/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll b/llvm/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll deleted file mode 100644 index 055386b3475..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll +++ /dev/null @@ -1,19 +0,0 @@ -; CFG Simplification is making a loop dead, then changing the add into: -; -; %V1 = add int %V1, 1 -; -; Which is not valid SSA -; -; RUN: opt < %s -simplifycfg | llvm-dis - -define void @test() { -; <label>:0 - br i1 true, label %end, label %Loop -Loop: ; preds = %Loop, %0 - %V = phi i32 [ 0, %0 ], [ %V1, %Loop ] ; <i32> [#uses=1] - %V1 = add i32 %V, 1 ; <i32> [#uses=1] - br label %Loop -end: ; preds = %0 - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll b/llvm/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll deleted file mode 100644 index 9a1206221fb..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll +++ /dev/null @@ -1,13 +0,0 @@ -; RUN: opt < %s -simplifycfg - -define i32 @test(i32 %A, i32 %B, i1 %cond) { -J: - %C = add i32 %A, 12 ; <i32> [#uses=3] - br i1 %cond, label %L, label %L -L: ; preds = %J, %J - %Q = phi i32 [ %C, %J ], [ %C, %J ] ; <i32> [#uses=1] - %D = add i32 %C, %B ; <i32> [#uses=1] - %E = add i32 %Q, %D ; <i32> [#uses=1] - ret i32 %E -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll b/llvm/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll deleted file mode 100644 index 87620461994..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll +++ /dev/null @@ -1,17 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output - -define void @test(i32* %ldo, i1 %c, i1 %d) { -bb9: - br i1 %c, label %bb11, label %bb10 -bb10: ; preds = %bb9 - br label %bb11 -bb11: ; preds = %bb10, %bb9 - %reg330 = phi i32* [ null, %bb10 ], [ %ldo, %bb9 ] ; <i32*> [#uses=1] - br label %bb20 -bb20: ; preds = %bb20, %bb11 - store i32* %reg330, i32** null - br i1 %d, label %bb20, label %done -done: ; preds = %bb20 - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll b/llvm/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll deleted file mode 100644 index fe3a603a042..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll +++ /dev/null @@ -1,16 +0,0 @@ -; Do not remove the invoke! -; -; RUN: opt < %s -simplifycfg -disable-output - -define i32 @test() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { - %A = invoke i32 @test( ) - to label %Ret unwind label %Ret2 ; <i32> [#uses=1] -Ret: ; preds = %0 - ret i32 %A -Ret2: ; preds = %0 - %val = landingpad { i8*, i32 } - catch i8* null - ret i32 undef -} - -declare i32 @__gxx_personality_v0(...) diff --git a/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll b/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll deleted file mode 100644 index f6b068fd79c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll +++ /dev/null @@ -1,22 +0,0 @@ -; This test checks to make sure that 'br X, Dest, Dest' is folded into -; 'br Dest' - -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @noop() - -; CHECK-NOT: br i1 %c2 -define i32 @test(i1 %c1, i1 %c2) { - call void @noop( ) - br i1 %c1, label %A, label %Y -A: ; preds = %0 - call void @noop( ) - br i1 %c2, label %X, label %X -X: ; preds = %Y, %A, %A - call void @noop( ) - ret i32 0 -Y: ; preds = %0 - call void @noop( ) - br label %X -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll b/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll deleted file mode 100644 index 78049080a64..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll +++ /dev/null @@ -1,27 +0,0 @@ -; This test checks to make sure that 'br X, Dest, Dest' is folded into -; 'br Dest'. This can only happen after the 'Z' block is eliminated. This is -; due to the fact that the SimplifyCFG function does not use -; the ConstantFoldTerminator function. - -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; CHECK-NOT: br i1 %c2 - -declare void @noop() - -define i32 @test(i1 %c1, i1 %c2) { - call void @noop( ) - br i1 %c1, label %A, label %Y -A: ; preds = %0 - call void @noop( ) - br i1 %c2, label %Z, label %X -Z: ; preds = %A - br label %X -X: ; preds = %Y, %Z, %A - call void @noop( ) - ret i32 0 -Y: ; preds = %0 - call void @noop( ) - br label %X -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch-dbg.ll b/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch-dbg.ll deleted file mode 100644 index 0626ea178e5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch-dbg.ll +++ /dev/null @@ -1,57 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; CHECK-NOT: switch - %llvm.dbg.anchor.type = type { i32, i32 } - %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8* } - -@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }, section "llvm.metadata" - -@.str = internal constant [4 x i8] c"a.c\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] -@.str1 = internal constant [6 x i8] c"/tmp/\00", section "llvm.metadata" ; <[6 x i8]*> [#uses=1] -@.str2 = internal constant [55 x i8] c"4.2.1 (Based on Apple Inc. build 5636) (LLVM build 00)\00", section "llvm.metadata" ; <[55 x i8]*> [#uses=1] -@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to { }*), i32 1, i8* getelementptr ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([6 x i8], [6 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([55 x i8], [55 x i8]* @.str2, i32 0, i32 0), i1 true, i1 false, i8* null }, section "llvm.metadata" ; <%llvm.dbg.compile_unit.type*> [#uses=1] - -declare void @llvm.dbg.stoppoint(i32, i32, { }*) nounwind - -; Test folding all to same dest -define i32 @test3(i1 %C) { - br i1 %C, label %Start, label %TheDest -Start: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - switch i32 3, label %TheDest [ - i32 0, label %TheDest - i32 1, label %TheDest - i32 2, label %TheDest - i32 5, label %TheDest - ] -TheDest: ; preds = %Start, %Start, %Start, %Start, %Start, %0 - ret i32 1234 -} - -; Test folding switch -> branch -define i32 @test4(i32 %C) { - switch i32 %C, label %L1 [ - i32 0, label %L2 - ] -L1: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 0 -L2: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 1 -} - -; Can fold into a cond branch! -define i32 @test5(i32 %C) { - switch i32 %C, label %L1 [ - i32 0, label %L2 - i32 123, label %L1 - ] -L1: ; preds = %0, %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 0 -L2: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 1 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll b/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll deleted file mode 100644 index a81e7a6caaa..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll +++ /dev/null @@ -1,104 +0,0 @@ -; NOTE: Assertions have been autogenerated by update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Test normal folding -define i32 @test1() { -; CHECK-LABEL: @test1( -; CHECK-NEXT: TheDest: -; CHECK-NEXT: ret i32 1234 -; - switch i32 5, label %Default [ - i32 0, label %Foo - i32 1, label %Bar - i32 2, label %Baz - i32 5, label %TheDest - ] -Default: - ret i32 -1 -Foo: - ret i32 -2 -Bar: - ret i32 -3 -Baz: - ret i32 -4 -TheDest: - ret i32 1234 -} - -; Test folding to default dest -define i32 @test2() { -; CHECK-LABEL: @test2( -; CHECK-NEXT: Default: -; CHECK-NEXT: ret i32 1234 -; - switch i32 3, label %Default [ - i32 0, label %Foo - i32 1, label %Bar - i32 2, label %Baz - i32 5, label %TheDest - ] -Default: - ret i32 1234 -Foo: - ret i32 -2 -Bar: - ret i32 -5 -Baz: - ret i32 -6 -TheDest: - ret i32 -8 -} - -; Test folding all to same dest -define i32 @test3(i1 %C) { -; CHECK-LABEL: @test3( -; CHECK-NEXT: TheDest: -; CHECK-NEXT: ret i32 1234 -; - br i1 %C, label %Start, label %TheDest -Start: ; preds = %0 - switch i32 3, label %TheDest [ - i32 0, label %TheDest - i32 1, label %TheDest - i32 2, label %TheDest - i32 5, label %TheDest - ] -TheDest: - ret i32 1234 -} - -; Test folding switch -> branch -define i32 @test4(i32 %C) { -; CHECK-LABEL: @test4( -; CHECK-NEXT: L1: -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 %C, 0 -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[COND]], i32 1, i32 0 -; CHECK-NEXT: ret i32 [[DOT]] -; - switch i32 %C, label %L1 [ - i32 0, label %L2 - ] -L1: - ret i32 0 -L2: - ret i32 1 -} - -; Can fold into a cond branch! -define i32 @test5(i32 %C) { -; CHECK-LABEL: @test5( -; CHECK-NEXT: L1: -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 %C, 0 -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[COND]], i32 1, i32 0 -; CHECK-NEXT: ret i32 [[DOT]] -; - switch i32 %C, label %L1 [ - i32 0, label %L2 - i32 123, label %L1 - ] -L1: - ret i32 0 -L2: - ret i32 1 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll b/llvm/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll deleted file mode 100644 index fafe73b2b4e..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output - -define void @symhash_add() { -entry: - br i1 undef, label %then.0, label %UnifiedReturnBlock -then.0: ; preds = %entry - br i1 undef, label %loopentry.2, label %loopentry.1.preheader -loopentry.1.preheader: ; preds = %then.0 - br label %loopentry.1.outer -loopentry.1.outer: ; preds = %loopexit.1, %loopentry.1.preheader - br label %loopentry.1 -loopentry.1: ; preds = %endif.1, %then.4, %then.3, %then.1, %loopentry.1.outer - br i1 undef, label %loopexit.1, label %no_exit.1 -no_exit.1: ; preds = %loopentry.1 - br i1 undef, label %then.1, label %else.0 -then.1: ; preds = %no_exit.1 - br label %loopentry.1 -else.0: ; preds = %no_exit.1 - br i1 undef, label %then.2, label %else.1 -then.2: ; preds = %else.0 - br i1 undef, label %then.3, label %endif.1 -then.3: ; preds = %then.2 - br label %loopentry.1 -else.1: ; preds = %else.0 - br i1 undef, label %endif.1, label %then.4 -then.4: ; preds = %else.1 - br label %loopentry.1 -endif.1: ; preds = %else.1, %then.2 - br label %loopentry.1 -loopexit.1: ; preds = %loopentry.1 - br i1 undef, label %loopentry.1.outer, label %loopentry.2 -loopentry.2: ; preds = %no_exit.2, %loopexit.1, %then.0 - br i1 undef, label %loopexit.2, label %no_exit.2 -no_exit.2: ; preds = %loopentry.2 - br label %loopentry.2 -loopexit.2: ; preds = %loopentry.2 - ret void -UnifiedReturnBlock: ; preds = %entry - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll b/llvm/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll deleted file mode 100644 index 8fd1fae3450..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll +++ /dev/null @@ -1,95 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; PR584 -@g_38098584 = external global i32 ; <i32*> [#uses=1] -@g_60187400 = external global i32 ; <i32*> [#uses=1] -@g_59182229 = external global i32 ; <i32*> [#uses=2] - -define i32 @_Z13func_26556482h(i8 %l_88173906) { -entry: - %tmp.1 = bitcast i8 %l_88173906 to i8 ; <i8> [#uses=2] - %tmp.3 = icmp eq i8 %l_88173906, 0 ; <i1> [#uses=1] - br i1 %tmp.3, label %else.0, label %then.0 -then.0: ; preds = %entry - %tmp.5 = icmp eq i8 %l_88173906, 0 ; <i1> [#uses=1] - br i1 %tmp.5, label %else.1, label %then.1 -then.1: ; preds = %then.0 - br label %return -else.1: ; preds = %then.0 - br label %loopentry.0 -loopentry.0: ; preds = %no_exit.0, %else.1 - %i.0.1 = phi i32 [ 0, %else.1 ], [ %inc.0, %no_exit.0 ] ; <i32> [#uses=2] - %tmp.9 = icmp sgt i32 %i.0.1, 99 ; <i1> [#uses=1] - br i1 %tmp.9, label %endif.0, label %no_exit.0 -no_exit.0: ; preds = %loopentry.0 - %inc.0 = add i32 %i.0.1, 1 ; <i32> [#uses=1] - br label %loopentry.0 -else.0: ; preds = %entry - %tmp.12 = sext i8 %tmp.1 to i32 ; <i32> [#uses=1] - br label %return -endif.0: ; preds = %loopentry.0 - %tmp.14 = sext i8 %tmp.1 to i32 ; <i32> [#uses=1] - %tmp.16 = zext i8 %l_88173906 to i32 ; <i32> [#uses=1] - %tmp.17 = icmp sgt i32 %tmp.14, %tmp.16 ; <i1> [#uses=1] - %tmp.19 = load i32, i32* @g_59182229 ; <i32> [#uses=2] - br i1 %tmp.17, label %cond_true, label %cond_false -cond_true: ; preds = %endif.0 - %tmp.20 = icmp ne i32 %tmp.19, 1 ; <i1> [#uses=1] - br label %cond_continue -cond_false: ; preds = %endif.0 - %tmp.22 = icmp ne i32 %tmp.19, 0 ; <i1> [#uses=1] - br label %cond_continue -cond_continue: ; preds = %cond_false, %cond_true - %mem_tmp.0 = phi i1 [ %tmp.20, %cond_true ], [ %tmp.22, %cond_false ] ; <i1> [#uses=1] - br i1 %mem_tmp.0, label %then.2, label %else.2 -then.2: ; preds = %cond_continue - %tmp.25 = zext i8 %l_88173906 to i32 ; <i32> [#uses=1] - br label %return -else.2: ; preds = %cond_continue - br label %loopentry.1 -loopentry.1: ; preds = %endif.3, %else.2 - %i.1.1 = phi i32 [ 0, %else.2 ], [ %inc.3, %endif.3 ] ; <i32> [#uses=2] - %i.3.2 = phi i32 [ undef, %else.2 ], [ %i.3.0, %endif.3 ] ; <i32> [#uses=2] - %l_88173906_addr.1 = phi i8 [ %l_88173906, %else.2 ], [ %l_88173906_addr.0, %endif.3 ] ; <i8> [#uses=3] - %tmp.29 = icmp sgt i32 %i.1.1, 99 ; <i1> [#uses=1] - br i1 %tmp.29, label %endif.2, label %no_exit.1 -no_exit.1: ; preds = %loopentry.1 - %tmp.30 = load i32, i32* @g_38098584 ; <i32> [#uses=1] - %tmp.31 = icmp eq i32 %tmp.30, 0 ; <i1> [#uses=1] - br i1 %tmp.31, label %else.3, label %then.3 -then.3: ; preds = %no_exit.1 - br label %endif.3 -else.3: ; preds = %no_exit.1 - br i1 false, label %else.4, label %then.4 -then.4: ; preds = %else.3 - br label %endif.3 -else.4: ; preds = %else.3 - br i1 false, label %else.5, label %then.5 -then.5: ; preds = %else.4 - store i32 -1004318825, i32* @g_59182229 - br label %return -else.5: ; preds = %else.4 - br label %loopentry.3 -loopentry.3: ; preds = %then.7, %else.5 - %i.3.3 = phi i32 [ 0, %else.5 ], [ %inc.2, %then.7 ] ; <i32> [#uses=3] - %tmp.55 = icmp sgt i32 %i.3.3, 99 ; <i1> [#uses=1] - br i1 %tmp.55, label %endif.3, label %no_exit.3 -no_exit.3: ; preds = %loopentry.3 - %tmp.57 = icmp eq i8 %l_88173906_addr.1, 0 ; <i1> [#uses=1] - br i1 %tmp.57, label %else.7, label %then.7 -then.7: ; preds = %no_exit.3 - store i32 16239, i32* @g_60187400 - %inc.2 = add i32 %i.3.3, 1 ; <i32> [#uses=1] - br label %loopentry.3 -else.7: ; preds = %no_exit.3 - br label %return -endif.3: ; preds = %loopentry.3, %then.4, %then.3 - %i.3.0 = phi i32 [ %i.3.2, %then.3 ], [ %i.3.2, %then.4 ], [ %i.3.3, %loopentry.3 ] ; <i32> [#uses=1] - %l_88173906_addr.0 = phi i8 [ 100, %then.3 ], [ %l_88173906_addr.1, %then.4 ], [ %l_88173906_addr.1, %loopentry.3 ] ; <i8> [#uses=1] - %inc.3 = add i32 %i.1.1, 1 ; <i32> [#uses=1] - br label %loopentry.1 -endif.2: ; preds = %loopentry.1 - br label %return -return: ; preds = %endif.2, %else.7, %then.5, %then.2, %else.0, %then.1 - %result.0 = phi i32 [ 1624650671, %then.1 ], [ %tmp.25, %then.2 ], [ 3379, %then.5 ], [ 52410, %else.7 ], [ -1526438411, %endif.2 ], [ %tmp.12, %else.0 ] ; <i32> [#uses=1] - ret i32 %result.0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll b/llvm/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll deleted file mode 100644 index c45986749ab..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll +++ /dev/null @@ -1,71 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; END. - -define void @main() { -entry: - %tmp.14.i19 = icmp eq i32 0, 2 ; <i1> [#uses=1] - br i1 %tmp.14.i19, label %endif.1.i20, label %read_min.exit -endif.1.i20: ; preds = %entry - %tmp.9.i.i = icmp eq i8* null, null ; <i1> [#uses=1] - br i1 %tmp.9.i.i, label %then.i12.i, label %then.i.i -then.i.i: ; preds = %endif.1.i20 - ret void -then.i12.i: ; preds = %endif.1.i20 - %tmp.9.i4.i = icmp eq i8* null, null ; <i1> [#uses=1] - br i1 %tmp.9.i4.i, label %endif.2.i33, label %then.i5.i -then.i5.i: ; preds = %then.i12.i - ret void -endif.2.i33: ; preds = %then.i12.i - br i1 false, label %loopexit.0.i40, label %no_exit.0.i35 -no_exit.0.i35: ; preds = %no_exit.0.i35, %endif.2.i33 - %tmp.130.i = icmp slt i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp.130.i, label %loopexit.0.i40.loopexit, label %no_exit.0.i35 -loopexit.0.i40.loopexit: ; preds = %no_exit.0.i35 - br label %loopexit.0.i40 -loopexit.0.i40: ; preds = %loopexit.0.i40.loopexit, %endif.2.i33 - %tmp.341.i = icmp eq i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp.341.i, label %loopentry.1.i, label %read_min.exit -loopentry.1.i: ; preds = %loopexit.0.i40 - %tmp.347.i = icmp sgt i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp.347.i, label %no_exit.1.i41, label %loopexit.2.i44 -no_exit.1.i41: ; preds = %endif.5.i, %loopentry.1.i - %indvar.i42 = phi i32 [ %indvar.next.i, %endif.5.i ], [ 0, %loopentry.1.i ] ; <i32> [#uses=1] - %tmp.355.i = icmp eq i32 0, 3 ; <i1> [#uses=1] - br i1 %tmp.355.i, label %endif.5.i, label %read_min.exit -endif.5.i: ; preds = %no_exit.1.i41 - %tmp.34773.i = icmp sgt i32 0, 0 ; <i1> [#uses=1] - %indvar.next.i = add i32 %indvar.i42, 1 ; <i32> [#uses=1] - br i1 %tmp.34773.i, label %no_exit.1.i41, label %loopexit.1.i.loopexit -loopexit.1.i.loopexit: ; preds = %endif.5.i - ret void -loopexit.2.i44: ; preds = %loopentry.1.i - ret void -read_min.exit: ; preds = %no_exit.1.i41, %loopexit.0.i40, %entry - %tmp.23 = icmp eq i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp.23, label %endif.1, label %then.1 -then.1: ; preds = %read_min.exit - br i1 false, label %endif.0.i, label %then.0.i -then.0.i: ; preds = %then.1 - br i1 false, label %endif.1.i, label %then.1.i -endif.0.i: ; preds = %then.1 - br i1 false, label %endif.1.i, label %then.1.i -then.1.i: ; preds = %endif.0.i, %then.0.i - br i1 false, label %getfree.exit, label %then.2.i -endif.1.i: ; preds = %endif.0.i, %then.0.i - br i1 false, label %getfree.exit, label %then.2.i -then.2.i: ; preds = %endif.1.i, %then.1.i - ret void -getfree.exit: ; preds = %endif.1.i, %then.1.i - ret void -endif.1: ; preds = %read_min.exit - %tmp.27.i = getelementptr i32, i32* null, i32 0 ; <i32*> [#uses=0] - br i1 false, label %loopexit.0.i15, label %no_exit.0.i14 -no_exit.0.i14: ; preds = %endif.1 - ret void -loopexit.0.i15: ; preds = %endif.1 - br i1 false, label %primal_start_artificial.exit, label %no_exit.1.i16 -no_exit.1.i16: ; preds = %no_exit.1.i16, %loopexit.0.i15 - br i1 false, label %primal_start_artificial.exit, label %no_exit.1.i16 -primal_start_artificial.exit: ; preds = %no_exit.1.i16, %loopexit.0.i15 - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll b/llvm/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll deleted file mode 100644 index c71f05bf0a3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output - -define i1 @foo() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { - %X = invoke i1 @foo( ) - to label %N unwind label %F ; <i1> [#uses=1] -F: ; preds = %0 - %val = landingpad { i8*, i32 } - catch i8* null - ret i1 false -N: ; preds = %0 - br i1 %X, label %A, label %B -A: ; preds = %N - ret i1 true -B: ; preds = %N - ret i1 true -} - -declare i32 @__gxx_personality_v0(...) diff --git a/llvm/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll b/llvm/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll deleted file mode 100644 index 2606e08da9a..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll +++ /dev/null @@ -1,123 +0,0 @@ -; Make sure this doesn't turn into an infinite loop - -; RUN: opt < %s -simplifycfg -constprop -simplifycfg | llvm-dis | FileCheck %s - -%struct.anon = type { i32, i32, i32, i32, [1024 x i8] } -@_zero_ = external global %struct.anon* ; <%struct.anon**> [#uses=2] -@_one_ = external global %struct.anon* ; <%struct.anon**> [#uses=4] -@str = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=0] - -declare i32 @bc_compare(%struct.anon*, %struct.anon*) - -declare void @free_num(%struct.anon**) - -declare %struct.anon* @copy_num(%struct.anon*) - -declare void @init_num(%struct.anon**) - -declare %struct.anon* @new_num(i32, i32) - -declare void @int2num(%struct.anon**, i32) - -declare void @bc_multiply(%struct.anon*, %struct.anon*, %struct.anon**, i32) - -declare void @bc_raise(%struct.anon*, %struct.anon*, %struct.anon**, i32) - -declare i32 @bc_divide(%struct.anon*, %struct.anon*, %struct.anon**, i32) - -declare void @bc_add(%struct.anon*, %struct.anon*, %struct.anon**) - -declare i32 @_do_compare(%struct.anon*, %struct.anon*, i32, i32) - -declare i32 @printf(i8*, ...) - -define i32 @bc_sqrt(%struct.anon** %num, i32 %scale) { -entry: - %guess = alloca %struct.anon* ; <%struct.anon**> [#uses=7] - %guess1 = alloca %struct.anon* ; <%struct.anon**> [#uses=7] - %point5 = alloca %struct.anon* ; <%struct.anon**> [#uses=3] - %tmp = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1] - %tmp1 = load %struct.anon*, %struct.anon** @_zero_ ; <%struct.anon*> [#uses=1] - %tmp.upgrd.1 = call i32 @bc_compare( %struct.anon* %tmp, %struct.anon* %tmp1 ) ; <i32> [#uses=2] - %tmp.upgrd.2 = icmp slt i32 %tmp.upgrd.1, 0 ; <i1> [#uses=1] - br i1 %tmp.upgrd.2, label %cond_true, label %cond_false -cond_true: ; preds = %entry - ret i32 0 -cond_false: ; preds = %entry - %tmp5 = icmp eq i32 %tmp.upgrd.1, 0 ; <i1> [#uses=1] - br i1 %tmp5, label %cond_true6, label %cond_next13 -cond_true6: ; preds = %cond_false - call void @free_num( %struct.anon** %num ) - %tmp8 = load %struct.anon*, %struct.anon** @_zero_ ; <%struct.anon*> [#uses=1] - %tmp9 = call %struct.anon* @copy_num( %struct.anon* %tmp8 ) ; <%struct.anon*> [#uses=1] - store %struct.anon* %tmp9, %struct.anon** %num - ret i32 1 -cond_next13: ; preds = %cond_false - %tmp15 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1] - %tmp16 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1] - %tmp17 = call i32 @bc_compare( %struct.anon* %tmp15, %struct.anon* %tmp16 ) ; <i32> [#uses=2] - %tmp19 = icmp eq i32 %tmp17, 0 ; <i1> [#uses=1] - br i1 %tmp19, label %cond_true20, label %cond_next27 -cond_true20: ; preds = %cond_next13 - call void @free_num( %struct.anon** %num ) - %tmp22 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1] - %tmp23 = call %struct.anon* @copy_num( %struct.anon* %tmp22 ) ; <%struct.anon*> [#uses=1] - store %struct.anon* %tmp23, %struct.anon** %num - ret i32 1 -cond_next27: ; preds = %cond_next13 - %tmp29 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1] - %tmp30 = getelementptr %struct.anon, %struct.anon* %tmp29, i32 0, i32 2 ; <i32*> [#uses=1] - %tmp31 = load i32, i32* %tmp30 ; <i32> [#uses=2] - %tmp33 = icmp sge i32 %tmp31, %scale ; <i1> [#uses=1] - %max = select i1 %tmp33, i32 %tmp31, i32 %scale ; <i32> [#uses=4] - %tmp35 = add i32 %max, 2 ; <i32> [#uses=0] - call void @init_num( %struct.anon** %guess ) - call void @init_num( %struct.anon** %guess1 ) - %tmp36 = call %struct.anon* @new_num( i32 1, i32 1 ) ; <%struct.anon*> [#uses=2] - store %struct.anon* %tmp36, %struct.anon** %point5 - %tmp.upgrd.3 = getelementptr %struct.anon, %struct.anon* %tmp36, i32 0, i32 4, i32 1 ; <i8*> [#uses=1] - store i8 5, i8* %tmp.upgrd.3 - %tmp39 = icmp slt i32 %tmp17, 0 ; <i1> [#uses=1] - br i1 %tmp39, label %cond_true40, label %cond_false43 -cond_true40: ; preds = %cond_next27 - %tmp41 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1] - %tmp42 = call %struct.anon* @copy_num( %struct.anon* %tmp41 ) ; <%struct.anon*> [#uses=1] - store %struct.anon* %tmp42, %struct.anon** %guess - br label %bb80.outer -cond_false43: ; preds = %cond_next27 - call void @int2num( %struct.anon** %guess, i32 10 ) - %tmp45 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1] - %tmp46 = getelementptr %struct.anon, %struct.anon* %tmp45, i32 0, i32 1 ; <i32*> [#uses=1] - %tmp47 = load i32, i32* %tmp46 ; <i32> [#uses=1] - call void @int2num( %struct.anon** %guess1, i32 %tmp47 ) - %tmp48 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] - %tmp49 = load %struct.anon*, %struct.anon** %point5 ; <%struct.anon*> [#uses=1] - call void @bc_multiply( %struct.anon* %tmp48, %struct.anon* %tmp49, %struct.anon** %guess1, i32 %max ) - %tmp51 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] - %tmp52 = getelementptr %struct.anon, %struct.anon* %tmp51, i32 0, i32 2 ; <i32*> [#uses=1] - store i32 0, i32* %tmp52 - %tmp53 = load %struct.anon*, %struct.anon** %guess ; <%struct.anon*> [#uses=1] - %tmp54 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] - call void @bc_raise( %struct.anon* %tmp53, %struct.anon* %tmp54, %struct.anon** %guess, i32 %max ) - br label %bb80.outer -bb80.outer: ; preds = %cond_true83, %cond_false43, %cond_true40 - %done.1.ph = phi i32 [ 1, %cond_true83 ], [ 0, %cond_true40 ], [ 0, %cond_false43 ] ; <i32> [#uses=1] - br label %bb80 -bb80: ; preds = %cond_true83, %bb80.outer - %tmp82 = icmp eq i32 %done.1.ph, 0 ; <i1> [#uses=1] - br i1 %tmp82, label %cond_true83, label %bb86 -cond_true83: ; preds = %bb80 - %tmp71 = call i32 @_do_compare( %struct.anon* null, %struct.anon* null, i32 0, i32 1 ) ; <i32> [#uses=1] - %tmp76 = icmp eq i32 %tmp71, 0 ; <i1> [#uses=1] - br i1 %tmp76, label %bb80.outer, label %bb80 -; CHECK: bb86 -bb86: ; preds = %bb80 - call void @free_num( %struct.anon** %num ) - %tmp88 = load %struct.anon*, %struct.anon** %guess ; <%struct.anon*> [#uses=1] - %tmp89 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1] - %tmp92 = call i32 @bc_divide( %struct.anon* %tmp88, %struct.anon* %tmp89, %struct.anon** %num, i32 %max ) ; <i32> [#uses=0] - call void @free_num( %struct.anon** %guess ) - call void @free_num( %struct.anon** %guess1 ) - call void @free_num( %struct.anon** %point5 ) - ret i32 1 -} diff --git a/llvm/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll b/llvm/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll deleted file mode 100644 index 32f49e66788..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll +++ /dev/null @@ -1,27 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output - -define void @polnel_() { -entry: - %tmp595 = icmp slt i32 0, 0 ; <i1> [#uses=4] - br i1 %tmp595, label %bb148.critedge, label %cond_true40 -bb36: ; preds = %bb43 - br i1 %tmp595, label %bb43, label %cond_true40 -cond_true40: ; preds = %bb46, %cond_true40, %bb36, %entry - %tmp397 = icmp sgt i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp397, label %bb43, label %cond_true40 -bb43: ; preds = %cond_true40, %bb36 - br i1 false, label %bb53, label %bb36 -bb46: ; preds = %bb53 - br i1 %tmp595, label %bb53, label %cond_true40 -bb53: ; preds = %bb46, %bb43 - br i1 false, label %bb102, label %bb46 -bb92.preheader: ; preds = %bb102 - ret void -bb102: ; preds = %bb53 - br i1 %tmp595, label %bb148, label %bb92.preheader -bb148.critedge: ; preds = %entry - ret void -bb148: ; preds = %bb102 - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll b/llvm/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll deleted file mode 100644 index 21cfb2615ff..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll +++ /dev/null @@ -1,413 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; END. - -define void @main(i32 %c) { -entry: - %tmp.9 = icmp eq i32 %c, 2 ; <i1> [#uses=1] - br i1 %tmp.9, label %endif.0, label %then.0 -then.0: ; preds = %entry - ret void -endif.0: ; preds = %entry - br i1 false, label %then.1, label %endif.1 -then.1: ; preds = %endif.0 - ret void -endif.1: ; preds = %endif.0 - br i1 false, label %then.2, label %endif.2 -then.2: ; preds = %endif.1 - ret void -endif.2: ; preds = %endif.1 - br i1 false, label %then.3, label %loopentry.0 -then.3: ; preds = %endif.2 - ret void -loopentry.0: ; preds = %endif.2 - br i1 false, label %no_exit.0.preheader, label %loopexit.0 -no_exit.0.preheader: ; preds = %loopentry.0 - br label %no_exit.0 -no_exit.0: ; preds = %endif.4, %no_exit.0.preheader - br i1 false, label %then.4, label %endif.4 -then.4: ; preds = %no_exit.0 - ret void -endif.4: ; preds = %no_exit.0 - br i1 false, label %no_exit.0, label %loopexit.0.loopexit -loopexit.0.loopexit: ; preds = %endif.4 - br label %loopexit.0 -loopexit.0: ; preds = %loopexit.0.loopexit, %loopentry.0 - br i1 false, label %then.5, label %loopentry.1 -then.5: ; preds = %loopexit.0 - ret void -loopentry.1: ; preds = %loopexit.0 - %tmp.143 = icmp sgt i32 0, 0 ; <i1> [#uses=4] - br i1 %tmp.143, label %no_exit.1.preheader, label %loopexit.1 -no_exit.1.preheader: ; preds = %loopentry.1 - br label %no_exit.1 -no_exit.1: ; preds = %endif.6, %no_exit.1.preheader - br i1 false, label %then.6, label %shortcirc_next.3 -shortcirc_next.3: ; preds = %no_exit.1 - br i1 false, label %then.6, label %shortcirc_next.4 -shortcirc_next.4: ; preds = %shortcirc_next.3 - br i1 false, label %then.6, label %endif.6 -then.6: ; preds = %shortcirc_next.4, %shortcirc_next.3, %no_exit.1 - ret void -endif.6: ; preds = %shortcirc_next.4 - br i1 false, label %no_exit.1, label %loopexit.1.loopexit -loopexit.1.loopexit: ; preds = %endif.6 - br label %loopexit.1 -loopexit.1: ; preds = %loopexit.1.loopexit, %loopentry.1 - br i1 false, label %then.i, label %loopentry.0.i -then.i: ; preds = %loopexit.1 - ret void -loopentry.0.i: ; preds = %loopexit.1 - br i1 %tmp.143, label %no_exit.0.i.preheader, label %readvector.exit -no_exit.0.i.preheader: ; preds = %loopentry.0.i - br label %no_exit.0.i -no_exit.0.i: ; preds = %loopexit.1.i, %no_exit.0.i.preheader - br i1 false, label %no_exit.1.i.preheader, label %loopexit.1.i -no_exit.1.i.preheader: ; preds = %no_exit.0.i - br label %no_exit.1.i -no_exit.1.i: ; preds = %loopexit.2.i, %no_exit.1.i.preheader - br i1 false, label %no_exit.2.i.preheader, label %loopexit.2.i -no_exit.2.i.preheader: ; preds = %no_exit.1.i - br label %no_exit.2.i -no_exit.2.i: ; preds = %no_exit.2.i, %no_exit.2.i.preheader - br i1 false, label %no_exit.2.i, label %loopexit.2.i.loopexit -loopexit.2.i.loopexit: ; preds = %no_exit.2.i - br label %loopexit.2.i -loopexit.2.i: ; preds = %loopexit.2.i.loopexit, %no_exit.1.i - br i1 false, label %no_exit.1.i, label %loopexit.1.i.loopexit -loopexit.1.i.loopexit: ; preds = %loopexit.2.i - br label %loopexit.1.i -loopexit.1.i: ; preds = %loopexit.1.i.loopexit, %no_exit.0.i - br i1 false, label %no_exit.0.i, label %readvector.exit.loopexit -readvector.exit.loopexit: ; preds = %loopexit.1.i - br label %readvector.exit -readvector.exit: ; preds = %readvector.exit.loopexit, %loopentry.0.i - br i1 %tmp.143, label %loopentry.1.preheader.i, label %loopexit.0.i -loopentry.1.preheader.i: ; preds = %readvector.exit - br label %loopentry.1.outer.i -loopentry.1.outer.i: ; preds = %loopexit.1.i110, %loopentry.1.preheader.i - br label %loopentry.1.i85 -loopentry.1.i85.loopexit: ; preds = %hamming.exit16.i - br label %loopentry.1.i85 -loopentry.1.i85: ; preds = %loopentry.1.i85.loopexit, %loopentry.1.outer.i - br i1 false, label %no_exit.1.preheader.i, label %loopexit.1.i110.loopexit1 -no_exit.1.preheader.i: ; preds = %loopentry.1.i85 - br label %no_exit.1.i87 -no_exit.1.i87: ; preds = %then.1.i107, %no_exit.1.preheader.i - br i1 false, label %no_exit.i.i101.preheader, label %hamming.exit.i104 -no_exit.i.i101.preheader: ; preds = %no_exit.1.i87 - br label %no_exit.i.i101 -no_exit.i.i101: ; preds = %no_exit.i.i101, %no_exit.i.i101.preheader - br i1 false, label %no_exit.i.i101, label %hamming.exit.i104.loopexit -hamming.exit.i104.loopexit: ; preds = %no_exit.i.i101 - br label %hamming.exit.i104 -hamming.exit.i104: ; preds = %hamming.exit.i104.loopexit, %no_exit.1.i87 - br i1 false, label %no_exit.i15.i.preheader, label %hamming.exit16.i -no_exit.i15.i.preheader: ; preds = %hamming.exit.i104 - br label %no_exit.i15.i -no_exit.i15.i: ; preds = %no_exit.i15.i, %no_exit.i15.i.preheader - br i1 false, label %no_exit.i15.i, label %hamming.exit16.i.loopexit -hamming.exit16.i.loopexit: ; preds = %no_exit.i15.i - br label %hamming.exit16.i -hamming.exit16.i: ; preds = %hamming.exit16.i.loopexit, %hamming.exit.i104 - br i1 false, label %loopentry.1.i85.loopexit, label %then.1.i107 -then.1.i107: ; preds = %hamming.exit16.i - br i1 false, label %no_exit.1.i87, label %loopexit.1.i110.loopexit -loopexit.1.i110.loopexit: ; preds = %then.1.i107 - br label %loopexit.1.i110 -loopexit.1.i110.loopexit1: ; preds = %loopentry.1.i85 - br label %loopexit.1.i110 -loopexit.1.i110: ; preds = %loopexit.1.i110.loopexit1, %loopexit.1.i110.loopexit - br i1 false, label %loopentry.1.outer.i, label %loopexit.0.i.loopexit -loopexit.0.i.loopexit: ; preds = %loopexit.1.i110 - br label %loopexit.0.i -loopexit.0.i: ; preds = %loopexit.0.i.loopexit, %readvector.exit - br i1 false, label %UnifiedReturnBlock.i113, label %then.2.i112 -then.2.i112: ; preds = %loopexit.0.i - br label %checkham.exit -UnifiedReturnBlock.i113: ; preds = %loopexit.0.i - br label %checkham.exit -checkham.exit: ; preds = %UnifiedReturnBlock.i113, %then.2.i112 - br i1 false, label %loopentry.1.i14.preheader, label %loopentry.3.i.preheader -loopentry.1.i14.preheader: ; preds = %checkham.exit - br label %loopentry.1.i14 -loopentry.1.i14: ; preds = %loopexit.1.i18, %loopentry.1.i14.preheader - br i1 false, label %no_exit.1.i16.preheader, label %loopexit.1.i18 -no_exit.1.i16.preheader: ; preds = %loopentry.1.i14 - br label %no_exit.1.i16 -no_exit.1.i16: ; preds = %no_exit.1.i16, %no_exit.1.i16.preheader - br i1 false, label %no_exit.1.i16, label %loopexit.1.i18.loopexit -loopexit.1.i18.loopexit: ; preds = %no_exit.1.i16 - br label %loopexit.1.i18 -loopexit.1.i18: ; preds = %loopexit.1.i18.loopexit, %loopentry.1.i14 - br i1 false, label %loopentry.1.i14, label %loopentry.3.i.loopexit -loopentry.3.i.loopexit: ; preds = %loopexit.1.i18 - br label %loopentry.3.i.preheader -loopentry.3.i.preheader: ; preds = %loopentry.3.i.loopexit, %checkham.exit - br label %loopentry.3.i -loopentry.3.i: ; preds = %endif.1.i, %loopentry.3.i.preheader - br i1 false, label %loopentry.4.i.preheader, label %endif.1.i -loopentry.4.i.preheader: ; preds = %loopentry.3.i - br label %loopentry.4.i -loopentry.4.i: ; preds = %loopexit.4.i, %loopentry.4.i.preheader - br i1 false, label %no_exit.4.i.preheader, label %loopexit.4.i -no_exit.4.i.preheader: ; preds = %loopentry.4.i - br label %no_exit.4.i -no_exit.4.i: ; preds = %no_exit.4.i.backedge, %no_exit.4.i.preheader - br i1 false, label %endif.0.i, label %else.i -else.i: ; preds = %no_exit.4.i - br i1 false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit -no_exit.4.i.backedge: ; preds = %endif.0.i, %else.i - br label %no_exit.4.i -endif.0.i: ; preds = %no_exit.4.i - br i1 false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit -loopexit.4.i.loopexit: ; preds = %endif.0.i, %else.i - br label %loopexit.4.i -loopexit.4.i: ; preds = %loopexit.4.i.loopexit, %loopentry.4.i - br i1 false, label %loopentry.4.i, label %endif.1.i.loopexit -endif.1.i.loopexit: ; preds = %loopexit.4.i - br label %endif.1.i -endif.1.i: ; preds = %endif.1.i.loopexit, %loopentry.3.i - %exitcond = icmp eq i32 0, 10 ; <i1> [#uses=1] - br i1 %exitcond, label %generateT.exit, label %loopentry.3.i -generateT.exit: ; preds = %endif.1.i - br i1 false, label %then.0.i, label %loopentry.1.i30.preheader -then.0.i: ; preds = %generateT.exit - ret void -loopentry.1.i30.loopexit: ; preds = %loopexit.3.i - br label %loopentry.1.i30.backedge -loopentry.1.i30.preheader: ; preds = %generateT.exit - br label %loopentry.1.i30 -loopentry.1.i30: ; preds = %loopentry.1.i30.backedge, %loopentry.1.i30.preheader - br i1 %tmp.143, label %no_exit.0.i31.preheader, label %loopentry.1.i30.backedge -loopentry.1.i30.backedge: ; preds = %loopentry.1.i30, %loopentry.1.i30.loopexit - br label %loopentry.1.i30 -no_exit.0.i31.preheader: ; preds = %loopentry.1.i30 - br label %no_exit.0.i31 -no_exit.0.i31: ; preds = %loopexit.3.i, %no_exit.0.i31.preheader - br i1 false, label %then.1.i, label %else.0.i -then.1.i: ; preds = %no_exit.0.i31 - br i1 undef, label %then.0.i29, label %loopentry.0.i31 -then.0.i29: ; preds = %then.1.i - unreachable -loopentry.0.i31: ; preds = %then.1.i - br i1 false, label %no_exit.0.i38.preheader, label %loopentry.1.i.preheader -no_exit.0.i38.preheader: ; preds = %loopentry.0.i31 - br label %no_exit.0.i38 -no_exit.0.i38: ; preds = %no_exit.0.i38, %no_exit.0.i38.preheader - br i1 undef, label %no_exit.0.i38, label %loopentry.1.i.preheader.loopexit -loopentry.1.i.preheader.loopexit: ; preds = %no_exit.0.i38 - br label %loopentry.1.i.preheader -loopentry.1.i.preheader: ; preds = %loopentry.1.i.preheader.loopexit, %loopentry.0.i31 - br label %loopentry.1.i -loopentry.1.i: ; preds = %endif.2.i, %loopentry.1.i.preheader - br i1 undef, label %loopentry.2.i39.preheader, label %loopexit.1.i79.loopexit2 -loopentry.2.i39.preheader: ; preds = %loopentry.1.i - br label %loopentry.2.i39 -loopentry.2.i39: ; preds = %loopexit.5.i77, %loopentry.2.i39.preheader - br i1 false, label %loopentry.3.i40.preheader, label %hamming.exit.i71 -loopentry.3.i40.preheader: ; preds = %loopentry.2.i39 - br label %loopentry.3.i40 -loopentry.3.i40: ; preds = %loopexit.3.i51, %loopentry.3.i40.preheader - br i1 false, label %no_exit.3.preheader.i42, label %loopexit.3.i51 -no_exit.3.preheader.i42: ; preds = %loopentry.3.i40 - br label %no_exit.3.i49 -no_exit.3.i49: ; preds = %no_exit.3.i49, %no_exit.3.preheader.i42 - br i1 undef, label %no_exit.3.i49, label %loopexit.3.i51.loopexit -loopexit.3.i51.loopexit: ; preds = %no_exit.3.i49 - br label %loopexit.3.i51 -loopexit.3.i51: ; preds = %loopexit.3.i51.loopexit, %loopentry.3.i40 - br i1 undef, label %loopentry.3.i40, label %loopentry.4.i52 -loopentry.4.i52: ; preds = %loopexit.3.i51 - br i1 false, label %no_exit.4.i54.preheader, label %hamming.exit.i71 -no_exit.4.i54.preheader: ; preds = %loopentry.4.i52 - br label %no_exit.4.i54 -no_exit.4.i54: ; preds = %no_exit.4.backedge.i, %no_exit.4.i54.preheader - br i1 undef, label %then.1.i55, label %endif.1.i56 -then.1.i55: ; preds = %no_exit.4.i54 - br i1 undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 -no_exit.4.backedge.i: ; preds = %endif.1.i56, %then.1.i55 - br label %no_exit.4.i54 -endif.1.i56: ; preds = %no_exit.4.i54 - br i1 undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 -loopexit.4.i57: ; preds = %endif.1.i56, %then.1.i55 - br i1 false, label %no_exit.i.i69.preheader, label %hamming.exit.i71 -no_exit.i.i69.preheader: ; preds = %loopexit.4.i57 - br label %no_exit.i.i69 -no_exit.i.i69: ; preds = %no_exit.i.i69, %no_exit.i.i69.preheader - br i1 undef, label %no_exit.i.i69, label %hamming.exit.i71.loopexit -hamming.exit.i71.loopexit: ; preds = %no_exit.i.i69 - br label %hamming.exit.i71 -hamming.exit.i71: ; preds = %hamming.exit.i71.loopexit, %loopexit.4.i57, %loopentry.4.i52, %loopentry.2.i39 - br i1 undef, label %endif.2.i, label %loopentry.5.i72 -loopentry.5.i72: ; preds = %hamming.exit.i71 - br i1 false, label %shortcirc_next.i74.preheader, label %loopexit.5.i77 -shortcirc_next.i74.preheader: ; preds = %loopentry.5.i72 - br label %shortcirc_next.i74 -shortcirc_next.i74: ; preds = %no_exit.5.i76, %shortcirc_next.i74.preheader - br i1 undef, label %no_exit.5.i76, label %loopexit.5.i77.loopexit -no_exit.5.i76: ; preds = %shortcirc_next.i74 - br i1 undef, label %shortcirc_next.i74, label %loopexit.5.i77.loopexit -loopexit.5.i77.loopexit: ; preds = %no_exit.5.i76, %shortcirc_next.i74 - br label %loopexit.5.i77 -loopexit.5.i77: ; preds = %loopexit.5.i77.loopexit, %loopentry.5.i72 - br i1 undef, label %loopentry.2.i39, label %loopexit.1.i79.loopexit -endif.2.i: ; preds = %hamming.exit.i71 - br label %loopentry.1.i -loopexit.1.i79.loopexit: ; preds = %loopexit.5.i77 - br label %loopexit.1.i79 -loopexit.1.i79.loopexit2: ; preds = %loopentry.1.i - br label %loopexit.1.i79 -loopexit.1.i79: ; preds = %loopexit.1.i79.loopexit2, %loopexit.1.i79.loopexit - br i1 undef, label %then.3.i, label %loopentry.6.i80 -then.3.i: ; preds = %loopexit.1.i79 - br i1 false, label %no_exit.6.i82.preheader, label %run.exit -loopentry.6.i80: ; preds = %loopexit.1.i79 - br i1 false, label %no_exit.6.i82.preheader, label %run.exit -no_exit.6.i82.preheader: ; preds = %loopentry.6.i80, %then.3.i - br label %no_exit.6.i82 -no_exit.6.i82: ; preds = %no_exit.6.i82, %no_exit.6.i82.preheader - br i1 undef, label %no_exit.6.i82, label %run.exit.loopexit -run.exit.loopexit: ; preds = %no_exit.6.i82 - br label %run.exit -run.exit: ; preds = %run.exit.loopexit, %loopentry.6.i80, %then.3.i - br i1 false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 -else.0.i: ; preds = %no_exit.0.i31 - br i1 false, label %then.0.i4, label %loopentry.0.i6 -then.0.i4: ; preds = %else.0.i - unreachable -loopentry.0.i6: ; preds = %else.0.i - br i1 false, label %no_exit.0.i8.preheader, label %loopentry.2.i.preheader -no_exit.0.i8.preheader: ; preds = %loopentry.0.i6 - br label %no_exit.0.i8 -no_exit.0.i8: ; preds = %no_exit.0.i8, %no_exit.0.i8.preheader - br i1 false, label %no_exit.0.i8, label %loopentry.2.i.preheader.loopexit -loopentry.2.i.preheader.loopexit: ; preds = %no_exit.0.i8 - br label %loopentry.2.i.preheader -loopentry.2.i.preheader: ; preds = %loopentry.2.i.preheader.loopexit, %loopentry.0.i6 - br label %loopentry.2.i -loopentry.2.i: ; preds = %endif.3.i19, %loopentry.2.i.preheader - br i1 false, label %loopentry.3.i10.preheader, label %loopentry.4.i15 -loopentry.3.i10.preheader: ; preds = %loopentry.2.i - br label %loopentry.3.i10 -loopentry.3.i10: ; preds = %loopexit.3.i14, %loopentry.3.i10.preheader - br i1 false, label %no_exit.3.preheader.i, label %loopexit.3.i14 -no_exit.3.preheader.i: ; preds = %loopentry.3.i10 - br label %no_exit.3.i12 -no_exit.3.i12: ; preds = %no_exit.3.i12, %no_exit.3.preheader.i - br i1 false, label %no_exit.3.i12, label %loopexit.3.i14.loopexit -loopexit.3.i14.loopexit: ; preds = %no_exit.3.i12 - br label %loopexit.3.i14 -loopexit.3.i14: ; preds = %loopexit.3.i14.loopexit, %loopentry.3.i10 - br i1 false, label %loopentry.3.i10, label %loopentry.4.i15.loopexit -loopentry.4.i15.loopexit: ; preds = %loopexit.3.i14 - br label %loopentry.4.i15 -loopentry.4.i15: ; preds = %loopentry.4.i15.loopexit, %loopentry.2.i - br i1 false, label %loopentry.5.outer.i.preheader, label %loopentry.7.i -loopentry.5.outer.i.preheader: ; preds = %loopentry.4.i15 - br label %loopentry.5.outer.i -loopentry.5.outer.i: ; preds = %loopexit.5.i, %loopentry.5.outer.i.preheader - br label %loopentry.5.i -loopentry.5.i: ; preds = %endif.1.i18, %loopentry.5.outer.i - br i1 false, label %no_exit.5.i.preheader, label %loopexit.5.i.loopexit3 -no_exit.5.i.preheader: ; preds = %loopentry.5.i - br label %no_exit.5.i -no_exit.5.i: ; preds = %then.2.i, %no_exit.5.i.preheader - br i1 false, label %loopentry.6.i, label %endif.1.i18 -loopentry.6.i: ; preds = %no_exit.5.i - br i1 false, label %no_exit.6.preheader.i, label %loopexit.6.i -no_exit.6.preheader.i: ; preds = %loopentry.6.i - br label %no_exit.6.i -no_exit.6.i: ; preds = %no_exit.6.i, %no_exit.6.preheader.i - br i1 false, label %no_exit.6.i, label %loopexit.6.i.loopexit -loopexit.6.i.loopexit: ; preds = %no_exit.6.i - br label %loopexit.6.i -loopexit.6.i: ; preds = %loopexit.6.i.loopexit, %loopentry.6.i - br i1 false, label %then.2.i, label %endif.1.i18 -then.2.i: ; preds = %loopexit.6.i - br i1 false, label %no_exit.5.i, label %loopexit.5.i.loopexit -endif.1.i18: ; preds = %loopexit.6.i, %no_exit.5.i - br label %loopentry.5.i -loopexit.5.i.loopexit: ; preds = %then.2.i - br label %loopexit.5.i -loopexit.5.i.loopexit3: ; preds = %loopentry.5.i - br label %loopexit.5.i -loopexit.5.i: ; preds = %loopexit.5.i.loopexit3, %loopexit.5.i.loopexit - br i1 false, label %loopentry.5.outer.i, label %loopentry.7.i.loopexit -loopentry.7.i.loopexit: ; preds = %loopexit.5.i - br label %loopentry.7.i -loopentry.7.i: ; preds = %loopentry.7.i.loopexit, %loopentry.4.i15 - br i1 false, label %no_exit.7.i.preheader, label %hamming.exit.i -no_exit.7.i.preheader: ; preds = %loopentry.7.i - br label %no_exit.7.i -no_exit.7.i: ; preds = %no_exit.7.i, %no_exit.7.i.preheader - br i1 false, label %no_exit.7.i, label %loopexit.7.i -loopexit.7.i: ; preds = %no_exit.7.i - br i1 false, label %no_exit.i.i.preheader, label %hamming.exit.i -no_exit.i.i.preheader: ; preds = %loopexit.7.i - br label %no_exit.i.i -no_exit.i.i: ; preds = %no_exit.i.i, %no_exit.i.i.preheader - br i1 false, label %no_exit.i.i, label %hamming.exit.i.loopexit -hamming.exit.i.loopexit: ; preds = %no_exit.i.i - br label %hamming.exit.i -hamming.exit.i: ; preds = %hamming.exit.i.loopexit, %loopexit.7.i, %loopentry.7.i - br i1 false, label %endif.3.i19, label %loopentry.8.i -loopentry.8.i: ; preds = %hamming.exit.i - br i1 false, label %shortcirc_next.i.preheader, label %loopexit.8.i -shortcirc_next.i.preheader: ; preds = %loopentry.8.i - br label %shortcirc_next.i -shortcirc_next.i: ; preds = %no_exit.8.i, %shortcirc_next.i.preheader - br i1 false, label %no_exit.8.i, label %loopexit.8.i.loopexit -no_exit.8.i: ; preds = %shortcirc_next.i - br i1 false, label %shortcirc_next.i, label %loopexit.8.i.loopexit -loopexit.8.i.loopexit: ; preds = %no_exit.8.i, %shortcirc_next.i - br label %loopexit.8.i -loopexit.8.i: ; preds = %loopexit.8.i.loopexit, %loopentry.8.i - br i1 false, label %no_exit.9.i.preheader, label %endif.3.i19 -no_exit.9.i.preheader: ; preds = %loopexit.8.i - br label %no_exit.9.i -no_exit.9.i: ; preds = %no_exit.9.i, %no_exit.9.i.preheader - br i1 false, label %no_exit.9.i, label %endif.3.i19.loopexit -endif.3.i19.loopexit: ; preds = %no_exit.9.i - br label %endif.3.i19 -endif.3.i19: ; preds = %endif.3.i19.loopexit, %loopexit.8.i, %hamming.exit.i - br i1 false, label %loopentry.2.i, label %loopexit.1.i20 -loopexit.1.i20: ; preds = %endif.3.i19 - br i1 false, label %then.4.i, label %UnifiedReturnBlock.i -then.4.i: ; preds = %loopexit.1.i20 - br label %runcont.exit -UnifiedReturnBlock.i: ; preds = %loopexit.1.i20 - br label %runcont.exit -runcont.exit: ; preds = %UnifiedReturnBlock.i, %then.4.i - br i1 false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 -no_exit.1.i36.preheader: ; preds = %runcont.exit, %run.exit - br label %no_exit.1.i36 -no_exit.1.i36: ; preds = %no_exit.1.i36, %no_exit.1.i36.preheader - br i1 false, label %no_exit.1.i36, label %loopentry.3.i37.loopexit -loopentry.3.i37.loopexit: ; preds = %no_exit.1.i36 - br label %loopentry.3.i37 -loopentry.3.i37: ; preds = %loopentry.3.i37.loopexit, %runcont.exit, %run.exit - br i1 false, label %loopentry.4.i38.preheader, label %loopexit.3.i -loopentry.4.i38.preheader: ; preds = %loopentry.3.i37 - br label %loopentry.4.i38 -loopentry.4.i38: ; preds = %loopexit.4.i42, %loopentry.4.i38.preheader - br i1 false, label %no_exit.3.i.preheader, label %loopexit.4.i42 -no_exit.3.i.preheader: ; preds = %loopentry.4.i38 - br label %no_exit.3.i -no_exit.3.i: ; preds = %no_exit.3.i.backedge, %no_exit.3.i.preheader - br i1 false, label %endif.3.i, label %else.1.i -else.1.i: ; preds = %no_exit.3.i - br i1 false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit -no_exit.3.i.backedge: ; preds = %endif.3.i, %else.1.i - br label %no_exit.3.i -endif.3.i: ; preds = %no_exit.3.i - br i1 false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit -loopexit.4.i42.loopexit: ; preds = %endif.3.i, %else.1.i - br label %loopexit.4.i42 -loopexit.4.i42: ; preds = %loopexit.4.i42.loopexit, %loopentry.4.i38 - br i1 false, label %loopentry.4.i38, label %loopexit.3.i.loopexit -loopexit.3.i.loopexit: ; preds = %loopexit.4.i42 - br label %loopexit.3.i -loopexit.3.i: ; preds = %loopexit.3.i.loopexit, %loopentry.3.i37 - %tmp.13.i155 = icmp slt i32 0, 0 ; <i1> [#uses=1] - br i1 %tmp.13.i155, label %no_exit.0.i31, label %loopentry.1.i30.loopexit -} diff --git a/llvm/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll b/llvm/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll deleted file mode 100644 index 6003bfb2358..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll +++ /dev/null @@ -1,96 +0,0 @@ -; RUN: opt < %s -gvn -simplifycfg -disable-output -; PR867 - -target datalayout = "E-p:32:32" -target triple = "powerpc-unknown-linux-gnu" - %struct.CUMULATIVE_ARGS = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } - %struct.eh_status = type opaque - %struct.emit_status = type { i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack*, i32, %struct.location_t, i32, i8*, %struct.rtx_def** } - %struct.expr_status = type { i32, i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def* } - %struct.function = type { %struct.eh_status*, %struct.expr_status*, %struct.emit_status*, %struct.varasm_status*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.function*, i32, i32, i32, i32, %struct.rtx_def*, %struct.CUMULATIVE_ARGS, %struct.rtx_def*, %struct.rtx_def*, %struct.initial_value_struct*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, i8, i32, i64, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.varray_head_tag*, %struct.temp_slot*, i32, %struct.var_refs_queue*, i32, i32, %struct.rtvec_def*, %struct.tree_node*, i32, i32, i32, %struct.machine_function*, i32, i32, i8, i8, %struct.language_function*, %struct.rtx_def*, i32, i32, i32, i32, %struct.location_t, %struct.varray_head_tag*, %struct.tree_node*, i8, i8, i8 } - %struct.initial_value_struct = type opaque - %struct.lang_decl = type opaque - %struct.lang_type = type opaque - %struct.language_function = type opaque - %struct.location_t = type { i8*, i32 } - %struct.machine_function = type { i32, i32, i8*, i32, i32 } - %struct.rtunion = type { i32 } - %struct.rtvec_def = type { i32, [1 x %struct.rtx_def*] } - %struct.rtx_def = type { i16, i8, i8, %struct.u } - %struct.sequence_stack = type { %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack* } - %struct.temp_slot = type opaque - %struct.tree_common = type { %struct.tree_node*, %struct.tree_node*, %union.tree_ann_d*, i8, i8, i8, i8, i8 } - %struct.tree_decl = type { %struct.tree_common, %struct.location_t, i32, %struct.tree_node*, i8, i8, i8, i8, i8, i8, i8, i8, i32, %struct.tree_decl_u1, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.tree_decl_u2, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_decl* } - %struct.tree_decl_u1 = type { i64 } - %struct.tree_decl_u2 = type { %struct.function* } - %struct.tree_node = type { %struct.tree_decl } - %struct.tree_type = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i32, i16, i8, i8, i32, %struct.tree_node*, %struct.tree_node*, %struct.rtunion, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_type* } - %struct.u = type { [1 x i64] } - %struct.var_refs_queue = type { %struct.rtx_def*, i32, i32, %struct.var_refs_queue* } - %struct.varasm_status = type opaque - %struct.varray_head_tag = type { i32, i32, i32, i8*, %struct.u } - %union.tree_ann_d = type opaque -@mode_class = external global [35 x i8] ; <[35 x i8]*> [#uses=3] - -define void @fold_builtin_classify() { -entry: - %tmp63 = load i32, i32* null ; <i32> [#uses=1] - switch i32 %tmp63, label %bb276 [ - i32 414, label %bb145 - i32 417, label %bb - ] -bb: ; preds = %entry - ret void -bb145: ; preds = %entry - %tmp146 = load %struct.tree_node*, %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] - %tmp148 = getelementptr %struct.tree_node, %struct.tree_node* %tmp146, i32 0, i32 0, i32 0, i32 1 ; <%struct.tree_node**> [#uses=1] - %tmp149 = load %struct.tree_node*, %struct.tree_node** %tmp148 ; <%struct.tree_node*> [#uses=1] - %tmp150 = bitcast %struct.tree_node* %tmp149 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] - %tmp151 = getelementptr %struct.tree_type, %struct.tree_type* %tmp150, i32 0, i32 6 ; <i16*> [#uses=1] - %tmp151.upgrd.1 = bitcast i16* %tmp151 to i32* ; <i32*> [#uses=1] - %tmp152 = load i32, i32* %tmp151.upgrd.1 ; <i32> [#uses=1] - %tmp154 = lshr i32 %tmp152, 16 ; <i32> [#uses=1] - %tmp154.mask = and i32 %tmp154, 127 ; <i32> [#uses=1] - %gep.upgrd.2 = zext i32 %tmp154.mask to i64 ; <i64> [#uses=1] - %tmp155 = getelementptr [35 x i8], [35 x i8]* @mode_class, i32 0, i64 %gep.upgrd.2 ; <i8*> [#uses=1] - %tmp156 = load i8, i8* %tmp155 ; <i8> [#uses=1] - %tmp157 = icmp eq i8 %tmp156, 4 ; <i1> [#uses=1] - br i1 %tmp157, label %cond_next241, label %cond_true158 -cond_true158: ; preds = %bb145 - %tmp172 = load %struct.tree_node*, %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] - %tmp174 = getelementptr %struct.tree_node, %struct.tree_node* %tmp172, i32 0, i32 0, i32 0, i32 1 ; <%struct.tree_node**> [#uses=1] - %tmp175 = load %struct.tree_node*, %struct.tree_node** %tmp174 ; <%struct.tree_node*> [#uses=1] - %tmp176 = bitcast %struct.tree_node* %tmp175 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] - %tmp177 = getelementptr %struct.tree_type, %struct.tree_type* %tmp176, i32 0, i32 6 ; <i16*> [#uses=1] - %tmp177.upgrd.3 = bitcast i16* %tmp177 to i32* ; <i32*> [#uses=1] - %tmp178 = load i32, i32* %tmp177.upgrd.3 ; <i32> [#uses=1] - %tmp180 = lshr i32 %tmp178, 16 ; <i32> [#uses=1] - %tmp180.mask = and i32 %tmp180, 127 ; <i32> [#uses=1] - %gep.upgrd.4 = zext i32 %tmp180.mask to i64 ; <i64> [#uses=1] - %tmp181 = getelementptr [35 x i8], [35 x i8]* @mode_class, i32 0, i64 %gep.upgrd.4 ; <i8*> [#uses=1] - %tmp182 = load i8, i8* %tmp181 ; <i8> [#uses=1] - %tmp183 = icmp eq i8 %tmp182, 8 ; <i1> [#uses=1] - br i1 %tmp183, label %cond_next241, label %cond_true184 -cond_true184: ; preds = %cond_true158 - %tmp185 = load %struct.tree_node*, %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] - %tmp187 = getelementptr %struct.tree_node, %struct.tree_node* %tmp185, i32 0, i32 0, i32 0, i32 1 ; <%struct.tree_node**> [#uses=1] - %tmp188 = load %struct.tree_node*, %struct.tree_node** %tmp187 ; <%struct.tree_node*> [#uses=1] - %tmp189 = bitcast %struct.tree_node* %tmp188 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] - %tmp190 = getelementptr %struct.tree_type, %struct.tree_type* %tmp189, i32 0, i32 6 ; <i16*> [#uses=1] - %tmp190.upgrd.5 = bitcast i16* %tmp190 to i32* ; <i32*> [#uses=1] - %tmp191 = load i32, i32* %tmp190.upgrd.5 ; <i32> [#uses=1] - %tmp193 = lshr i32 %tmp191, 16 ; <i32> [#uses=1] - %tmp193.mask = and i32 %tmp193, 127 ; <i32> [#uses=1] - %gep.upgrd.6 = zext i32 %tmp193.mask to i64 ; <i64> [#uses=1] - %tmp194 = getelementptr [35 x i8], [35 x i8]* @mode_class, i32 0, i64 %gep.upgrd.6 ; <i8*> [#uses=1] - %tmp195 = load i8, i8* %tmp194 ; <i8> [#uses=1] - %tmp196 = icmp eq i8 %tmp195, 4 ; <i1> [#uses=1] - br i1 %tmp196, label %cond_next241, label %cond_true197 -cond_true197: ; preds = %cond_true184 - ret void -cond_next241: ; preds = %cond_true184, %cond_true158, %bb145 - %tmp245 = load i32, i32* null ; <i32> [#uses=0] - ret void -bb276: ; preds = %entry - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll b/llvm/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll deleted file mode 100644 index 8f21b9bab9b..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll +++ /dev/null @@ -1,29 +0,0 @@ -; PR957 -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; CHECK-NOT: select - -@G = extern_weak global i32 - -define i32 @test(i32 %tmp) { -cond_false179: - %tmp181 = icmp eq i32 %tmp, 0 ; <i1> [#uses=1] - br i1 %tmp181, label %cond_true182, label %cond_next185 -cond_true182: ; preds = %cond_false179 - br label %cond_next185 -cond_next185: ; preds = %cond_true182, %cond_false179 - %d0.3 = phi i32 [ udiv (i32 1, i32 ptrtoint (i32* @G to i32)), %cond_true182 ], [ %tmp, %cond_false179 ] ; <i32> [#uses=1] - ret i32 %d0.3 -} - -define i32 @test2(i32 %tmp) { -cond_false179: - %tmp181 = icmp eq i32 %tmp, 0 ; <i1> [#uses=1] - br i1 %tmp181, label %cond_true182, label %cond_next185 -cond_true182: ; preds = %cond_false179 - br label %cond_next185 -cond_next185: ; preds = %cond_true182, %cond_false179 - %d0.3 = phi i32 [ udiv (i32 1, i32 ptrtoint (i32* @G to i32)), %cond_true182 ], [ %tmp, %cond_false179 ] ; <i32> [#uses=1] - call i32 @test( i32 4 ) ; <i32>:0 [#uses=0] - ret i32 %d0.3 -} diff --git a/llvm/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll b/llvm/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll deleted file mode 100644 index dcf241255d8..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll +++ /dev/null @@ -1,131 +0,0 @@ -; RUN: opt < %s -simplifycfg | llvm-dis -; END. - -; ModuleID = '2006-12-08-Ptr-ICmp-Branch.ll' -target datalayout = "e-p:32:32" -target triple = "i686-pc-linux-gnu" - %struct.FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct.FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i32, i32, [40 x i8] } - %struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct.FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i32, i32, [40 x i8] } - %struct._IO_marker = type { %struct._IO_marker*, %struct.FILE*, i32 } - %struct.charsequence = type { i8*, i32, i32 } - %struct.trie_s = type { [26 x %struct.trie_s*], i32 } -@str = external global [14 x i8] ; <[14 x i8]*> [#uses=0] -@str.upgrd.1 = external global [32 x i8] ; <[32 x i8]*> [#uses=0] -@str.upgrd.2 = external global [12 x i8] ; <[12 x i8]*> [#uses=0] -@C.0.2294 = external global %struct.charsequence ; <%struct.charsequence*> [#uses=3] -@t = external global %struct.trie_s* ; <%struct.trie_s**> [#uses=0] -@str.upgrd.3 = external global [3 x i8] ; <[3 x i8]*> [#uses=0] -@str.upgrd.4 = external global [26 x i8] ; <[26 x i8]*> [#uses=0] - -declare void @charsequence_reset(%struct.charsequence*) - -declare void @free(i8*) - -declare void @charsequence_push(%struct.charsequence*, i8) - -declare i8* @charsequence_val(%struct.charsequence*) - -declare i32 @_IO_getc(%struct.FILE*) - -declare i32 @tolower(i32) - -declare %struct.trie_s* @trie_insert(%struct.trie_s*, i8*) - -declare i32 @feof(%struct.FILE*) - -define void @addfile(%struct.trie_s* %t, %struct.FILE* %f) { -entry: - %t_addr = alloca %struct.trie_s* ; <%struct.trie_s**> [#uses=2] - %f_addr = alloca %struct.FILE* ; <%struct.FILE**> [#uses=3] - %c = alloca i8, align 1 ; <i8*> [#uses=7] - %wstate = alloca i32, align 4 ; <i32*> [#uses=4] - %cs = alloca %struct.charsequence, align 16 ; <%struct.charsequence*> [#uses=7] - %str = alloca i8*, align 4 ; <i8**> [#uses=3] - %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] - store %struct.trie_s* %t, %struct.trie_s** %t_addr - store %struct.FILE* %f, %struct.FILE** %f_addr - store i32 0, i32* %wstate - %tmp = getelementptr %struct.charsequence, %struct.charsequence* %cs, i64 0, i32 0 ; <i8**> [#uses=1] - %tmp1 = getelementptr %struct.charsequence, %struct.charsequence* @C.0.2294, i64 0, i32 0 ; <i8**> [#uses=1] - %tmp.upgrd.5 = load i8*, i8** %tmp1 ; <i8*> [#uses=1] - store i8* %tmp.upgrd.5, i8** %tmp - %tmp.upgrd.6 = getelementptr %struct.charsequence, %struct.charsequence* %cs, i64 0, i32 1 ; <i32*> [#uses=1] - %tmp2 = getelementptr %struct.charsequence, %struct.charsequence* @C.0.2294, i64 0, i32 1 ; <i32*> [#uses=1] - %tmp.upgrd.7 = load i32, i32* %tmp2 ; <i32> [#uses=1] - store i32 %tmp.upgrd.7, i32* %tmp.upgrd.6 - %tmp3 = getelementptr %struct.charsequence, %struct.charsequence* %cs, i64 0, i32 2 ; <i32*> [#uses=1] - %tmp4 = getelementptr %struct.charsequence, %struct.charsequence* @C.0.2294, i64 0, i32 2 ; <i32*> [#uses=1] - %tmp5 = load i32, i32* %tmp4 ; <i32> [#uses=1] - store i32 %tmp5, i32* %tmp3 - br label %bb33 -bb: ; preds = %bb33 - %tmp.upgrd.8 = load %struct.FILE*, %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] - %tmp.upgrd.9 = call i32 @_IO_getc( %struct.FILE* %tmp.upgrd.8 ) ; <i32> [#uses=1] - %tmp6 = call i32 @tolower( i32 %tmp.upgrd.9 ) ; <i32> [#uses=1] - %tmp6.upgrd.10 = trunc i32 %tmp6 to i8 ; <i8> [#uses=1] - store i8 %tmp6.upgrd.10, i8* %c - %tmp7 = load i32, i32* %wstate ; <i32> [#uses=1] - %tmp.upgrd.11 = icmp ne i32 %tmp7, 0 ; <i1> [#uses=1] - br i1 %tmp.upgrd.11, label %cond_true, label %cond_false -cond_true: ; preds = %bb - %tmp.upgrd.12 = load i8, i8* %c ; <i8> [#uses=1] - %tmp8 = icmp sle i8 %tmp.upgrd.12, 96 ; <i1> [#uses=1] - br i1 %tmp8, label %cond_true9, label %cond_next -cond_true9: ; preds = %cond_true - br label %bb16 -cond_next: ; preds = %cond_true - %tmp10 = load i8, i8* %c ; <i8> [#uses=1] - %tmp11 = icmp sgt i8 %tmp10, 122 ; <i1> [#uses=1] - br i1 %tmp11, label %cond_true12, label %cond_next13 -cond_true12: ; preds = %cond_next - br label %bb16 -cond_next13: ; preds = %cond_next - %tmp14 = load i8, i8* %c ; <i8> [#uses=1] - %tmp14.upgrd.13 = sext i8 %tmp14 to i32 ; <i32> [#uses=1] - %tmp1415 = trunc i32 %tmp14.upgrd.13 to i8 ; <i8> [#uses=1] - call void @charsequence_push( %struct.charsequence* %cs, i8 %tmp1415 ) - br label %bb21 -bb16: ; preds = %cond_true12, %cond_true9 - %tmp17 = call i8* @charsequence_val( %struct.charsequence* %cs ) ; <i8*> [#uses=1] - store i8* %tmp17, i8** %str - %tmp.upgrd.14 = load %struct.trie_s*, %struct.trie_s** %t_addr ; <%struct.trie_s*> [#uses=1] - %tmp18 = load i8*, i8** %str ; <i8*> [#uses=1] - %tmp19 = call %struct.trie_s* @trie_insert( %struct.trie_s* %tmp.upgrd.14, i8* %tmp18 ) ; <%struct.trie_s*> [#uses=0] - %tmp20 = load i8*, i8** %str ; <i8*> [#uses=1] - call void @free( i8* %tmp20 ) - store i32 0, i32* %wstate - br label %bb21 -bb21: ; preds = %bb16, %cond_next13 - br label %cond_next32 -cond_false: ; preds = %bb - %tmp22 = load i8, i8* %c ; <i8> [#uses=1] - %tmp23 = icmp sgt i8 %tmp22, 96 ; <i1> [#uses=1] - br i1 %tmp23, label %cond_true24, label %cond_next31 -cond_true24: ; preds = %cond_false - %tmp25 = load i8, i8* %c ; <i8> [#uses=1] - %tmp26 = icmp sle i8 %tmp25, 122 ; <i1> [#uses=1] - br i1 %tmp26, label %cond_true27, label %cond_next30 -cond_true27: ; preds = %cond_true24 - call void @charsequence_reset( %struct.charsequence* %cs ) - %tmp28 = load i8, i8* %c ; <i8> [#uses=1] - %tmp28.upgrd.15 = sext i8 %tmp28 to i32 ; <i32> [#uses=1] - %tmp2829 = trunc i32 %tmp28.upgrd.15 to i8 ; <i8> [#uses=1] - call void @charsequence_push( %struct.charsequence* %cs, i8 %tmp2829 ) - store i32 1, i32* %wstate - br label %cond_next30 -cond_next30: ; preds = %cond_true27, %cond_true24 - br label %cond_next31 -cond_next31: ; preds = %cond_next30, %cond_false - br label %cond_next32 -cond_next32: ; preds = %cond_next31, %bb21 - br label %bb33 -bb33: ; preds = %cond_next32, %entry - %tmp34 = load %struct.FILE*, %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] - %tmp35 = call i32 @feof( %struct.FILE* %tmp34 ) ; <i32> [#uses=1] - %tmp36 = icmp eq i32 %tmp35, 0 ; <i1> [#uses=1] - br i1 %tmp36, label %bb, label %bb37 -bb37: ; preds = %bb33 - br label %return -return: ; preds = %bb37 - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/2007-11-22-InvokeNoUnwind.ll b/llvm/test/Transforms/SimplifyCFG/2007-11-22-InvokeNoUnwind.ll deleted file mode 100644 index c38d71ccd28..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2007-11-22-InvokeNoUnwind.ll +++ /dev/null @@ -1,20 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; CHECK-NOT: invoke - -declare i32 @func(i8*) nounwind - -define i32 @test() personality i32 (...)* @__gxx_personality_v0 { - invoke i32 @func( i8* null ) - to label %Cont unwind label %Other ; <i32>:1 [#uses=0] - -Cont: ; preds = %0 - ret i32 0 - -Other: ; preds = %0 - landingpad { i8*, i32 } - catch i8* null - ret i32 1 -} - -declare i32 @__gxx_personality_v0(...) diff --git a/llvm/test/Transforms/SimplifyCFG/2007-12-21-Crash.ll b/llvm/test/Transforms/SimplifyCFG/2007-12-21-Crash.ll deleted file mode 100644 index 99041ede5d9..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2007-12-21-Crash.ll +++ /dev/null @@ -1,37 +0,0 @@ -;RUN: opt < %s -simplifycfg -disable-output -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" - -define i32 @bork() nounwind { -entry: - br label %bb5.outer - -bb5.outer.loopexit: ; preds = %bb5 - br label %bb5.outer - -bb5.outer: ; preds = %bb5.outer.loopexit, %entry - %undo.0.ph = phi i32 [ 0, %entry ], [ 1, %bb5.outer.loopexit ] ; <i32> [#uses=1] - br label %bb5 - -bb5: ; preds = %bb5, %bb5.outer - %tmp6 = tail call i32 (...) @foo( ) nounwind ; <i32> [#uses=1] - switch i32 %tmp6, label %bb13 [ - i32 -1, label %bb10 - i32 102, label %bb5 - i32 110, label %bb5.outer.loopexit - ] - -bb10: ; preds = %bb5 - %tmp12 = tail call i32 (...) @bar( i32 %undo.0.ph ) nounwind ; <i32> [#uses=0] - br label %UnifiedReturnBlock - -bb13: ; preds = %bb5 - br label %UnifiedReturnBlock - -UnifiedReturnBlock: ; preds = %bb13, %bb10 - %UnifiedRetVal = phi i32 [ 1, %bb10 ], [ 258, %bb13 ] ; <i32> [#uses=1] - ret i32 %UnifiedRetVal -} - -declare i32 @foo(...) - -declare i32 @bar(...) diff --git a/llvm/test/Transforms/SimplifyCFG/2008-01-02-hoist-fp-add.ll b/llvm/test/Transforms/SimplifyCFG/2008-01-02-hoist-fp-add.ll deleted file mode 100644 index 7625d935ab3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-01-02-hoist-fp-add.ll +++ /dev/null @@ -1,27 +0,0 @@ -; The phi should not be eliminated in this case, because the divide op could trap. -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" -target triple = "i686-apple-darwin8" -@G = weak global i32 0, align 8 ; <i32*> [#uses=2] - -define void @test(i32 %X, i32 %Y, i32 %Z) { -entry: - %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] - %tmp = load i32, i32* @G, align 8 ; <i32> [#uses=2] - %tmp3 = icmp eq i32 %X, %Y ; <i1> [#uses=1] - %tmp34 = zext i1 %tmp3 to i8 ; <i8> [#uses=1] - %toBool = icmp ne i8 %tmp34, 0 ; <i1> [#uses=1] - br i1 %toBool, label %cond_true, label %cond_next - -cond_true: ; preds = %entry - %tmp7 = udiv i32 %tmp, %Z ; <i32> [#uses=1] - br label %cond_next - -cond_next: ; preds = %cond_true, %entry -; CHECK: = phi i32 - %F.0 = phi i32 [ %tmp, %entry ], [ %tmp7, %cond_true ] ; <i32> [#uses=1] - store i32 %F.0, i32* @G, align 8 - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/2008-05-16-PHIBlockMerge.ll b/llvm/test/Transforms/SimplifyCFG/2008-05-16-PHIBlockMerge.ll deleted file mode 100644 index 21e9bc7b7f4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-05-16-PHIBlockMerge.ll +++ /dev/null @@ -1,131 +0,0 @@ -; RUN: opt < %s -simplifycfg -S > %t -; RUN: not grep "^BB.tomerge" %t -; RUN: grep "^BB.nomerge" %t | count 4 - -; ModuleID = '<stdin>' -declare i1 @foo() - -declare i1 @bar(i32) - -; 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't be merged (for keeping canonical loop structures) -define void @c() { -entry: - br label %BB.nomerge - -BB.nomerge: ; 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.nomerge ], [ 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.nomerge, 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't be merged (for keeping canonical loop structures) -define void @d() { -entry: - br label %BB.nomerge - -BB.nomerge: ; 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.nomerge ], [ 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.nomerge, label %Succ - -Exit: ; preds = %Succ - ret void -} - -; This function can be merged -define void @e() { -entry: - br label %Succ - -Succ: ; 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 %BB.tomerge - -BB.tomerge: ; 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 %Succ, label %Exit - -Exit: ; preds = %Use, %Succ - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/2008-07-13-InfLoopMiscompile.ll b/llvm/test/Transforms/SimplifyCFG/2008-07-13-InfLoopMiscompile.ll deleted file mode 100644 index dee2e9b3294..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-07-13-InfLoopMiscompile.ll +++ /dev/null @@ -1,55 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; PR2540 -; Outval should end up with a select from 0/2, not all constants. - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" -target triple = "i386-pc-linux-gnu" -@g_37 = common global i32 0 ; <i32*> [#uses=1] -@.str = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1] - -define i32 @main() nounwind { -; CHECK-LABEL: @main( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[L:%.*]] = load i32, i32* @g_37, align 4 -; CHECK-NEXT: [[CMPA:%.*]] = icmp ne i32 [[L]], 0 -; CHECK-NEXT: br i1 [[CMPA]], label %func_1.exit, label %mooseblock -; CHECK: mooseblock: -; CHECK-NEXT: [[CMPB:%.*]] = icmp eq i1 [[CMPA]], false -; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPB]], [[CMPA]] -; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPB]], i32 0, i32 2 -; CHECK-NEXT: br i1 [[BRMERGE]], label %func_1.exit, label %infloop -; CHECK: func_1.exit: -; CHECK-NEXT: [[OUTVAL:%.*]] = phi i32 [ 1, %entry ], [ [[DOTMUX]], %mooseblock ] -; CHECK-NEXT: [[POUT:%.*]] = tail call i32 (i8*, ...) @printf -; CHECK-NEXT: ret i32 0 -; CHECK: infloop: -; CHECK-NEXT: br label %infloop -; -entry: - %l = load i32, i32* @g_37, align 4 ; <i32> [#uses=1] - %cmpa = icmp ne i32 %l, 0 ; <i1> [#uses=3] - br i1 %cmpa, label %func_1.exit, label %mooseblock - -mooseblock: ; preds = %entry - %cmpb = icmp eq i1 %cmpa, false ; <i1> [#uses=2] - br i1 %cmpb, label %monkeyblock, label %beeblock - -monkeyblock: ; preds = %monkeyblock, %mooseblock - br i1 %cmpb, label %cowblock, label %monkeyblock - -beeblock: ; preds = %beeblock, %mooseblock - br i1 %cmpa, label %cowblock, label %beeblock - -cowblock: ; preds = %beeblock, %monkeyblock - %cowval = phi i32 [ 2, %beeblock ], [ 0, %monkeyblock ] ; <i32> [#uses=1] - br label %func_1.exit - -func_1.exit: ; preds = %cowblock, %entry - %outval = phi i32 [ %cowval, %cowblock ], [ 1, %entry ] ; <i32> [#uses=1] - %pout = tail call i32 (i8*, ...) @printf( i8* noalias getelementptr ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %outval ) nounwind ; <i32> [#uses=0] - ret i32 0 -} - -declare i32 @printf(i8*, ...) nounwind - diff --git a/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll b/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll deleted file mode 100644 index 6b216f598ef..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll +++ /dev/null @@ -1,60 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; PR 2777 -@g_103 = common global i32 0 ; <i32*> [#uses=1] - -define i32 @func_127(i32 %p_129) nounwind { -entry: - load i32, i32* @g_103, align 4 ; <i32>:0 [#uses=1] - icmp eq i32 %0, 0 ; <i1>:1 [#uses=2] - br i1 %1, label %bb6.preheader, label %entry.return_crit_edge - -entry.return_crit_edge: ; preds = %entry - br label %return - -bb6.preheader: ; preds = %entry - br i1 %1, label %bb6.preheader.split.us, label %bb6.preheader.split - -bb6.preheader.split.us: ; preds = %bb6.preheader - br label %return.loopexit.split - -bb6.preheader.split: ; preds = %bb6.preheader - br label %bb6 - -bb6: ; preds = %bb17.bb6_crit_edge, %bb6.preheader.split - %indvar35 = phi i32 [ 0, %bb6.preheader.split ], [ %indvar.next36, %bb17.bb6_crit_edge ] ; <i32> [#uses=1] - %p_129_addr.3.reg2mem.0 = phi i32 [ %p_129_addr.2, %bb17.bb6_crit_edge ], [ %p_129, %bb6.preheader.split ] ; <i32> [#uses=3] - icmp eq i32 %p_129_addr.3.reg2mem.0, 0 ; <i1>:2 [#uses=1] - br i1 %2, label %bb6.bb17_crit_edge, label %bb8 - -bb6.bb17_crit_edge: ; preds = %bb6 - br label %bb17 - -bb8: ; preds = %bb6 - br label %bb13 - -bb13: ; preds = %bb8 - br label %bb17 - -bb17: ; preds = %bb13, %bb6.bb17_crit_edge - %p_129_addr.2 = phi i32 [ %p_129_addr.3.reg2mem.0, %bb13 ], [ %p_129_addr.3.reg2mem.0, %bb6.bb17_crit_edge ] ; <i32> [#uses=1] - %indvar.next36 = add i32 %indvar35, 1 ; <i32> [#uses=2] - %exitcond37 = icmp eq i32 %indvar.next36, -1 ; <i1> [#uses=1] - br i1 %exitcond37, label %return.loopexit, label %bb17.bb6_crit_edge - -bb17.bb6_crit_edge: ; preds = %bb17 - br label %bb6 - -return.loopexit: ; preds = %bb17 - br label %return.loopexit.split - -return.loopexit.split: ; preds = %return.loopexit, %bb6.preheader.split.us - br label %return - -return: ; preds = %return.loopexit.split, %entry.return_crit_edge - ret i32 1 -} - -define i32 @func_135(i8 zeroext %p_137, i32 %p_138, i32 %p_140) nounwind { -entry: - ret i32 undef -} diff --git a/llvm/test/Transforms/SimplifyCFG/2008-09-17-SpeculativeHoist.ll b/llvm/test/Transforms/SimplifyCFG/2008-09-17-SpeculativeHoist.ll deleted file mode 100644 index f864184eb84..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-09-17-SpeculativeHoist.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; PR 2800 - -define void @foo() { -start: - %tmp = call i1 @bar( ) ; <i1> [#uses=4] - br i1 %tmp, label %brtrue, label %brfalse - -brtrue: ; preds = %start - %tmpnew = and i1 %tmp, %tmp ; <i1> [#uses=1] - br label %brfalse - -brfalse: ; preds = %brtrue, %start - %andandtmp.0 = phi i1 [ %tmp, %start ], [ %tmpnew, %brtrue ] ; <i1> [#uses=0] - ret void -} - -declare i1 @bar() diff --git a/llvm/test/Transforms/SimplifyCFG/2008-10-03-SpeculativelyExecuteBeforePHI.ll b/llvm/test/Transforms/SimplifyCFG/2008-10-03-SpeculativelyExecuteBeforePHI.ll deleted file mode 100644 index bb137c1babc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-10-03-SpeculativelyExecuteBeforePHI.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: opt < %s -simplifycfg -; PR2855 - -define i32 @_Z1fPii(i32* %b, i32 %f) nounwind { -entry: - br label %bb - -bb: ; preds = %bb9, %bb7, %bb, %entry - %__c2.2 = phi i32 [ undef, %entry ], [ %__c2.1, %bb7 ], [ %__c2.1, %bb9 ] ; <i32> [#uses=2] - %s.0 = phi i32 [ 0, %entry ], [ 0, %bb7 ], [ %2, %bb9 ] ; <i32> [#uses=1] - br label %bb1 - -bb1: ; preds = %bb - %0 = icmp slt i32 0, %f ; <i1> [#uses=1] - br i1 %0, label %bb3, label %bb6 - -bb3: ; preds = %bb1 - %1 = icmp eq i32 0, 0 ; <i1> [#uses=1] - br i1 %1, label %bb6, label %bb5 - -bb5: ; preds = %bb3 - br label %bb7 - -bb6: ; preds = %bb3, %bb1 - %__c2.0 = phi i32 [ 0, %bb3 ], [ %__c2.2, %bb1 ] ; <i32> [#uses=1] - br label %bb7 - -bb7: ; preds = %bb6, %bb5 - %__c2.1 = phi i32 [ 0, %bb5 ], [ %__c2.0, %bb6 ] ; <i32> [#uses=2] - %iftmp.1.0 = phi i1 [ false, %bb5 ], [ true, %bb6 ] ; <i1> [#uses=1] - br i1 %iftmp.1.0, label %bb, label %bb9 - -bb9: ; preds = %bb7 - %2 = add i32 %s.0, 2 ; <i32> [#uses=1] - br label %bb -} diff --git a/llvm/test/Transforms/SimplifyCFG/2008-12-06-SingleEntryPhi.ll b/llvm/test/Transforms/SimplifyCFG/2008-12-06-SingleEntryPhi.ll deleted file mode 100644 index d3c7c320cee..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-12-06-SingleEntryPhi.ll +++ /dev/null @@ -1,13 +0,0 @@ -; RUN: opt < %s -simplifycfg | llvm-dis -define i32 @test() { -entry: - br label %T -T: - %C = phi i1 [false, %entry] - br i1 %C, label %X, label %Y -X: - ret i32 2 -Y: - add i32 1, 2 - ret i32 1 -} diff --git a/llvm/test/Transforms/SimplifyCFG/2008-12-16-DCECond.ll b/llvm/test/Transforms/SimplifyCFG/2008-12-16-DCECond.ll deleted file mode 100644 index 4fc21d94223..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2008-12-16-DCECond.ll +++ /dev/null @@ -1,46 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep icmp -; ModuleID = '/tmp/x.bc' -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" -target triple = "i686-pc-linux-gnu" - -define i32 @x(i32 %x) { -entry: - %cmp = icmp eq i32 %x, 8 ; <i1> [#uses=1] - br i1 %cmp, label %ifthen, label %ifend - -ifthen: ; preds = %entry - %call = call i32 (...) @foo() ; <i32> [#uses=0] - br label %ifend - -ifend: ; preds = %ifthen, %entry - %cmp2 = icmp ne i32 %x, 8 ; <i1> [#uses=1] - br i1 %cmp2, label %ifthen3, label %ifend5 - -ifthen3: ; preds = %ifend - %call4 = call i32 (...) @foo() ; <i32> [#uses=0] - br label %ifend5 - -ifend5: ; preds = %ifthen3, %ifend - %cmp7 = icmp eq i32 %x, 9 ; <i1> [#uses=1] - br i1 %cmp7, label %ifthen8, label %ifend10 - -ifthen8: ; preds = %ifend5 - %call9 = call i32 (...) @bar() ; <i32> [#uses=0] - br label %ifend10 - -ifend10: ; preds = %ifthen8, %ifend5 - %cmp12 = icmp ne i32 %x, 9 ; <i1> [#uses=1] - br i1 %cmp12, label %ifthen13, label %ifend15 - -ifthen13: ; preds = %ifend10 - %call14 = call i32 (...) @bar() ; <i32> [#uses=0] - br label %ifend15 - -ifend15: ; preds = %ifthen13, %ifend10 - ret i32 0 -} - -declare i32 @foo(...) - -declare i32 @bar(...) - diff --git a/llvm/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll b/llvm/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll deleted file mode 100644 index c6ae6accd7c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll +++ /dev/null @@ -1,30 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; PR3016 -; Dead use caused invariant violation. - -define i32 @func_105(i1 %tmp5, i1 %tmp7) nounwind { -BB: - br i1 true, label %BB2, label %BB1 - -BB1: ; preds = %BB - br label %BB2 - -BB2: ; preds = %BB1, %BB - %tmp3 = phi i1 [ true, %BB ], [ false, %BB1 ] ; <i1> [#uses=1] - br label %BB9 - -BB9: ; preds = %BB11, %BB2 - %tmp10 = phi i32 [ 0, %BB2 ], [ %tmp12, %BB11 ] ; <i32> [#uses=1] - br i1 %tmp5, label %BB11, label %BB13 - -BB11: ; preds = %BB13, %BB9 - %tmp12 = phi i32 [ 0, %BB13 ], [ %tmp10, %BB9 ] ; <i32> [#uses=2] - br i1 %tmp3, label %BB9, label %BB20 - -BB13: ; preds = %BB13, %BB9 - %tmp14 = phi i32 [ 0, %BB9 ], [ %tmp14, %BB13 ] ; <i32> [#uses=1] - br i1 %tmp7, label %BB13, label %BB11 - -BB20: ; preds = %BB11 - ret i32 %tmp12 -} diff --git a/llvm/test/Transforms/SimplifyCFG/2009-05-12-externweak.ll b/llvm/test/Transforms/SimplifyCFG/2009-05-12-externweak.ll deleted file mode 100644 index faf3f5f8b2a..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2009-05-12-externweak.ll +++ /dev/null @@ -1,47 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep select -; ModuleID = '<stdin>' -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" -target triple = "i386-apple-darwin10.0" -module asm ".globl _foo" -module asm "_foo: ret" -module asm ".globl _i" -module asm ".set _i, 0" -@i = extern_weak global i32 ; <i32*> [#uses=2] -@j = common global i32 0 ; <i32*> [#uses=1] -@ed = common global double 0.000000e+00, align 8 ; <double*> [#uses=1] - -define i32 @main() nounwind ssp { -entry: - br label %bb4 - -bb: ; preds = %bb4 - br i1 icmp ne (i32* @i, i32* null), label %bb1, label %bb2 - -bb1: ; preds = %bb - %0 = load i32, i32* @i, align 4 ; <i32> [#uses=1] - br label %bb3 - -bb2: ; preds = %bb - br label %bb3 - -bb3: ; preds = %bb2, %bb1 - %storemerge = phi i32 [ %0, %bb1 ], [ 0, %bb2 ] ; <i32> [#uses=2] - store i32 %storemerge, i32* @j - %1 = sitofp i32 %storemerge to double ; <double> [#uses=1] - %2 = call double @sin(double %1) nounwind readonly ; <double> [#uses=1] - %3 = fadd double %2, %d.0 ; <double> [#uses=1] - %4 = add i32 %l.0, 1 ; <i32> [#uses=1] - br label %bb4 - -bb4: ; preds = %bb3, %entry - %d.0 = phi double [ undef, %entry ], [ %3, %bb3 ] ; <double> [#uses=2] - %l.0 = phi i32 [ 0, %entry ], [ %4, %bb3 ] ; <i32> [#uses=2] - %5 = icmp sgt i32 %l.0, 99 ; <i1> [#uses=1] - br i1 %5, label %bb5, label %bb - -bb5: ; preds = %bb4 - store double %d.0, double* @ed, align 8 - ret i32 0 -} - -declare double @sin(double) nounwind readonly diff --git a/llvm/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll b/llvm/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll deleted file mode 100644 index d545739bc74..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt -simplifycfg -disable-output < %s -; END. -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 triple = "x86_64-unknown-linux-gnu" - -declare void @bar(i32) - -define void @foo() personality i32 (...)* @__gxx_personality_v0 { -entry: - invoke void @bar(i32 undef) - to label %r unwind label %u - -r: ; preds = %entry - ret void - -u: ; preds = %entry - %val = landingpad { i8*, i32 } - cleanup - resume { i8*, i32 } %val -} - -declare i32 @__gxx_personality_v0(...) diff --git a/llvm/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll b/llvm/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll deleted file mode 100644 index 329774e2242..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll +++ /dev/null @@ -1,31 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; PR9420 - -; Note that the crash in PR9420 test is sensitive to the ordering of -; the transformations done by SimplifyCFG, so this test is likely to rot -; quickly. - -define noalias i8* @func_29() nounwind { -; CHECK: entry: -; CHECK-NEXT: unreachable -entry: - br label %for.cond - -for.cond: ; preds = %for.inc38, %entry - %p_34.addr.0 = phi i16 [ 1, %entry ], [ %conv40, %for.inc38 ] - br label %for.cond1 - -for.cond1: ; preds = %for.inc29, %for.cond - %p_32.addr.0 = phi i1 [ true, %for.cond ], [ true, %for.inc29 ] - br i1 %p_32.addr.0, label %for.body8, label %for.inc38 - -for.body8: ; preds = %for.cond1 - unreachable - -for.inc29: ; preds = %for.cond17 - br label %for.cond1 - -for.inc38: ; preds = %for.end32 - %conv40 = add i16 %p_34.addr.0, 1 - br label %for.cond -} diff --git a/llvm/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll b/llvm/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll deleted file mode 100644 index 111434b7fcd..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; CHECK-NOT: invoke -; CHECK-NOT: landingpad - -declare void @bar() - -define i32 @foo() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 { -entry: - invoke void @bar() - to label %return unwind label %lpad - -return: - ret i32 0 - -lpad: - %lp = landingpad { i8*, i32 } - cleanup - resume { i8*, i32 } %lp -} - -declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*) diff --git a/llvm/test/Transforms/SimplifyCFG/AArch64/cttz-ctlz.ll b/llvm/test/Transforms/SimplifyCFG/AArch64/cttz-ctlz.ll deleted file mode 100644 index e32d711143d..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/AArch64/cttz-ctlz.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: opt -S -simplifycfg -mtriple=aarch64 < %s | FileCheck %s - -define i32 @ctlz(i32 %A) { -; CHECK-LABEL: @ctlz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -define i32 @cttz(i32 %A) { -; CHECK-LABEL: @cttz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -declare i32 @llvm.ctlz.i32(i32, i1) -declare i32 @llvm.cttz.i32(i32, i1) - diff --git a/llvm/test/Transforms/SimplifyCFG/AArch64/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/AArch64/lit.local.cfg deleted file mode 100644 index 6642d287068..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/AArch64/lit.local.cfg +++ /dev/null @@ -1,5 +0,0 @@ -config.suffixes = ['.ll'] - -targets = set(config.root.targets_to_build.split()) -if not 'AArch64' in targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/AArch64/prefer-fma.ll b/llvm/test/Transforms/SimplifyCFG/AArch64/prefer-fma.ll deleted file mode 100644 index 7144da2d4bc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/AArch64/prefer-fma.ll +++ /dev/null @@ -1,73 +0,0 @@ -; RUN: opt < %s -mtriple=aarch64-linux-gnu -simplifycfg -enable-unsafe-fp-math -S >%t -; RUN: FileCheck %s < %t -; ModuleID = 't.cc' - -; Function Attrs: nounwind -define double @_Z3fooRdS_S_S_(double* dereferenceable(8) %x, double* dereferenceable(8) %y, double* dereferenceable(8) %a) #0 { -entry: - %0 = load double, double* %y, align 8 - %cmp = fcmp oeq double %0, 0.000000e+00 - %1 = load double, double* %x, align 8 - br i1 %cmp, label %if.then, label %if.else - -; fadd (const, (fmul x, y)) -if.then: ; preds = %entry -; CHECK-LABEL: if.then: -; CHECK: %3 = fmul fast double %1, %2 -; CHECK-NEXT: %mul = fadd fast double 1.000000e+00, %3 - %2 = load double, double* %a, align 8 - %3 = fmul fast double %1, %2 - %mul = fadd fast double 1.000000e+00, %3 - store double %mul, double* %y, align 8 - br label %if.end - -; fsub ((fmul x, y), z) -if.else: ; preds = %entry -; CHECK-LABEL: if.else: -; CHECK: %mul1 = fmul fast double %1, %2 -; CHECK-NEXT: %sub1 = fsub fast double %mul1, %0 - %4 = load double, double* %a, align 8 - %mul1 = fmul fast double %1, %4 - %sub1 = fsub fast double %mul1, %0 - %gep1 = getelementptr double, double* %y, i32 1 - store double %sub1, double* %gep1, align 8 - br label %if.end - -if.end: ; preds = %if.else, %if.then - %5 = load double, double* %y, align 8 - %cmp2 = fcmp oeq double %5, 2.000000e+00 - %6 = load double, double* %x, align 8 - br i1 %cmp2, label %if.then2, label %if.else2 - -; fsub (x, (fmul y, z)) -if.then2: ; preds = %entry -; CHECK-LABEL: if.then2: -; CHECK: %7 = fmul fast double %5, 3.000000e+00 -; CHECK-NEXT: %mul2 = fsub fast double %6, %7 - %7 = load double, double* %a, align 8 - %8 = fmul fast double %6, 3.0000000e+00 - %mul2 = fsub fast double %7, %8 - store double %mul2, double* %y, align 8 - br label %if.end2 - -; fsub (fneg((fmul x, y)), const) -if.else2: ; preds = %entry -; CHECK-LABEL: if.else2: -; CHECK: %mul3 = fmul fast double %5, 3.000000e+00 -; CHECK-NEXT: %neg = fsub fast double 0.000000e+00, %mul3 -; CHECK-NEXT: %sub2 = fsub fast double %neg, 3.000000e+00 - %mul3 = fmul fast double %6, 3.0000000e+00 - %neg = fsub fast double 0.0000000e+00, %mul3 - %sub2 = fsub fast double %neg, 3.0000000e+00 - store double %sub2, double* %y, align 8 - br label %if.end2 - -if.end2: ; preds = %if.else, %if.then - %9 = load double, double* %x, align 8 - %10 = load double, double* %y, align 8 - %add = fadd fast double %9, %10 - %11 = load double, double* %a, align 8 - %add2 = fadd fast double %add, %11 - ret double %add2 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/AMDGPU/cttz-ctlz.ll b/llvm/test/Transforms/SimplifyCFG/AMDGPU/cttz-ctlz.ll deleted file mode 100644 index dfefff90877..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/AMDGPU/cttz-ctlz.ll +++ /dev/null @@ -1,249 +0,0 @@ -; RUN: opt -S -simplifycfg -mtriple=amdgcn-unknown-unknown -mcpu=tahiti < %s | FileCheck -check-prefix=SI -check-prefix=ALL %s -; RUN: opt -S -simplifycfg -mtriple=amdgcn-unknown-unknown -mcpu=tonga < %s | FileCheck -check-prefix=SI -check-prefix=ALL %s - - -define i64 @test1(i64 %A) { -; ALL-LABEL: @test1( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTLZ]] -; SI-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - - -define i32 @test2(i32 %A) { -; ALL-LABEL: @test2( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTLZ]] -; SI-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - - -define signext i16 @test3(i16 signext %A) { -; ALL-LABEL: @test3( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 16, i16 [[CTLZ]] -; SI-NEXT: ret i16 [[SEL]] -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ] - ret i16 %cond -} - - -define i64 @test1b(i64 %A) { -; ALL-LABEL: @test1b( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTTZ]] -; SI-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - - -define i32 @test2b(i32 %A) { -; ALL-LABEL: @test2b( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTTZ]] -; SI-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - - -define signext i16 @test3b(i16 signext %A) { -; ALL-LABEL: @test3b( -; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) -; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 16, i16 [[CTTZ]] -; SI-NEXT: ret i16 [[SEL]] -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ] - ret i16 %cond -} - - -define i64 @test1c(i64 %A) { -; ALL-LABEL: @test1c( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 63, i64 [[CTLZ]] -; ALL-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 63, %entry ] - ret i64 %cond -} - -define i32 @test2c(i32 %A) { -; ALL-LABEL: @test2c( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 31, i32 [[CTLZ]] -; ALL-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 31, %entry ] - ret i32 %cond -} - - -define signext i16 @test3c(i16 signext %A) { -; ALL-LABEL: @test3c( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 15, i16 [[CTLZ]] -; ALL-NEXT: ret i16 [[SEL]] -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 15, %entry ] - ret i16 %cond -} - - -define i64 @test1d(i64 %A) { -; ALL-LABEL: @test1d( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 63, i64 [[CTTZ]] -; ALL-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 63, %entry ] - ret i64 %cond -} - - -define i32 @test2d(i32 %A) { -; ALL-LABEL: @test2d( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 31, i32 [[CTTZ]] -; ALL-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 31, %entry ] - ret i32 %cond -} - - -define signext i16 @test3d(i16 signext %A) { -; ALL-LABEL: @test3d( -; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) -; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 15, i16 [[CTTZ]] -; ALL-NEXT: ret i16 [[SEL]] -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 15, %entry ] - ret i16 %cond -} - - -declare i64 @llvm.ctlz.i64(i64, i1) -declare i32 @llvm.ctlz.i32(i32, i1) -declare i16 @llvm.ctlz.i16(i16, i1) -declare i64 @llvm.cttz.i64(i64, i1) -declare i32 @llvm.cttz.i32(i32, i1) -declare i16 @llvm.cttz.i16(i16, i1) diff --git a/llvm/test/Transforms/SimplifyCFG/AMDGPU/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/AMDGPU/lit.local.cfg deleted file mode 100644 index 2a665f06be7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/AMDGPU/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not 'AMDGPU' in config.root.targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/ARM/cttz-ctlz.ll b/llvm/test/Transforms/SimplifyCFG/ARM/cttz-ctlz.ll deleted file mode 100644 index ffcf2175091..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ARM/cttz-ctlz.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: opt -S -simplifycfg -mtriple=arm -mattr=+v6t2 < %s | FileCheck %s - -define i32 @ctlz(i32 %A) { -; CHECK-LABEL: @ctlz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -define i32 @cttz(i32 %A) { -; CHECK-LABEL: @cttz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -declare i32 @llvm.ctlz.i32(i32, i1) -declare i32 @llvm.cttz.i32(i32, i1) - diff --git a/llvm/test/Transforms/SimplifyCFG/ARM/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/ARM/lit.local.cfg deleted file mode 100644 index 5a3b8565213..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ARM/lit.local.cfg +++ /dev/null @@ -1,5 +0,0 @@ -config.suffixes = ['.ll'] - -targets = set(config.root.targets_to_build.split()) -if not 'ARM' in targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/ARM/select-trunc-i64.ll b/llvm/test/Transforms/SimplifyCFG/ARM/select-trunc-i64.ll deleted file mode 100644 index 9484de77db4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ARM/select-trunc-i64.ll +++ /dev/null @@ -1,25 +0,0 @@ -;RUN: opt -S -simplifycfg -mtriple=arm < %s | FileCheck %s -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" - -; CHECK-LABEL: select_trunc_i64 -; CHECK-NOT: br -; CHECK: select -; CHECK: select -define arm_aapcscc i32 @select_trunc_i64(i32 %a, i32 %b) { -entry: - %conv = sext i32 %a to i64 - %conv1 = sext i32 %b to i64 - %add = add nsw i64 %conv1, %conv - %cmp = icmp sgt i64 %add, 2147483647 - br i1 %cmp, label %cond.end7, label %cond.false - -cond.false: ; preds = %entry - %0 = icmp sgt i64 %add, -2147483648 - %cond = select i1 %0, i64 %add, i64 -2147483648 - %extract.t = trunc i64 %cond to i32 - br label %cond.end7 - -cond.end7: ; preds = %cond.false, %entry - %cond8.off0 = phi i32 [ 2147483647, %entry ], [ %extract.t, %cond.false ] - ret i32 %cond8.off0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table-constant-expr.ll b/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table-constant-expr.ll deleted file mode 100644 index 453a7686403..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table-constant-expr.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -target triple = "armv7a--none-eabi" - -; One of the phi node's values is too complex to be represented by a global -; variable, so we can't convert to a lookup table. - -; CHECK-NOT: @switch.table -; CHECK-NOT: load - -@g1 = external global i32, align 4 -@g2 = external global i32, align 4 -@g3 = external global i32, align 4 -@g4 = external thread_local global i32, align 4 - -define i32* @test3(i32 %n) { -entry: - switch i32 %n, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] - -sw.bb: - br label %return - -sw.bb1: - br label %return - -sw.bb2: - br label %return - -sw.default: - br label %return - -return: - %retval.0 = phi i32* [ @g4, %sw.default ], [ getelementptr inbounds (i32, i32* inttoptr (i32 mul (i32 ptrtoint (i32* @g3 to i32), i32 2) to i32*), i32 1), %sw.bb2 ], [ @g2, %sw.bb1 ], [ @g1, %sw.bb ] - ret i32* %retval.0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll b/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll deleted file mode 100644 index 501bc31bd0d..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll +++ /dev/null @@ -1,138 +0,0 @@ -; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=ropi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE - -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' -mtriple=arm -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' -mtriple=arm -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' -mtriple=arm -relocation-model=ropi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE - -; CHECK: @{{.*}} = private unnamed_addr constant [3 x i32] [i32 1234, i32 5678, i32 15532] -; ENABLE: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @c1, i32* @c2, i32* @c3] -; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @c1, i32* @c2, i32* @c3] -; ENABLE: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @g1, i32* @g2, i32* @g3] -; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @g1, i32* @g2, i32* @g3] -; ENABLE: @{{.*}} = private unnamed_addr constant [3 x i32 (i32, i32)*] [i32 (i32, i32)* @f1, i32 (i32, i32)* @f2, i32 (i32, i32)* @f3] -; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x i32 (i32, i32)*] [i32 (i32, i32)* @f1, i32 (i32, i32)* @f2, i32 (i32, i32)* @f3] - -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -target triple = "armv7a--none-eabi" - -define i32 @test1(i32 %n) { -entry: - switch i32 %n, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] - -sw.bb: - br label %return - -sw.bb1: - br label %return - -sw.bb2: - br label %return - -sw.default: - br label %return - -return: - %retval.0 = phi i32 [ 15498, %sw.default ], [ 15532, %sw.bb2 ], [ 5678, %sw.bb1 ], [ 1234, %sw.bb ] - ret i32 %retval.0 -} - -@c1 = external constant i32, align 4 -@c2 = external constant i32, align 4 -@c3 = external constant i32, align 4 -@c4 = external constant i32, align 4 - - -define i32* @test2(i32 %n) { -entry: - switch i32 %n, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] - -sw.bb: - br label %return - -sw.bb1: - br label %return - -sw.bb2: - br label %return - -sw.default: - br label %return - -return: - %retval.0 = phi i32* [ @c4, %sw.default ], [ @c3, %sw.bb2 ], [ @c2, %sw.bb1 ], [ @c1, %sw.bb ] - ret i32* %retval.0 -} - -@g1 = external global i32, align 4 -@g2 = external global i32, align 4 -@g3 = external global i32, align 4 -@g4 = external global i32, align 4 - -define i32* @test3(i32 %n) { -entry: - switch i32 %n, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] - -sw.bb: - br label %return - -sw.bb1: - br label %return - -sw.bb2: - br label %return - -sw.default: - br label %return - -return: - %retval.0 = phi i32* [ @g4, %sw.default ], [ @g3, %sw.bb2 ], [ @g2, %sw.bb1 ], [ @g1, %sw.bb ] - ret i32* %retval.0 -} - -declare i32 @f1(i32, i32) -declare i32 @f2(i32, i32) -declare i32 @f3(i32, i32) -declare i32 @f4(i32, i32) -declare i32 @f5(i32, i32) - -define i32 @test4(i32 %a, i32 %b, i32 %c) { -entry: - %cmp = icmp eq i32 %a, 1 - br i1 %cmp, label %cond.end11, label %cond.false - -cond.false: - %cmp1 = icmp eq i32 %a, 2 - br i1 %cmp1, label %cond.end11, label %cond.false3 - -cond.false3: - %cmp4 = icmp eq i32 %a, 3 - br i1 %cmp4, label %cond.end11, label %cond.false6 - -cond.false6: - %cmp7 = icmp eq i32 %a, 4 - %cond = select i1 %cmp7, i32 (i32, i32)* @f4, i32 (i32, i32)* @f5 - br label %cond.end11 - -cond.end11: - %cond12 = phi i32 (i32, i32)* [ @f1, %entry ], [ @f2, %cond.false ], [ %cond, %cond.false6 ], [ @f3, %cond.false3 ] - %call = call i32 %cond12(i32 %b, i32 %c) #2 - ret i32 %call -} diff --git a/llvm/test/Transforms/SimplifyCFG/BrUnwind.ll b/llvm/test/Transforms/SimplifyCFG/BrUnwind.ll deleted file mode 100644 index 14853642c09..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/BrUnwind.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | \ -; RUN: not grep "br label" - -define void @test(i1 %C) { - br i1 %C, label %A, label %B -A: ; preds = %0 - call void @test( i1 %C ) - br label %X -B: ; preds = %0 - call void @test( i1 %C ) - br label %X -X: ; preds = %B, %A - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/ConditionalTrappingConstantExpr.ll b/llvm/test/Transforms/SimplifyCFG/ConditionalTrappingConstantExpr.ll deleted file mode 100644 index 13cd8e5ad63..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ConditionalTrappingConstantExpr.ll +++ /dev/null @@ -1,67 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -@G = extern_weak global i32 - -; PR3354 -; Do not merge bb1 into the entry block, it might trap. - -define i32 @admiral(i32 %a, i32 %b) { -; CHECK-LABEL: @admiral( -; CHECK-NEXT: [[C:%.*]] = icmp sle i32 %a, %b -; CHECK-NEXT: br i1 [[C]], label %bb2, label %bb1 -; CHECK: bb1: -; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 sdiv (i32 -32768, i32 ptrtoint (i32* @G to i32)), 0 -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[D]], i32 927, i32 42 -; CHECK-NEXT: br label %bb2 -; CHECK: bb2: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 42, %0 ], [ [[DOT]], %bb1 ] -; CHECK-NEXT: ret i32 [[MERGE]] -; - %c = icmp sle i32 %a, %b - br i1 %c, label %bb2, label %bb1 -bb1: - %d = icmp sgt i32 sdiv (i32 -32768, i32 ptrtoint (i32* @G to i32)), 0 - br i1 %d, label %bb6, label %bb2 -bb2: - ret i32 42 -bb6: - ret i32 927 -} - -define i32 @ackbar(i1 %c) { -; CHECK-LABEL: @ackbar( -; CHECK-NEXT: br i1 %c, label %bb5, label %bb6 -; CHECK: bb5: -; CHECK-NEXT: [[DOT:%.*]] = select i1 icmp sgt (i32 sdiv (i32 32767, i32 ptrtoint (i32* @G to i32)), i32 0), i32 42, i32 927 -; CHECK-NEXT: br label %bb6 -; CHECK: bb6: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 42, %0 ], [ [[DOT]], %bb5 ] -; CHECK-NEXT: ret i32 [[MERGE]] -; - br i1 %c, label %bb5, label %bb6 -bb5: - br i1 icmp sgt (i32 sdiv (i32 32767, i32 ptrtoint (i32* @G to i32)), i32 0), label %bb6, label %bb7 -bb6: - ret i32 42 -bb7: - ret i32 927 -} - -; FP ops don't trap by default, so this is safe to hoist. - -define i32 @tarp(i1 %c) { -; CHECK-LABEL: @tarp( -; CHECK-NEXT: bb9: -; CHECK-NEXT: [[DOT:%.*]] = select i1 fcmp oeq (float fdiv (float 3.000000e+00, float sitofp (i32 ptrtoint (i32* @G to i32) to float)), float 1.000000e+00), i32 42, i32 927 -; CHECK-NEXT: [[MERGE:%.*]] = select i1 %c, i32 [[DOT]], i32 42 -; CHECK-NEXT: ret i32 [[MERGE]] -; - br i1 %c, label %bb8, label %bb9 -bb8: - br i1 fcmp oeq (float fdiv (float 3.0, float sitofp (i32 ptrtoint (i32* @G to i32) to float)), float 1.0), label %bb9, label %bb10 -bb9: - ret i32 42 -bb10: - ret i32 927 -} diff --git a/llvm/test/Transforms/SimplifyCFG/CoveredLookupTable.ll b/llvm/test/Transforms/SimplifyCFG/CoveredLookupTable.ll deleted file mode 100644 index e558956d502..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/CoveredLookupTable.ll +++ /dev/null @@ -1,49 +0,0 @@ -; RUN: opt -simplifycfg -switch-to-lookup -S %s | FileCheck %s -; RUN: opt -passes='simplify-cfg<switch-to-lookup>' -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/llvm/test/Transforms/SimplifyCFG/DeadSetCC.ll b/llvm/test/Transforms/SimplifyCFG/DeadSetCC.ll deleted file mode 100644 index c62560000ca..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/DeadSetCC.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | \ -; RUN: not grep "icmp eq" - -; Check that simplifycfg deletes a dead 'seteq' instruction when it -; folds a conditional branch into a switch instruction. - -declare void @foo() - -declare void @bar() - -define void @testcfg(i32 %V) { - %C = icmp eq i32 %V, 18 ; <i1> [#uses=1] - %D = icmp eq i32 %V, 180 ; <i1> [#uses=1] - %E = or i1 %C, %D ; <i1> [#uses=1] - br i1 %E, label %L1, label %Sw -Sw: ; preds = %0 - switch i32 %V, label %L1 [ - i32 15, label %L2 - i32 16, label %L2 - ] -L1: ; preds = %Sw, %0 - call void @foo( ) - ret void -L2: ; preds = %Sw, %Sw - call void @bar( ) - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll b/llvm/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll deleted file mode 100644 index 32a0202364d..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll +++ /dev/null @@ -1,21 +0,0 @@ -; Basic block #2 should not be merged into BB #3! -; -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @foo() - -define void @cprop_test12(i32* %data) { -bb0: - %reg108 = load i32, i32* %data ; <i32> [#uses=2] - %cond218 = icmp ne i32 %reg108, 5 ; <i1> [#uses=1] - br i1 %cond218, label %bb3, label %bb2 -bb2: ; preds = %bb0 - call void @foo( ) -; CHECK: br label %bb3 - br label %bb3 -bb3: ; preds = %bb2, %bb0 - %reg117 = phi i32 [ 110, %bb2 ], [ %reg108, %bb0 ] ; <i32> [#uses=1] - store i32 %reg117, i32* %data - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll b/llvm/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll deleted file mode 100644 index 6e8593755c7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll +++ /dev/null @@ -1,256 +0,0 @@ -; Test merging of blocks with phi nodes. -; -; 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 4 -; - -; ModuleID = '<stdin>' -declare i1 @foo() - -declare i1 @bar(i32) - -define i32 @test(i1 %a) { -Q: - br i1 %a, label %N, label %M -N: ; preds = %Q - br label %M -M: ; preds = %N, %Q - ; It's ok to merge N and M because the incoming values for W are the - ; same for both cases... - %W = phi i32 [ 2, %N ], [ 2, %Q ] ; <i32> [#uses=1] - %R = add i32 %W, 1 ; <i32> [#uses=1] - 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't be merged (for keeping canonical loop structures) -define void @c() { -entry: - br label %BB.nomerge - -BB.nomerge: ; 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.nomerge ], [ 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.nomerge, 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't be merged (for keeping canonical loop structures) -define void @d() { -entry: - br label %BB.nomerge - -BB.nomerge: ; 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.nomerge ], [ 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.nomerge, label %Succ - -Exit: ; preds = %Succ - ret void -} - -; This function can be merged -define void @e() { -entry: - br label %Succ - -Succ: ; 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 %BB.tomerge - -BB.tomerge: ; preds = %Succ - %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 %Succ, label %Exit - -Exit: ; preds = %Use, %Succ - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll b/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll deleted file mode 100644 index 169f3f629ea..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll +++ /dev/null @@ -1,123 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -forward-switch-cond=false -S | FileCheck %s --check-prefix=NO_FWD -; RUN: opt < %s -simplifycfg -forward-switch-cond=true -S | FileCheck %s --check-prefix=FWD - -; RUN: opt < %s -passes='simplify-cfg<no-forward-switch-cond>' -S | FileCheck %s --check-prefix=NO_FWD -; RUN: opt < %s -passes='simplify-cfg<forward-switch-cond>' -S | FileCheck %s --check-prefix=FWD - -; PR10131 - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" -target triple = "i386-pc-linux-gnu" - -define i32 @t(i32 %m) nounwind readnone { -; NO_FWD-LABEL: @t( -; NO_FWD-NEXT: entry: -; NO_FWD-NEXT: switch i32 [[M:%.*]], label [[SW_BB4:%.*]] [ -; NO_FWD-NEXT: i32 0, label [[RETURN:%.*]] -; NO_FWD-NEXT: i32 1, label [[SW_BB1:%.*]] -; NO_FWD-NEXT: i32 2, label [[SW_BB2:%.*]] -; NO_FWD-NEXT: i32 3, label [[SW_BB3:%.*]] -; NO_FWD-NEXT: ] -; NO_FWD: sw.bb1: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: sw.bb2: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: sw.bb3: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: sw.bb4: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: return: -; NO_FWD-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 4, [[SW_BB4]] ], [ 3, [[SW_BB3]] ], [ 2, [[SW_BB2]] ], [ 1, [[SW_BB1]] ], [ 0, [[ENTRY:%.*]] ] -; NO_FWD-NEXT: ret i32 [[RETVAL_0]] -; -; FWD-LABEL: @t( -; FWD-NEXT: entry: -; FWD-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[M:%.*]], 4 -; FWD-NEXT: [[M_:%.*]] = select i1 [[SWITCH]], i32 [[M]], i32 4 -; FWD-NEXT: ret i32 [[M_]] -; -entry: - switch i32 %m, label %sw.bb4 [ - i32 0, label %sw.bb0 - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] - -sw.bb0: ; preds = %entry - br label %return - -sw.bb1: ; preds = %entry - br label %return - -sw.bb2: ; preds = %entry - br label %return - -sw.bb3: ; preds = %entry - br label %return - -sw.bb4: ; preds = %entry - br label %return - -return: ; preds = %entry, %sw.bb4, %sw.bb3, %sw.bb2, %sw.bb1 - %retval.0 = phi i32 [ 4, %sw.bb4 ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 1, %sw.bb1 ], [ 0, %sw.bb0 ] - ret i32 %retval.0 -} - -; If 1 incoming phi value is a case constant of a switch, convert it to the switch condition: -; https://bugs.llvm.org/show_bug.cgi?id=34471 -; This then subsequently should allow squashing of the other trivial case blocks. - -define i32 @PR34471(i32 %x) { -; NO_FWD-LABEL: @PR34471( -; NO_FWD-NEXT: entry: -; NO_FWD-NEXT: switch i32 [[X:%.*]], label [[ELSE3:%.*]] [ -; NO_FWD-NEXT: i32 17, label [[RETURN:%.*]] -; NO_FWD-NEXT: i32 19, label [[IF19:%.*]] -; NO_FWD-NEXT: i32 42, label [[IF42:%.*]] -; NO_FWD-NEXT: ] -; NO_FWD: if19: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: if42: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: else3: -; NO_FWD-NEXT: br label [[RETURN]] -; NO_FWD: return: -; NO_FWD-NEXT: [[R:%.*]] = phi i32 [ [[X]], [[IF19]] ], [ [[X]], [[IF42]] ], [ 0, [[ELSE3]] ], [ 17, [[ENTRY:%.*]] ] -; NO_FWD-NEXT: ret i32 [[R]] -; -; FWD-LABEL: @PR34471( -; FWD-NEXT: entry: -; FWD-NEXT: switch i32 [[X:%.*]], label [[ELSE3:%.*]] [ -; FWD-NEXT: i32 17, label [[RETURN:%.*]] -; FWD-NEXT: i32 19, label [[RETURN]] -; FWD-NEXT: i32 42, label [[RETURN]] -; FWD-NEXT: ] -; FWD: else3: -; FWD-NEXT: br label [[RETURN]] -; FWD: return: -; FWD-NEXT: [[R:%.*]] = phi i32 [ 0, [[ELSE3]] ], [ [[X]], [[ENTRY:%.*]] ], [ [[X]], [[ENTRY]] ], [ [[X]], [[ENTRY]] ] -; FWD-NEXT: ret i32 [[R]] -; -entry: - switch i32 %x, label %else3 [ - i32 17, label %return - i32 19, label %if19 - i32 42, label %if42 - ] - -if19: - br label %return - -if42: - br label %return - -else3: - br label %return - -return: - %r = phi i32 [ %x, %if19 ], [ %x, %if42 ], [ 0, %else3 ], [ 17, %entry ] - ret i32 %r -} - diff --git a/llvm/test/Transforms/SimplifyCFG/Hexagon/disable-lookup-table.ll b/llvm/test/Transforms/SimplifyCFG/Hexagon/disable-lookup-table.ll deleted file mode 100644 index a10c67019f0..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/Hexagon/disable-lookup-table.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: opt -S -O2 < %s | FileCheck %s -check-prefix=DISABLE -; RUN: opt -S -hexagon-emit-lookup-tables=true -O2 < %s | FileCheck %s -check-prefix=DISABLE -; RUN: opt -S -hexagon-emit-lookup-tables=false -O2 < %s | FileCheck %s -check-prefix=DISABLE -; The attribute "no-jump-tables"="true" disables the generation of switch generated lookup tables - -; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [6 x i32] [i32 9, i32 20, i32 14, i32 22, i32 12, i32 5] - -target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" -target triple = "hexagon-unknown--elf" - -; Function Attrs: noinline nounwind -define i32 @foo(i32 %c) #0 { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - i32 46, label %sw.bb4 - i32 47, label %sw.bb5 - i32 48, label %sw.bb6 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.bb5: br label %return -sw.bb6: br label %return -sw.default: br label %return -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 -} - -attributes #0 = { noinline nounwind "no-jump-tables"="true"} diff --git a/llvm/test/Transforms/SimplifyCFG/Hexagon/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/Hexagon/lit.local.cfg deleted file mode 100644 index a1f0ecbf679..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/Hexagon/lit.local.cfg +++ /dev/null @@ -1,5 +0,0 @@ -config.suffixes = ['.ll'] - -targets = set(config.root.targets_to_build.split()) -if not 'Hexagon' in targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll b/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll deleted file mode 100644 index a568bba1d55..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll +++ /dev/null @@ -1,62 +0,0 @@ -; RUN: opt -S -O2 < %s | FileCheck %s -check-prefix=ENABLE -; RUN: opt -S -hexagon-emit-lookup-tables=true -O2 < %s | FileCheck %s -check-prefix=ENABLE -; RUN: opt -S -hexagon-emit-lookup-tables=false -O2 < %s | FileCheck %s -check-prefix=DISABLE - - -; ENABLE: @{{.*}} = private unnamed_addr constant [6 x i32] [i32 9, i32 20, i32 14, i32 22, i32 12, i32 5] -; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [6 x i32] [i32 9, i32 20, i32 14, i32 22, i32 12, i32 5] -; DISABLE : = phi i32 [ 19, %{{.*}} ], [ 5, %{{.*}} ], [ 12, %{{.*}} ], [ 22, %{{.*}} ], [ 14, %{{.*}} ], [ 20, %{{.*}} ], [ 9, %{{.*}} ] - -target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" -target triple = "hexagon-unknown--elf" - -; Function Attrs: noinline nounwind -define i32 @foo(i32 %x) #0 section ".tcm_text" { -entry: - %retval = alloca i32, align 4 - %x.addr = alloca i32, align 4 - store i32 %x, i32* %x.addr, align 4 - %0 = load i32, i32* %x.addr, align 4 - switch i32 %0, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - i32 4, label %sw.bb4 - i32 5, label %sw.bb5 - ] - -sw.bb: ; preds = %entry - store i32 9, i32* %retval, align 4 - br label %return - -sw.bb1: ; preds = %entry - store i32 20, i32* %retval, align 4 - br label %return - -sw.bb2: ; preds = %entry - store i32 14, i32* %retval, align 4 - br label %return - -sw.bb3: ; preds = %entry - store i32 22, i32* %retval, align 4 - br label %return - -sw.bb4: ; preds = %entry - store i32 12, i32* %retval, align 4 - br label %return - -sw.bb5: ; preds = %entry - store i32 5, i32* %retval, align 4 - br label %return - -sw.default: ; preds = %entry - store i32 19, i32* %retval, align 4 - br label %return - -return: ; preds = %sw.default, %sw.bb5, %sw.bb4, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb - %1 = load i32, i32* %retval, align 4 - ret i32 %1 -} - -attributes #0 = { noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv60" "target-features"="-hvx,-long-calls" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/llvm/test/Transforms/SimplifyCFG/HoistCode.ll b/llvm/test/Transforms/SimplifyCFG/HoistCode.ll deleted file mode 100644 index 9697e56a719..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/HoistCode.ll +++ /dev/null @@ -1,11 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep br - -define void @foo(i1 %C, i32* %P) { - br i1 %C, label %T, label %F -T: ; preds = %0 - store i32 7, i32* %P - ret void -F: ; preds = %0 - store i32 7, i32* %P - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/InfLoop.ll b/llvm/test/Transforms/SimplifyCFG/InfLoop.ll deleted file mode 100644 index a56076e42ce..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/InfLoop.ll +++ /dev/null @@ -1,101 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output -; END. - -target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" -target triple = "thumbv7-apple-ios9.0.0" - -%struct.anon = type { %struct.anon.0, i32, i32, %union.T1 } -%struct.anon.0 = type { i32, [256 x i32], [256 x i8] } -%union.T1 = type { %struct.F} -%struct.F = type { i32 } - -@U = internal global %struct.anon zeroinitializer, align 4 - -define void @main() { -entry: - %0 = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @U, i32 0, i32 2), align 4 - %cmp.i = icmp eq i32 %0, -1 - br i1 %cmp.i, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %if.end - -if.end: ; preds = %entry, %if.then - %1 = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @U, i32 0, i32 2), align 4 - %bf.load = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @U, i32 0, i32 3, i32 0, i32 0), align 4 - %cmp = icmp slt i32 %0, 0 - br i1 %cmp, label %if.end7, label %cond.false - -cond.false: ; preds = %if.end - %add = and i32 %bf.load, 30 - %shl = add nuw nsw i32 %add, 2 - br label %if.end7 - -if.end7: ; preds = %if.end, %cond.false - %2 = icmp eq i32 %0, 1 - br i1 %2, label %if.then9, label %if.else10 - -if.then9: ; preds = %if.end7 - br label %if.end29 - -if.else10: ; preds = %if.end7 - %cmp11 = icmp ugt i32 %0, 13 - br i1 %cmp11, label %if.then12, label %if.else14 - -if.then12: ; preds = %if.else10 - br label %if.end26 - -if.else14: ; preds = %if.else10 - %tobool = icmp eq i1 %2, 0 - br i1 %tobool, label %lor.rhs, label %if.then18 - -lor.rhs: ; preds = %if.else14 - %tobool.not.i = icmp eq i1 %2, 0 - br i1 %tobool.not.i, label %if.else21, label %if.end.i54 - -if.end.i54: ; preds = %lor.rhs - br label %for.cond.i - -for.cond.i: ; preds = %if.end6.i, %if.end.i54 - %ix.0.i = phi i32 [ 0, %if.end.i54 ], [ %inc.i55, %if.end6.i ] - %ret.0.off0.i = phi i1 [ false, %if.end.i54 ], [ %.ret.0.off0.i, %if.end6.i ] - %cmp2.i = icmp ult i32 %ix.0.i, 2 - br i1 %cmp2.i, label %for.body.i, label %TmpSimpleNeedExt.exit - -for.body.i: ; preds = %for.cond.i - %arrayidx.i = getelementptr inbounds %struct.anon, %struct.anon* @U, i32 0, i32 0, i32 2, i32 %ix.0.i - %elt = load i8, i8* %arrayidx.i, align 1 - %cmp3.i = icmp sgt i8 %elt, 7 - br i1 %cmp3.i, label %if.else21, label %if.end6.i - -if.end6.i: ; preds = %for.body.i - %cmp10.i = icmp ugt i8 %elt, 59 - %.ret.0.off0.i = or i1 %ret.0.off0.i, %cmp10.i - %inc.i55 = add i32 %ix.0.i, 1 - br label %for.cond.i - -TmpSimpleNeedExt.exit: ; preds = %for.body.i - br i1 %ret.0.off0.i, label %if.then18, label %if.else21 - -if.then18: ; preds = %if.else14, %TmpSimpleNeedExt.exit - br label %if.end26 - -if.else21: ; preds = %for.body.i, %lor.rhs, %TmpSimpleNeedExt.exit - br label %if.end26 - -if.end26: ; preds = %if.then18, %if.else21, %if.then12 - %cmp.i51 = icmp slt i32 %0, 7 - br i1 %cmp.i51, label %if.then.i, label %if.end.i - -if.then.i: ; preds = %if.end26 - br label %if.end.i - -if.end.i: ; preds = %if.then.i, %if.end26 - br label %if.end29 - -if.then2.i: ; preds = %if.end.i - br label %if.end29 - -if.end29: ; preds = %if.end.i, %if.then2.i, %if.then9 - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/MagicPointer.ll b/llvm/test/Transforms/SimplifyCFG/MagicPointer.ll deleted file mode 100644 index 7789600f3f0..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/MagicPointer.ll +++ /dev/null @@ -1,149 +0,0 @@ -; Test that simplifycfg can create switch instructions from constant pointers. -; -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -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] -@.str1 = private constant [4 x i8] c"one\00" ; <[4 x i8]*> [#uses=2] -@.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 - -if.then: ; preds = %entry - %call = call i32 @puts(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0] - br label %if.end21 - -if.else: ; preds = %entry - %cmp = icmp eq i8* %x, inttoptr (i64 1 to i8*) ; <i1> [#uses=1] - br i1 %cmp, label %if.then2, label %if.else4 - -if.then2: ; preds = %if.else - %call3 = call i32 @puts(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0)) nounwind ; <i32> [#uses=0] - br label %if.end20 - -if.else4: ; preds = %if.else - %cmp6 = icmp eq i8* %x, inttoptr (i64 2 to i8*) ; <i1> [#uses=1] - br i1 %cmp6, label %if.then9, label %lor.lhs.false - -lor.lhs.false: ; preds = %if.else4 - %cmp8 = icmp eq i8* %x, inttoptr (i64 3 to i8*) ; <i1> [#uses=1] - br i1 %cmp8, label %if.then9, label %if.else11 - -if.then9: ; preds = %lor.lhs.false, %if.else4 - %call10 = call i32 @puts(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0)) nounwind ; <i32> [#uses=0] - br label %if.end19 - -if.else11: ; preds = %lor.lhs.false - %cmp13 = icmp eq i8* %x, inttoptr (i64 4 to i8*) ; <i1> [#uses=1] - br i1 %cmp13, label %if.then14, label %if.else16 - -if.then14: ; preds = %if.else11 - %call15 = call i32 @puts(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str3, i64 0, i64 0)) nounwind ; <i32> [#uses=0] - br label %if.end - -if.else16: ; preds = %if.else11 - %call18 = call i32 @puts(i8* %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 -} - -; 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], [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], [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], [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], [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/llvm/test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll b/llvm/test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll deleted file mode 100644 index b4bfb51dd14..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: opt -S -simplifycfg -mtriple=mips-linux-gnu < %s | FileCheck %s - -define i32 @ctlz(i32 %A) { -; CHECK-LABEL: @ctlz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -define i32 @cttz(i32 %A) { -; CHECK-LABEL: @cttz( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; CHECK-NEXT: [[CTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTZ]] -; CHECK-NEXT: ret i32 [[SEL]] -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - -declare i32 @llvm.ctlz.i32(i32, i1) -declare i32 @llvm.cttz.i32(i32, i1) - diff --git a/llvm/test/Transforms/SimplifyCFG/Mips/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/Mips/lit.local.cfg deleted file mode 100644 index 683bfdccb74..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/Mips/lit.local.cfg +++ /dev/null @@ -1,5 +0,0 @@ -config.suffixes = ['.ll'] - -targets = set(config.root.targets_to_build.split()) -if not 'Mips' in targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/PHINode.ll b/llvm/test/Transforms/SimplifyCFG/PHINode.ll deleted file mode 100644 index 25a242a5599..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PHINode.ll +++ /dev/null @@ -1,15 +0,0 @@ -; -simplifycfg is not folding blocks if there is a PHI node involved. This -; should be fixed eventually - -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define i32 @main(i32 %argc) { -; <label>:0 -; CHECK-NOT: br label %InlinedFunctionReturnNode - br label %InlinedFunctionReturnNode -InlinedFunctionReturnNode: ; preds = %0 - %X = phi i32 [ 7, %0 ] ; <i32> [#uses=1] - %Y = add i32 %X, %argc ; <i32> [#uses=1] - ret i32 %Y -} - diff --git a/llvm/test/Transforms/SimplifyCFG/PR16069.ll b/llvm/test/Transforms/SimplifyCFG/PR16069.ll deleted file mode 100644 index 9048b5680c7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR16069.ll +++ /dev/null @@ -1,33 +0,0 @@ -; NOTE: Assertions have been autogenerated by update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -@b = extern_weak global i32 - -define i32 @foo(i1 %y) { -; CHECK-LABEL: @foo( -; CHECK: [[COND_I:%.*]] = phi i32 [ srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb2 ], [ 0, %0 ] -; CHECK-NEXT: ret i32 [[COND_I]] -; - 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 ] - ret i32 %cond.i -} - -define i32 @foo2(i1 %x) { -; CHECK-LABEL: @foo2( -; CHECK: [[COND:%.*]] = phi i32 [ 0, %bb1 ], [ srem (i32 1, i32 zext (i1 icmp eq (i32* @b, i32* null) to i32)), %bb0 ] -; CHECK-NEXT: ret i32 [[COND]] -; -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 ] - ret i32 %cond -} diff --git a/llvm/test/Transforms/SimplifyCFG/PR17073.ll b/llvm/test/Transforms/SimplifyCFG/PR17073.ll deleted file mode 100644 index e6e98b26687..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR17073.ll +++ /dev/null @@ -1,73 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; In PR17073 ( http://llvm.org/pr17073 ), we illegally hoisted an operation that can trap. -; The first test confirms that we don't do that when the trapping op is reached by the current BB (block1). -; The second test confirms that we don't do that when the trapping op is reached by the previous BB (entry). -; The third test confirms that we can still do this optimization for an operation (add) that doesn't trap. -; The tests must be complicated enough to prevent previous SimplifyCFG actions from optimizing away -; the instructions that we're checking for. - -target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" -target triple = "i386-apple-macosx10.9.0" - -@a = common global i32 0, align 4 -@b = common global i8 0, align 1 - -; CHECK-LABEL: can_trap1 -; CHECK-NOT: or i1 %tobool, icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) -; CHECK-NOT: select i1 %tobool, i32* null, i32* select (i1 icmp eq (i64 urem (i64 2, i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64)), i64 0), i32* null, i32* @a) -define i32* @can_trap1() { -entry: - %0 = load i32, i32* @a, align 4 - %tobool = icmp eq i32 %0, 0 - br i1 %tobool, label %exit, label %block1 - -block1: - br i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a), label %exit, label %block2 - -block2: - br label %exit - -exit: - %storemerge = phi i32* [ null, %entry ],[ null, %block2 ], [ select (i1 icmp eq (i64 urem (i64 2, i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64)), i64 0), i32* null, i32* @a), %block1 ] - ret i32* %storemerge -} - -; CHECK-LABEL: can_trap2 -; CHECK-NOT: or i1 %tobool, icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) -; CHECK-NOT: select i1 %tobool, i32* select (i1 icmp eq (i64 urem (i64 2, i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64)), i64 0), i32* null, i32* @a), i32* null -define i32* @can_trap2() { -entry: - %0 = load i32, i32* @a, align 4 - %tobool = icmp eq i32 %0, 0 - br i1 %tobool, label %exit, label %block1 - -block1: - br i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a), label %exit, label %block2 - -block2: - br label %exit - -exit: - %storemerge = phi i32* [ select (i1 icmp eq (i64 urem (i64 2, i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64)), i64 0), i32* null, i32* @a), %entry ],[ null, %block2 ], [ null, %block1 ] - ret i32* %storemerge -} - -; CHECK-LABEL: cannot_trap -; CHECK: select i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a), i32* select (i1 icmp eq (i64 add (i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64), i64 2), i64 0), i32* null, i32* @a), i32* null -define i32* @cannot_trap() { -entry: - %0 = load i32, i32* @a, align 4 - %tobool = icmp eq i32 %0, 0 - br i1 %tobool, label %exit, label %block1 - -block1: - br i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a), label %exit, label %block2 - -block2: - br label %exit - -exit: - %storemerge = phi i32* [ null, %entry ],[ null, %block2 ], [ select (i1 icmp eq (i64 add (i64 2, i64 zext (i1 icmp eq (i32* bitcast (i8* @b to i32*), i32* @a) to i64)), i64 0), i32* null, i32* @a), %block1 ] - ret i32* %storemerge -} diff --git a/llvm/test/Transforms/SimplifyCFG/PR25267.ll b/llvm/test/Transforms/SimplifyCFG/PR25267.ll deleted file mode 100644 index a13d45a0f27..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR25267.ll +++ /dev/null @@ -1,24 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define void @f() { -entry: - br label %for.cond - -for.cond: - %phi = phi i1 [ false, %entry ], [ true, %for.body ] - %select = select i1 %phi, i32 1, i32 2 - br label %for.body - -for.body: - switch i32 %select, label %for.cond [ - i32 1, label %return - i32 2, label %for.body - ] - -return: - ret void -} - -; CHECK-LABEL: define void @f( -; CHECK: br label %[[LABEL:.*]] -; CHECK: br label %[[LABEL]] diff --git a/llvm/test/Transforms/SimplifyCFG/PR27615-simplify-cond-br.ll b/llvm/test/Transforms/SimplifyCFG/PR27615-simplify-cond-br.ll deleted file mode 100644 index d6cf1dd1ad6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR27615-simplify-cond-br.ll +++ /dev/null @@ -1,71 +0,0 @@ -; RUN: opt -S -simplifycfg -strip-debug < %s | FileCheck %s -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -; Test case for BUG-27615 -; Test that simplify cond branch produce same result for debug and non-debug builds -; CHECK: select i1 %or.cond, i32 -1, i32 5 -; CHECK-NOT: bb1: - -; ModuleID = './csmith107.i.debug.ll' -source_filename = "./csmith107.i.debug.ll" - -@a = global i16 0, !dbg !0 -@b = global i32 0, !dbg !4 -@c = global i16* null, !dbg !9 - -define i16 @fn1() !dbg !17 { -bb2: - store i32 -1, i32* @b, align 1 - %_tmp1.pre = load i16, i16* @a, align 1, !dbg !20 - %_tmp2.pre = load i16*, i16** @c, align 1 - tail call void @llvm.dbg.value(metadata i16 6, metadata !22, metadata !23), !dbg !24 - tail call void @llvm.dbg.value(metadata i16 %_tmp1.pre, metadata !25, metadata !23), !dbg !20 - %_tmp3 = load i16, i16* %_tmp2.pre, align 1 - %_tmp4 = icmp ne i16 %_tmp3, 0 - %_tmp6 = icmp ne i16 %_tmp1.pre, 0 - %or.cond = and i1 %_tmp6, %_tmp4 - br i1 %or.cond, label %bb5, label %bb1 - -bb1: ; preds = %bb2 - store i32 5, i32* @b, align 1 - br label %bb5 - -bb5: ; preds = %bb1, %bb2 - ret i16 0 -} - -; Function Attrs: nounwind readnone -declare void @llvm.dbg.value(metadata, metadata, metadata) #0 - -attributes #0 = { nounwind readnone } - -!llvm.dbg.cu = !{!12} -!llvm.module.flags = !{!15, !16} - -!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) -!1 = !DIGlobalVariable(name: "a", scope: null, file: !2, line: 2, type: !3, isLocal: false, isDefinition: true) -!2 = !DIFile(filename: "csmith107.i.c", directory: "/tmp") -!3 = !DIBasicType(name: "int", size: 16, align: 16, encoding: DW_ATE_signed) -!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression()) -!5 = !DIGlobalVariable(name: "b", scope: null, file: !2, line: 3, type: !6, isLocal: false, isDefinition: true) -!6 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint32_t", file: !2, line: 1, baseType: !7) -!7 = !DIDerivedType(tag: DW_TAG_typedef, name: "__u32_t", file: !2, baseType: !8) -!8 = !DIBasicType(name: "unsigned long", size: 32, align: 16, encoding: DW_ATE_unsigned) -!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression()) -!10 = !DIGlobalVariable(name: "c", scope: null, file: !2, line: 4, type: !11, isLocal: false, isDefinition: true) -!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, size: 16, align: 16) -!12 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, producer: "FlexC Compiler v6.36 (LLVM)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !13, retainedTypes: !13, globals: !14) -!13 = !{} -!14 = !{!0, !4, !9} -!15 = !{i32 2, !"Dwarf Version", i32 4} -!16 = !{i32 2, !"Debug Info Version", i32 3} -!17 = distinct !DISubprogram(name: "fn1", scope: !2, file: !2, line: 5, type: !18, isLocal: false, isDefinition: true, scopeLine: 5, isOptimized: false, unit: !12, retainedNodes: !13) -!18 = !DISubroutineType(types: !19) -!19 = !{!3} -!20 = !DILocation(line: 8, column: 16, scope: !21) -!21 = !DILexicalBlock(scope: !17, file: !2, line: 7, column: 29) -!22 = !DILocalVariable(name: "d", scope: !21, line: 8, type: !3) -!23 = !DIExpression() -!24 = !DILocation(line: 8, column: 9, scope: !21) -!25 = !DILocalVariable(name: "e", scope: !21, line: 8, type: !3) - diff --git a/llvm/test/Transforms/SimplifyCFG/PR29163.ll b/llvm/test/Transforms/SimplifyCFG/PR29163.ll deleted file mode 100644 index 65f9090dd13..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR29163.ll +++ /dev/null @@ -1,31 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@GV = external constant i64* - -define i64* @test1(i1 %cond, i8* %P) { -entry: - br i1 %cond, label %if, label %then - -then: - %bc = bitcast i8* %P to i64* - br label %join - -if: - %load = load i64*, i64** @GV, align 8, !dereferenceable !0 - br label %join - -join: - %phi = phi i64* [ %bc, %then ], [ %load, %if ] - ret i64* %phi -} - -; CHECK-LABEL: define i64* @test1( -; CHECK: %[[bc:.*]] = bitcast i8* %P to i64* -; CHECK: %[[load:.*]] = load i64*, i64** @GV, align 8{{$}} -; CHECK: %[[phi:.*]] = select i1 %cond, i64* %[[load]], i64* %[[bc]] -; CHECK: ret i64* %[[phi]] - - -!0 = !{i64 8} diff --git a/llvm/test/Transforms/SimplifyCFG/PR30210.ll b/llvm/test/Transforms/SimplifyCFG/PR30210.ll deleted file mode 100644 index a2aa8256831..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR30210.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: opt -S -simplifycfg < %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* @fn1(i32* returned) - -define i32 @test1(i1 %B) { -entry: - br label %for.cond.us - -for.cond.us: ; preds = %for.cond.us, %entry - br i1 %B, label %for.cond4.preheader, label %for.cond.us - -for.cond4.preheader: ; preds = %for.cond.us - br i1 %B, label %for.cond4.preheader.split.us, label %for.cond4 - -for.cond4.preheader.split.us: ; preds = %for.cond4.preheader - unreachable - -for.cond4: ; preds = %for.end, %for.cond4.preheader - %phi = phi i32* [ %call, %for.end ], [ undef, %for.cond4.preheader ] - %call = call i32* @fn1(i32* %phi) - br label %for.cond5 - -for.cond5: ; preds = %for.cond5, %for.cond4 - br i1 %B, label %for.cond5, label %for.end - -for.end: ; preds = %for.cond5 - %load = load i32, i32* %call, align 4 - br label %for.cond4 -} - -; CHECK-LABEL: define i32 @test1( -; CHECK: br label %[[LABEL:.*]] -; CHECK: [[LABEL]]: -; CHECK: br label %[[LABEL]] diff --git a/llvm/test/Transforms/SimplifyCFG/PR9946.ll b/llvm/test/Transforms/SimplifyCFG/PR9946.ll deleted file mode 100644 index c355a8f5cc9..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PR9946.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt -simplifycfg -disable-output < %s - -@foo = external constant i32 - -define i32 @f() { -entry: - br i1 icmp eq (i64 and (i64 ptrtoint (i32* @foo to i64), i64 15), i64 0), label %if.end, label %if.then - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - br label %return - -return: ; preds = %if.end, %if.then - %storemerge = phi i32 [ 1, %if.end ], [ 0, %if.then ] - ret i32 %storemerge -} diff --git a/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge.ll b/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge.ll deleted file mode 100644 index 85b98706018..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge.ll +++ /dev/null @@ -1,29 +0,0 @@ -; NOTE: Assertions have been autogenerated by update_test_checks.py -; Test merging of blocks that only have PHI nodes in them -; -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; - -define i32 @test(i1 %a, i1 %b) { -; CHECK-LABEL: @test( -; CHECK: M: -; CHECK-NEXT: [[DOT:%.*]] = select i1 %b, i32 0, i32 1 -; CHECK-NEXT: [[W:%.*]] = select i1 %a, i32 2, i32 [[DOT]] -; CHECK-NEXT: [[R:%.*]] = add i32 [[W]], 1 -; CHECK-NEXT: ret i32 [[R]] -; - br i1 %a, label %M, label %O -O: ; preds = %0 - br i1 %b, label %N, label %Q -Q: ; preds = %O - br label %N -N: ; preds = %Q, %O - ; This block should be foldable into M - %Wp = phi i32 [ 0, %O ], [ 1, %Q ] ; <i32> [#uses=1] - br label %M -M: ; preds = %N, %0 - %W = phi i32 [ %Wp, %N ], [ 2, %0 ] ; <i32> [#uses=1] - %R = add i32 %W, 1 ; <i32> [#uses=1] - ret i32 %R -} - diff --git a/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll b/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll deleted file mode 100644 index fb5d600f114..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll +++ /dev/null @@ -1,27 +0,0 @@ -; Test merging of blocks that only have PHI nodes in them. This tests the case -; where the mergedinto block doesn't have any PHI nodes, and is in fact -; dominated by the block-to-be-eliminated -; -; RUN: opt < %s -simplifycfg -S | not grep N: -; - -declare i1 @foo() - -define i32 @test(i1 %a, i1 %b) { - %c = call i1 @foo() - br i1 %c, label %N, label %P -P: - %d = call i1 @foo() - br i1 %d, label %N, label %Q -Q: - br label %N -N: - %W = phi i32 [0, %0], [1, %Q], [2, %P] - ; This block should be foldable into M - br label %M - -M: - %R = add i32 %W, 1 - ret i32 %R -} - diff --git a/llvm/test/Transforms/SimplifyCFG/PhiEliminate.ll b/llvm/test/Transforms/SimplifyCFG/PhiEliminate.ll deleted file mode 100644 index d5ce9a7e6bc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiEliminate.ll +++ /dev/null @@ -1,27 +0,0 @@ -; Test a bunch of cases where the cfg simplification code should -; be able to fold PHI nodes into computation in common cases. Folding the PHI -; nodes away allows the branches to be eliminated, performing a simple form of -; 'if conversion'. - -; RUN: opt < %s -simplifycfg -S > %t.xform -; RUN: not grep phi %t.xform -; RUN: grep ret %t.xform - -declare void @use(i1) - -declare void @use.upgrd.1(i32) - - -define void @test(i1 %c, i32 %V, i32 %V2) { -; <label>:0 - br i1 %c, label %T, label %F -T: ; preds = %0 - br label %F -F: ; preds = %T, %0 - %B1 = phi i1 [ true, %0 ], [ false, %T ] ; <i1> [#uses=1] - %I6 = phi i32 [ %V, %0 ], [ 0, %T ] ; <i32> [#uses=1] - call void @use( i1 %B1 ) - call void @use.upgrd.1( i32 %I6 ) - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll b/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll deleted file mode 100644 index 0ca65286da3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll +++ /dev/null @@ -1,34 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Use a select to make this a single BB. -; Also, make sure the profile metadata is propagated to the select (PR26636). - -define i32 @FoldTwoEntryPHINode(i1 %C, i32 %V1, i32 %V2, i16 %V3) { -entry: - br i1 %C, label %then, label %else, !prof !0, !unpredictable !1 -then: - %V4 = or i32 %V2, %V1 - br label %Cont -else: - %V5 = sext i16 %V3 to i32 - br label %Cont -Cont: - %V6 = phi i32 [ %V5, %else ], [ %V4, %then ] - call i32 @FoldTwoEntryPHINode( i1 false, i32 0, i32 0, i16 0 ) - ret i32 %V1 - -; CHECK-LABEL: @FoldTwoEntryPHINode( -; CHECK-NEXT: entry: -; CHECK-NEXT: %V5 = sext i16 %V3 to i32 -; CHECK-NEXT: %V4 = or i32 %V2, %V1 -; CHECK-NEXT: %V6 = select i1 %C, i32 %V4, i32 %V5, !prof !0, !unpredictable !1 -; CHECK-NEXT: %0 = call i32 @FoldTwoEntryPHINode(i1 false, i32 0, i32 0, i16 0) -; CHECK-NEXT: ret i32 %V1 -} - -!0 = !{!"branch_weights", i32 3, i32 5} -!1 = !{} - -; CHECK: !0 = !{!"branch_weights", i32 3, i32 5} -; CHECK: !1 = !{} - diff --git a/llvm/test/Transforms/SimplifyCFG/PhiEliminate3.ll b/llvm/test/Transforms/SimplifyCFG/PhiEliminate3.ll deleted file mode 100644 index 3566b874c0b..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiEliminate3.ll +++ /dev/null @@ -1,34 +0,0 @@ -; Test merging of blocks containing complex expressions, -; with various folding thresholds -; -; RUN: opt < %s -simplifycfg -S -phi-node-folding-threshold=1 | grep N: -; RUN: opt < %s -simplifycfg -S -phi-node-folding-threshold=2 | not grep N: -; RUN: opt < %s -simplifycfg -S -phi-node-folding-threshold=2 | grep M: -; RUN: opt < %s -simplifycfg -S -phi-node-folding-threshold=7 | not grep M: -; - -define i32 @test(i1 %a, i1 %b, i32 %i, i32 %j, i32 %k) { -entry: - br i1 %a, label %M, label %O -O: - br i1 %b, label %P, label %Q -P: - %iaj = add i32 %i, %j - %iajak = add i32 %iaj, %k - br label %N -Q: - %ixj = xor i32 %i, %j - %ixjxk = xor i32 %ixj, %k - br label %N -N: - ; This phi should be foldable if threshold >= 2 - %Wp = phi i32 [ %iajak, %P ], [ %ixjxk, %Q ] - %Wp2 = add i32 %Wp, %Wp - br label %M -M: - ; This phi should be foldable if threshold >= 7 - %W = phi i32 [ %Wp2, %N ], [ 2, %entry ] - %R = add i32 %W, 1 - ret i32 %R -} - diff --git a/llvm/test/Transforms/SimplifyCFG/PhiNoEliminate.ll b/llvm/test/Transforms/SimplifyCFG/PhiNoEliminate.ll deleted file mode 100644 index e9902e09442..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PhiNoEliminate.ll +++ /dev/null @@ -1,27 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | \ -; RUN: not grep select - -;; The PHI node in this example should not be turned into a select, as we are -;; not able to ifcvt the entire block. As such, converting to a select just -;; introduces inefficiency without saving copies. - -define i32 @bar(i1 %C) { -entry: - br i1 %C, label %then, label %endif -then: ; preds = %entry - %tmp.3 = call i32 @qux( ) ; <i32> [#uses=0] - br label %endif -endif: ; preds = %then, %entry - %R = phi i32 [ 123, %entry ], [ 12312, %then ] ; <i32> [#uses=1] - ;; stuff to disable tail duplication - call i32 @qux( ) ; <i32>:0 [#uses=0] - call i32 @qux( ) ; <i32>:1 [#uses=0] - call i32 @qux( ) ; <i32>:2 [#uses=0] - call i32 @qux( ) ; <i32>:3 [#uses=0] - call i32 @qux( ) ; <i32>:4 [#uses=0] - call i32 @qux( ) ; <i32>:5 [#uses=0] - call i32 @qux( ) ; <i32>:6 [#uses=0] - ret i32 %R -} - -declare i32 @qux() diff --git a/llvm/test/Transforms/SimplifyCFG/PowerPC/cttz-ctlz-spec.ll b/llvm/test/Transforms/SimplifyCFG/PowerPC/cttz-ctlz-spec.ll deleted file mode 100644 index 29da2863180..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PowerPC/cttz-ctlz-spec.ll +++ /dev/null @@ -1,45 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck -enable-var-scope %s -target datalayout = "E-m:e-i64:64-n32:64" -target triple = "powerpc64-unknown-linux-gnu" - -define i64 @test1(i64 %A) { -; CHECK-LABEL: @test1( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; CHECK-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTLZ]] -; CHECK-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - -define i64 @test1b(i64 %A) { -; CHECK-LABEL: @test1b( -; CHECK: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; CHECK-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) -; CHECK-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTTZ]] -; CHECK-NEXT: ret i64 [[SEL]] -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - -declare i64 @llvm.ctlz.i64(i64, i1) -declare i64 @llvm.cttz.i64(i64, i1) - diff --git a/llvm/test/Transforms/SimplifyCFG/PowerPC/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/PowerPC/lit.local.cfg deleted file mode 100644 index 091332439b1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/PowerPC/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not 'PowerPC' in config.root.targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/RISCV/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/RISCV/lit.local.cfg deleted file mode 100644 index 7aaeda5a5b3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/RISCV/lit.local.cfg +++ /dev/null @@ -1,5 +0,0 @@ -config.suffixes = ['.ll'] - -targets = set(config.root.targets_to_build.split()) -if not 'RISCV' in targets: - config.unsupported = True diff --git a/llvm/test/Transforms/SimplifyCFG/RISCV/select-trunc-i64.ll b/llvm/test/Transforms/SimplifyCFG/RISCV/select-trunc-i64.ll deleted file mode 100644 index e5272b2af86..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/RISCV/select-trunc-i64.ll +++ /dev/null @@ -1,28 +0,0 @@ -;RUN: opt -S -simplifycfg -mtriple=riscv32 < %s | FileCheck %s - -; Test case taken from test/Transforms/SimplifyCFG/ARM/select-trunc-i64.ll. -; A correct implementation of isTruncateFree allows this test case to be -; reduced to a single basic block. - -; CHECK-LABEL: select_trunc_i64 -; CHECK-NOT: br -; CHECK: select -; CHECK: select -define i32 @select_trunc_i64(i32 %a, i32 %b) { -entry: - %conv = sext i32 %a to i64 - %conv1 = sext i32 %b to i64 - %add = add nsw i64 %conv1, %conv - %cmp = icmp sgt i64 %add, 2147483647 - br i1 %cmp, label %cond.end7, label %cond.false - -cond.false: ; preds = %entry - %0 = icmp sgt i64 %add, -2147483648 - %cond = select i1 %0, i64 %add, i64 -2147483648 - %extract.t = trunc i64 %cond to i32 - br label %cond.end7 - -cond.end7: ; preds = %cond.false, %entry - %cond8.off0 = phi i32 [ 2147483647, %entry ], [ %extract.t, %cond.false ] - ret i32 %cond8.off0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg deleted file mode 100644 index fa6a54e5013..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg +++ /dev/null @@ -1,3 +0,0 @@ -if not 'Sparc' in config.root.targets: - config.unsupported = True - diff --git a/llvm/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll b/llvm/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll deleted file mode 100644 index bb48c80268a..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: opt < %s -simplifycfg -S -mtriple=sparc-unknown-unknown | FileCheck %s - -; Check that switches are not turned into lookup tables, as this is not -; considered profitable on the target. - -define i32 @f(i32 %c) nounwind uwtable readnone { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - i32 46, label %sw.bb4 - i32 47, label %sw.bb5 - i32 48, label %sw.bb6 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.bb5: br label %return -sw.bb6: br label %return -sw.default: br label %return -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-LABEL: @f( -; CHECK-NOT: getelementptr -; CHECK: switch i32 %c -} diff --git a/llvm/test/Transforms/SimplifyCFG/SpeculativeExec.ll b/llvm/test/Transforms/SimplifyCFG/SpeculativeExec.ll deleted file mode 100644 index 19a7a7ec597..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/SpeculativeExec.ll +++ /dev/null @@ -1,121 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -phi-node-folding-threshold=2 -S | FileCheck %s - -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-S128" -target triple = "x86_64-unknown-linux-gnu" - -define i32 @test1(i32 %a, i32 %b, i32 %c) nounwind { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: br i1 [[TMP1]], label [[BB1:%.*]], label [[BB3:%.*]] -; CHECK: bb1: -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[C:%.*]], 1 -; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[A:%.*]], 1 -; CHECK-NEXT: [[TMP3_A:%.*]] = select i1 [[TMP2]], i32 [[TMP3]], i32 [[A]] -; CHECK-NEXT: br label [[BB3]] -; CHECK: bb3: -; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[B]], [[ENTRY:%.*]] ], [ [[TMP3_A]], [[BB1]] ] -; CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[TMP4]], 1 -; CHECK-NEXT: ret i32 [[TMP5]] -; -entry: - %tmp1 = icmp eq i32 %b, 0 - br i1 %tmp1, label %bb1, label %bb3 - -bb1: ; preds = %entry - %tmp2 = icmp sgt i32 %c, 1 - br i1 %tmp2, label %bb2, label %bb3 - -bb2: ; preds = bb1 - %tmp3 = add i32 %a, 1 - br label %bb3 - -bb3: ; preds = %bb2, %entry - %tmp4 = phi i32 [ %b, %entry ], [ %a, %bb1 ], [ %tmp3, %bb2 ] - %tmp5 = sub i32 %tmp4, 1 - ret i32 %tmp5 -} - -define i8* @test4(i1* %dummy, i8* %a, i8* %b) { -; Test that we don't speculate an arbitrarily large number of unfolded constant -; expressions. -; CHECK-LABEL: @test4( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[COND1:%.*]] = load volatile i1, i1* [[DUMMY:%.*]] -; CHECK-NEXT: br i1 [[COND1]], label [[IF:%.*]], label [[END:%.*]] -; CHECK: if: -; CHECK-NEXT: [[COND2:%.*]] = load volatile i1, i1* [[DUMMY]] -; CHECK-NEXT: br i1 [[COND2]], label [[THEN:%.*]], label [[END]] -; CHECK: then: -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: [[X1:%.*]] = phi i8* [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[B:%.*]], [[IF]] ], [ inttoptr (i64 1 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X2:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 2 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X3:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 3 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X4:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 4 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X5:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 5 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X6:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 6 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X7:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 7 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X8:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 8 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X9:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 9 to i8*), [[THEN]] ] -; CHECK-NEXT: [[X10:%.*]] = phi i8* [ [[A]], [[ENTRY]] ], [ [[B]], [[IF]] ], [ inttoptr (i64 10 to i8*), [[THEN]] ] -; CHECK-NEXT: ret i8* [[X10]] -; - -entry: - %cond1 = load volatile i1, i1* %dummy - br i1 %cond1, label %if, label %end - -if: - %cond2 = load volatile i1, i1* %dummy - br i1 %cond2, label %then, label %end - -then: - br label %end - -end: - %x1 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 1 to i8*), %then ] - %x2 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 2 to i8*), %then ] - %x3 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 3 to i8*), %then ] - %x4 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 4 to i8*), %then ] - %x5 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 5 to i8*), %then ] - %x6 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 6 to i8*), %then ] - %x7 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 7 to i8*), %then ] - %x8 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 8 to i8*), %then ] - %x9 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 9 to i8*), %then ] - %x10 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 10 to i8*), %then ] - - ret i8* %x10 -} - -define i32* @test5(i32 %a, i32 %b, i32 %c, i32* dereferenceable(10) %ptr1, -; CHECK-LABEL: @test5( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: br i1 [[TMP1]], label [[BB1:%.*]], label [[BB3:%.*]] -; CHECK: bb1: -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[C:%.*]], 1 -; CHECK-NEXT: [[TMP3:%.*]] = load i32*, i32** [[PTR3:%.*]] -; CHECK-NEXT: [[TMP3_PTR2:%.*]] = select i1 [[TMP2]], i32* [[TMP3]], i32* [[PTR2:%.*]] -; CHECK-NEXT: ret i32* [[TMP3_PTR2]] -; CHECK: bb3: -; CHECK-NEXT: ret i32* [[PTR1:%.*]] -; - i32* dereferenceable(10) %ptr2, i32** dereferenceable(10) %ptr3) nounwind { -entry: - %tmp1 = icmp eq i32 %b, 0 - br i1 %tmp1, label %bb1, label %bb3 - -bb1: ; preds = %entry - %tmp2 = icmp sgt i32 %c, 1 - br i1 %tmp2, label %bb2, label %bb3 - -bb2: ; preds = bb1 - %tmp3 = load i32*, i32** %ptr3, !dereferenceable !{i64 10} - br label %bb3 - -bb3: ; preds = %bb2, %entry - %tmp4 = phi i32* [ %ptr1, %entry ], [ %ptr2, %bb1 ], [ %tmp3, %bb2 ] - ret i32* %tmp4 -} diff --git a/llvm/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll b/llvm/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll deleted file mode 100644 index 6a265539e75..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Check that we can get rid of empty block leading to header -; if it does not introduce new edge. -define i32 @test(i32 %c) { -entry: - br label %header -header: - %i = phi i32 [0, %entry], [%i.1, %backedge] - %i.1 = add i32 %i, 1 - %cmp = icmp slt i32 %i.1, %c - br i1 %cmp, label %backedge, label %exit -; CHECK-NOT: backedge: -backedge: - br label %header -exit: - ret i32 %i -} diff --git a/llvm/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll b/llvm/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll deleted file mode 100644 index b6d54d32566..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll +++ /dev/null @@ -1,33 +0,0 @@ -; The unify-function-exit-nodes pass often makes basic blocks that just contain -; a PHI node and a return. Make sure the simplify cfg can straighten out this -; important case. This is basically the most trivial form of tail-duplication. - -; RUN: opt < %s -simplifycfg -S | \ -; RUN: not grep "br label" - -define i32 @test(i1 %B, i32 %A, i32 %B.upgrd.1) { - br i1 %B, label %T, label %F -T: ; preds = %0 - br label %ret -F: ; preds = %0 - br label %ret -ret: ; preds = %F, %T - %X = phi i32 [ %A, %F ], [ %B.upgrd.1, %T ] ; <i32> [#uses=1] - ret i32 %X -} - - -; Make sure it's willing to move unconditional branches to return instructions -; as well, even if the return block is shared and the source blocks are -; non-empty. -define i32 @test2(i1 %B, i32 %A, i32 %B.upgrd.2) { - br i1 %B, label %T, label %F -T: ; preds = %0 - call i32 @test( i1 true, i32 5, i32 8 ) ; <i32>:1 [#uses=0] - br label %ret -F: ; preds = %0 - call i32 @test( i1 true, i32 5, i32 8 ) ; <i32>:2 [#uses=0] - br label %ret -ret: ; preds = %F, %T - ret i32 %A -} diff --git a/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll b/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll deleted file mode 100644 index f994477d6ac..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll +++ /dev/null @@ -1,188 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define void @test1(i1 %C, i1* %BP) { -; CHECK-LABEL: @test1( -; CHECK: entry: -; CHECK-NEXT: ret void -entry: - br i1 %C, label %T, label %F -T: - store i1 %C, i1* %BP - unreachable -F: - ret void -} - -define void @test2() personality i32 (...)* @__gxx_personality_v0 { -; CHECK-LABEL: @test2( -; CHECK: entry: -; CHECK-NEXT: call void @test2() -; CHECK-NEXT: ret void -entry: - invoke void @test2( ) - to label %N unwind label %U -U: - %res = landingpad { i8* } - cleanup - unreachable -N: - ret void -} - -declare i32 @__gxx_personality_v0(...) - -define i32 @test3(i32 %v) { -; 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 -; CHECK-NEXT: ret -entry: - switch i32 %v, label %default [ - i32 1, label %U - i32 2, label %T - ] -default: - ret i32 1 -U: - unreachable -T: - ret i32 2 -} - - -;; We can either convert the following control-flow to a select or remove the -;; unreachable control flow because of the undef store of null. Make sure we do -;; the latter. - -define void @test5(i1 %cond, i8* %ptr) { - -; CHECK-LABEL: test5 -; CHECK: entry: -; CHECK-NOT: select -; CHECK: store i8 2, i8* %ptr -; CHECK: ret - -entry: - br i1 %cond, label %bb1, label %bb3 - -bb3: - br label %bb2 - -bb1: - br label %bb2 - -bb2: - %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ] - store i8 2, i8* %ptr.2, align 8 - ret void -} - -define void @test5_no_null_opt(i1 %cond, i8* %ptr) #0 { - -; CHECK-LABEL: test5_no_null_opt -; CHECK: entry: -; CHECK: %[[SEL:.*]] = select i1 %cond, i8* null, i8* %ptr -; CHECK: store i8 2, i8* %[[SEL]] - -entry: - br i1 %cond, label %bb1, label %bb3 - -bb3: - br label %bb2 - -bb1: - br label %bb2 - -bb2: - %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ] - store i8 2, i8* %ptr.2, align 8 - ret void -} - -; CHECK-LABEL: test6 -; CHECK: entry: -; CHECK-NOT: select -; CHECK: store i8 2, i8* %ptr -; CHECK: ret - -define void @test6(i1 %cond, i8* %ptr) { -entry: - br i1 %cond, label %bb1, label %bb2 - -bb1: - br label %bb2 - -bb2: - %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ] - store i8 2, i8* %ptr.2, align 8 - ret void -} - -; CHECK-LABEL: test6_no_null_opt -; CHECK: entry: -; CHECK: %[[SEL:.*]] = select i1 %cond, i8* null, i8* %ptr -; CHECK: store i8 2, i8* %[[SEL]] - -define void @test6_no_null_opt(i1 %cond, i8* %ptr) #0 { -entry: - br i1 %cond, label %bb1, label %bb2 - -bb1: - br label %bb2 - -bb2: - %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ] - store i8 2, i8* %ptr.2, align 8 - ret void -} - - -define i32 @test7(i1 %X) { -entry: - br i1 %X, label %if, label %else - -if: - call void undef() - br label %else - -else: - %phi = phi i32 [ 0, %entry ], [ 1, %if ] - ret i32 %phi -} -; CHECK-LABEL: define i32 @test7( -; CHECK-NOT: call -; CHECK: ret i32 0 - -define void @test8(i1 %X, void ()* %Y) { -entry: - br i1 %X, label %if, label %else - -if: - br label %else - -else: - %phi = phi void ()* [ %Y, %entry ], [ null, %if ] - call void %phi() - ret void -} -; CHECK-LABEL: define void @test8( -; CHECK: call void %Y( - -define void @test8_no_null_opt(i1 %X, void ()* %Y) #0 { -entry: - br i1 %X, label %if, label %else - -if: - br label %else - -else: - %phi = phi void ()* [ %Y, %entry ], [ null, %if ] - call void %phi() - ret void -} -attributes #0 = { "null-pointer-is-valid"="true" } - -; CHECK-LABEL: define void @test8_no_null_opt( -; CHECK: %[[SEL:.*]] = select i1 %X, void ()* null, void ()* %Y -; CHECK: call void %[[SEL]] diff --git a/llvm/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll b/llvm/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll deleted file mode 100644 index a8758a789ec..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll +++ /dev/null @@ -1,46 +0,0 @@ -; RUN: opt < %s -simplifycfg -switch-to-lookup -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -; RUN: opt < %s -passes='simplify-cfg<switch-to-lookup>' -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s - -; In the presence of "-no-jump-tables"="true", simplifycfg should not convert switches to lookup tables. - -; CHECK: @switch.table.bar = private unnamed_addr constant [4 x i32] [i32 55, i32 123, i32 0, i32 -1] -; CHECK-LABEL: foo -; CHECK-NOT: @switch.table.foo = private unnamed_addr constant [4 x i32] [i32 55, i32 123, i32 0, i32 -1] - -define i32 @foo(i32 %c) "no-jump-tables"="true" { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %retval.0 = phi i32 [ 15, %sw.default ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] - ret i32 %retval.0 -} - - -define i32 @bar(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %retval.0 = phi i32 [ 15, %sw.default ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] - ret i32 %retval.0 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/X86/lit.local.cfg b/llvm/test/Transforms/SimplifyCFG/X86/lit.local.cfg deleted file mode 100644 index e71f3cc4c41..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/lit.local.cfg +++ /dev/null @@ -1,3 +0,0 @@ -if not 'X86' in config.root.targets: - config.unsupported = True - diff --git a/llvm/test/Transforms/SimplifyCFG/X86/speculate-cttz-ctlz.ll b/llvm/test/Transforms/SimplifyCFG/X86/speculate-cttz-ctlz.ll deleted file mode 100644 index bee80e6acce..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/speculate-cttz-ctlz.ll +++ /dev/null @@ -1,318 +0,0 @@ -; RUN: opt -S -simplifycfg -mtriple=x86_64-unknown-unknown -mattr=+bmi < %s | FileCheck %s --check-prefix=ALL --check-prefix=BMI -; RUN: opt -S -simplifycfg -mtriple=x86_64-unknown-unknown -mattr=+lzcnt < %s | FileCheck %s --check-prefix=ALL --check-prefix=LZCNT -; RUN: opt -S -simplifycfg -mtriple=x86_64-unknown-unknown < %s | FileCheck %s --check-prefix=ALL --check-prefix=GENERIC - - -define i64 @test1(i64 %A) { -; ALL-LABEL: @test1( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i64 64, i64 [[CTLZ]] -; ALL: ret -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - -define i32 @test2(i32 %A) { -; ALL-LABEL: @test2( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i32 32, i32 [[CTLZ]] -; ALL: ret -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - - -define signext i16 @test3(i16 signext %A) { -; ALL-LABEL: @test3( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i16 16, i16 [[CTLZ]] -; ALL: ret -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ] - ret i16 %cond -} - - -define i64 @test1b(i64 %A) { -; ALL-LABEL: @test1b( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i64 64, i64 [[CTTZ]] -; ALL: ret -entry: - %tobool = icmp eq i64 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ] - ret i64 %cond -} - - -define i32 @test2b(i32 %A) { -; ALL-LABEL: @test2b( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i32 32, i32 [[CTTZ]] -; ALL: ret -entry: - %tobool = icmp eq i32 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ] - ret i32 %cond -} - - -define signext i16 @test3b(i16 signext %A) { -; ALL-LABEL: @test3b( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) -; ALL-NEXT: select i1 [[COND]], i16 16, i16 [[CTTZ]] -; ALL: ret -entry: - %tobool = icmp eq i16 %A, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i16 @llvm.cttz.i16(i16 %A, i1 true) - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ] - ret i16 %cond -} - -; The following tests verify that calls to cttz/ctlz are speculated even if -; basic block %cond.true has an extra zero extend/truncate which is "free" -; for the target. - -define i64 @test1e(i32 %x) { -; ALL-LABEL: @test1e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %x, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) -; ALL: [[ZEXT:%[A-Za-z0-9]+]] = zext i32 [[CTTZ]] to i64 -; BMI-NEXT: select i1 [[COND]], i64 32, i64 [[ZEXT]] -; LZCNT-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i32 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) - %phitmp2 = zext i32 %0 to i64 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %phitmp2, %cond.true ], [ 32, %entry ] - ret i64 %cond -} - -define i32 @test2e(i64 %x) { -; ALL-LABEL: @test2e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %x, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i64 [[CTTZ]] to i32 -; BMI-NEXT: select i1 [[COND]], i32 64, i32 [[TRUNC]] -; LZCNT-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i64 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) - %cast = trunc i64 %0 to i32 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %cast, %cond.true ], [ 64, %entry ] - ret i32 %cond -} - -define i64 @test3e(i32 %x) { -; ALL-LABEL: @test3e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %x, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) -; ALL: [[ZEXT:%[A-Za-z0-9]+]] = zext i32 [[CTLZ]] to i64 -; LZCNT-NEXT: select i1 [[COND]], i64 32, i64 [[ZEXT]] -; BMI-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i32 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) - %phitmp2 = zext i32 %0 to i64 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i64 [ %phitmp2, %cond.true ], [ 32, %entry ] - ret i64 %cond -} - -define i32 @test4e(i64 %x) { -; ALL-LABEL: @test4e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %x, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i64 [[CTLZ]] to i32 -; LZCNT-NEXT: select i1 [[COND]], i32 64, i32 [[TRUNC]] -; BMI-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i64 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) - %cast = trunc i64 %0 to i32 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i32 [ %cast, %cond.true ], [ 64, %entry ] - ret i32 %cond -} - -define i16 @test5e(i64 %x) { -; ALL-LABEL: @test5e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %x, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i64 [[CTLZ]] to i16 -; LZCNT-NEXT: select i1 [[COND]], i16 64, i16 [[TRUNC]] -; BMI-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i64 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true) - %cast = trunc i64 %0 to i16 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %cast, %cond.true ], [ 64, %entry ] - ret i16 %cond -} - -define i16 @test6e(i32 %x) { -; ALL-LABEL: @test6e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %x, 0 -; ALL: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i32 [[CTLZ]] to i16 -; LZCNT-NEXT: select i1 [[COND]], i16 32, i16 [[TRUNC]] -; BMI-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i32 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) - %cast = trunc i32 %0 to i16 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %cast, %cond.true ], [ 32, %entry ] - ret i16 %cond -} - -define i16 @test7e(i64 %x) { -; ALL-LABEL: @test7e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i64 %x, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i64 [[CTTZ]] to i16 -; BMI-NEXT: select i1 [[COND]], i16 64, i16 [[TRUNC]] -; LZCNT-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i64 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true) - %cast = trunc i64 %0 to i16 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %cast, %cond.true ], [ 64, %entry ] - ret i16 %cond -} - -define i16 @test8e(i32 %x) { -; ALL-LABEL: @test8e( -; ALL: [[COND:%[A-Za-z0-9]+]] = icmp eq i32 %x, 0 -; ALL: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) -; ALL: [[TRUNC:%[A-Za-z0-9]+]] = trunc i32 [[CTTZ]] to i16 -; BMI-NEXT: select i1 [[COND]], i16 32, i16 [[TRUNC]] -; LZCNT-NOT: select -; GENERIC-NOT: select -; ALL: ret -entry: - %tobool = icmp eq i32 %x, 0 - br i1 %tobool, label %cond.end, label %cond.true - -cond.true: ; preds = %entry - %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) - %cast = trunc i32 %0 to i16 - br label %cond.end - -cond.end: ; preds = %entry, %cond.true - %cond = phi i16 [ %cast, %cond.true ], [ 32, %entry ] - ret i16 %cond -} - - -declare i64 @llvm.ctlz.i64(i64, i1) -declare i32 @llvm.ctlz.i32(i32, i1) -declare i16 @llvm.ctlz.i16(i16, i1) -declare i64 @llvm.cttz.i64(i64, i1) -declare i32 @llvm.cttz.i32(i32, i1) -declare i16 @llvm.cttz.i16(i16, i1) diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll deleted file mode 100644 index c42568ffa93..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll +++ /dev/null @@ -1,52 +0,0 @@ -; RUN: opt -S -simplifycfg -switch-to-lookup < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s - -; rdar://17887153 -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" - -; When we have a covered lookup table, make sure we don't delete PHINodes that -; are cached in PHIs. -; CHECK-LABEL: @test -; CHECK: entry: -; CHECK-NEXT: sub i3 %arg, -4 -; CHECK-NEXT: zext i3 %switch.tableidx to i4 -; CHECK-NEXT: getelementptr inbounds [8 x i64], [8 x i64]* @switch.table.test, i32 0, i4 %switch.tableidx.zext -; CHECK-NEXT: load i64, i64* %switch.gep -; CHECK-NEXT: add i64 -; CHECK-NEXT: ret i64 -define i64 @test(i3 %arg) { -entry: - switch i3 %arg, label %Default [ - i3 -2, label %Label6 - i3 1, label %Label1 - i3 2, label %Label2 - i3 3, label %Label3 - i3 -4, label %Label4 - i3 -3, label %Label5 - ] - -Default: - %v1 = phi i64 [ 7, %Label6 ], [ 11, %Label5 ], [ 6, %Label4 ], [ 13, %Label3 ], [ 9, %Label2 ], [ 15, %Label1 ], [ 8, %entry ] - %v2 = phi i64 [ 0, %Label6 ], [ 0, %Label5 ], [ 0, %Label4 ], [ 0, %Label3 ], [ 0, %Label2 ], [ 0, %Label1 ], [ 0, %entry ] - %v3 = add i64 %v1, %v2 - ret i64 %v3 - -Label1: - br label %Default - -Label2: - br label %Default - -Label3: - br label %Default - -Label4: - br label %Default - -Label5: - br label %Default - -Label6: - br label %Default -} diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll deleted file mode 100644 index 0b9d6ebe825..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: opt -S -simplifycfg -switch-to-lookup < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s -; RUN: opt -S -passes='simplify-cfg<switch-to-lookup>' < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s - -; rdar://17735071 -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" - -; When tableindex can't fit into i2, we should extend the type to i3. -; CHECK-LABEL: @_TFO6reduce1E5toRawfS0_FT_Si -; CHECK: entry: -; CHECK-NEXT: sub i2 %0, -2 -; CHECK-NEXT: zext i2 %switch.tableidx to i3 -; CHECK-NEXT: getelementptr inbounds [4 x i64], [4 x i64]* @switch.table._TFO6reduce1E5toRawfS0_FT_Si, i32 0, i3 %switch.tableidx.zext -; CHECK-NEXT: load i64, i64* %switch.gep -; CHECK-NEXT: ret i64 %switch.load -define i64 @_TFO6reduce1E5toRawfS0_FT_Si(i2) { -entry: - switch i2 %0, label %1 [ - i2 0, label %2 - i2 1, label %3 - i2 -2, label %4 - i2 -1, label %5 - ] - -; <label>:1 ; preds = %entry - unreachable - -; <label>:2 ; preds = %2 - br label %6 - -; <label>:3 ; preds = %4 - br label %6 - -; <label>:4 ; preds = %6 - br label %6 - -; <label>:5 ; preds = %8 - br label %6 - -; <label>:6 ; preds = %3, %5, %7, %9 - %7 = phi i64 [ 3, %5 ], [ 2, %4 ], [ 1, %3 ], [ 0, %2 ] - ret i64 %7 -} diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll deleted file mode 100644 index 3128ce4afa6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ /dev/null @@ -1,1452 +0,0 @@ -; RUN: opt < %s -simplifycfg -switch-to-lookup=true -keep-loops=false -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -; RUN: opt < %s -passes='simplify-cfg<no-keep-loops;switch-to-lookup>' -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -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-S128" -target triple = "x86_64-unknown-linux-gnu" - -; The table for @f -; CHECK: @switch.table.f = private unnamed_addr constant [7 x i32] [i32 55, i32 123, i32 0, i32 -1, i32 27, i32 62, i32 1], align 4 - -; The char table for char -; CHECK: @switch.table.char = private unnamed_addr constant [9 x i8] c"7{\00\FF\1B>\01!T", align 1 - -; The float table for @h -; CHECK: @switch.table.h = private unnamed_addr constant [4 x float] [float 0x40091EB860000000, float 0x3FF3BE76C0000000, float 0x4012449BA0000000, float 0x4001AE1480000000], align 4 - -; The table for @foostring -; CHECK: @switch.table.foostring = private unnamed_addr constant [4 x i8*] [i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str3, i64 0, i64 0)], align 8 - -; The table for @earlyreturncrash -; CHECK: @switch.table.earlyreturncrash = private unnamed_addr constant [4 x i32] [i32 42, i32 9, i32 88, i32 5], align 4 - -; The table for @large -; CHECK: @switch.table.large = private unnamed_addr constant [199 x i32] [i32 1, i32 4, i32 9, - -; The table for @cprop -; CHECK: @switch.table.cprop = private unnamed_addr constant [7 x i32] [i32 5, i32 42, i32 126, i32 -452, i32 128, i32 6, i32 7], align 4 - -; The table for @unreachable_case -; CHECK: @switch.table.unreachable_case = private unnamed_addr constant [9 x i32] [i32 0, i32 0, i32 0, i32 2, i32 -1, i32 1, i32 1, i32 1, i32 1], align 4 - -; A simple int-to-int selection switch. -; It is dense enough to be replaced by table lookup. -; The result is directly by a ret from an otherwise empty bb, -; so we return early, directly from the lookup bb. - -define i32 @f(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - i32 46, label %sw.bb4 - i32 47, label %sw.bb5 - i32 48, label %sw.bb6 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.bb5: br label %return -sw.bb6: br label %return -sw.default: br label %return -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-LABEL: @f( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %c, 42 -; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 7 -; CHECK-NEXT: br i1 %0, label %switch.lookup, label %return -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.gep = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.f, i32 0, i32 %switch.tableidx -; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep -; CHECK-NEXT: ret i32 %switch.load -; CHECK: return: -; CHECK-NEXT: ret i32 15 -} - -; Same thing, but with i8's - -define i8 @char(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - i32 46, label %sw.bb4 - i32 47, label %sw.bb5 - i32 48, label %sw.bb6 - i32 49, label %sw.bb7 - i32 50, label %sw.bb8 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.bb5: br label %return -sw.bb6: br label %return -sw.bb7: br label %return -sw.bb8: br label %return -sw.default: br label %return -return: - %retval.0 = phi i8 [ 15, %sw.default ], [ 84, %sw.bb8 ], [ 33, %sw.bb7 ], [ 1, %sw.bb6 ], [ 62, %sw.bb5 ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] - ret i8 %retval.0 - -; CHECK-LABEL: @char( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %c, 42 -; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 9 -; CHECK-NEXT: br i1 %0, label %switch.lookup, label %return -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.gep = getelementptr inbounds [9 x i8], [9 x i8]* @switch.table.char, i32 0, i32 %switch.tableidx -; CHECK-NEXT: %switch.load = load i8, i8* %switch.gep -; CHECK-NEXT: ret i8 %switch.load -; CHECK: return: -; CHECK-NEXT: ret i8 15 -} - -; A switch used to initialize two variables, an i8 and a float. - -declare void @dummy(i8 signext, float) -define void @h(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.epilog - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] - -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog - -sw.epilog: - %a.0 = phi i8 [ 7, %sw.default ], [ 5, %sw.bb3 ], [ 88, %sw.bb2 ], [ 9, %sw.bb1 ], [ 42, %entry ] - %b.0 = phi float [ 0x4023FAE140000000, %sw.default ], [ 0x4001AE1480000000, %sw.bb3 ], [ 0x4012449BA0000000, %sw.bb2 ], [ 0x3FF3BE76C0000000, %sw.bb1 ], [ 0x40091EB860000000, %entry ] - call void @dummy(i8 signext %a.0, float %b.0) - ret void - -; CHECK-LABEL: @h( -; CHECK: entry: -; CHECK-NEXT: %0 = icmp ult i32 %x, 4 -; CHECK-NEXT: br i1 %0, label %switch.lookup, label %sw.epilog -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.shiftamt = mul i32 %x, 8 -; CHECK-NEXT: %switch.downshift = lshr i32 89655594, %switch.shiftamt -; CHECK-NEXT: %switch.masked = trunc i32 %switch.downshift to i8 -; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x float], [4 x float]* @switch.table.h, i32 0, i32 %x -; CHECK-NEXT: %switch.load = load float, float* %switch.gep -; CHECK-NEXT: br label %sw.epilog -; CHECK: sw.epilog: -; CHECK-NEXT: %a.0 = phi i8 [ %switch.masked, %switch.lookup ], [ 7, %entry ] -; CHECK-NEXT: %b.0 = phi float [ %switch.load, %switch.lookup ], [ 0x4023FAE140000000, %entry ] -; CHECK-NEXT: call void @dummy(i8 signext %a.0, float %b.0) -; CHECK-NEXT: ret void -} - - -; Switch used to return a string. - -@.str = private unnamed_addr constant [4 x i8] c"foo\00", align 1 -@.str1 = private unnamed_addr constant [4 x i8] c"bar\00", align 1 -@.str2 = private unnamed_addr constant [4 x i8] c"baz\00", align 1 -@.str3 = private unnamed_addr constant [4 x i8] c"qux\00", align 1 -@.str4 = private unnamed_addr constant [6 x i8] c"error\00", align 1 - -define i8* @foostring(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return - -return: - %retval.0 = phi i8* [ getelementptr inbounds ([6 x i8], [6 x i8]* @.str4, i64 0, i64 0), %sw.default ], - [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str3, i64 0, i64 0), %sw.bb3 ], - [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0), %sw.bb2 ], - [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0), %sw.bb1 ], - [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), %entry ] - ret i8* %retval.0 - -; CHECK-LABEL: @foostring( -; CHECK: entry: -; CHECK-NEXT: %0 = icmp ult i32 %x, 4 -; CHECK-NEXT: br i1 %0, label %switch.lookup, label %return -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i8*], [4 x i8*]* @switch.table.foostring, i32 0, i32 %x -; CHECK-NEXT: %switch.load = load i8*, i8** %switch.gep -; CHECK-NEXT: ret i8* %switch.load -} - -; Switch used to initialize two values. The first value is returned, the second -; value is not used. This used to make the transformation generate illegal code. - -define i32 @earlyreturncrash(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.epilog - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] - -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog - -sw.epilog: - %a.0 = phi i32 [ 7, %sw.default ], [ 5, %sw.bb3 ], [ 88, %sw.bb2 ], [ 9, %sw.bb1 ], [ 42, %entry ] - %b.0 = phi i32 [ 10, %sw.default ], [ 5, %sw.bb3 ], [ 1, %sw.bb2 ], [ 4, %sw.bb1 ], [ 3, %entry ] - ret i32 %a.0 - -; CHECK-LABEL: @earlyreturncrash( -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.earlyreturncrash, i32 0, i32 %x -; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep -; CHECK-NEXT: ret i32 %switch.load -; CHECK: sw.epilog: -; CHECK-NEXT: ret i32 7 -} - - -; Example 7 from http://blog.regehr.org/archives/320 -; It is not dense enough for a regular table, but the results -; can be packed into a bitmap. - -define i32 @crud(i8 zeroext %c) { -entry: - %cmp = icmp ult i8 %c, 33 - br i1 %cmp, label %lor.end, label %switch.early.test - -switch.early.test: - switch i8 %c, label %lor.rhs [ - i8 92, label %lor.end - i8 62, label %lor.end - i8 60, label %lor.end - i8 59, label %lor.end - i8 58, label %lor.end - i8 46, label %lor.end - i8 44, label %lor.end - i8 34, label %lor.end - i8 39, label %switch.edge - ] - -switch.edge: br label %lor.end -lor.rhs: br label %lor.end - -lor.end: - %0 = phi i1 [ true, %switch.early.test ], - [ false, %lor.rhs ], - [ true, %entry ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.early.test ], - [ true, %switch.edge ] - %lor.ext = zext i1 %0 to i32 - ret i32 %lor.ext - -; 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 -; CHECK: switch.early.test: -; CHECK-NEXT: %switch.tableidx = sub i8 %c, 34 -; CHECK-NEXT: %0 = icmp ult i8 %switch.tableidx, 59 -; CHECK-NEXT: br i1 %0, label %switch.lookup, label %lor.end -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.cast = zext i8 %switch.tableidx to i59 -; CHECK-NEXT: %switch.shiftamt = mul i59 %switch.cast, 1 -; CHECK-NEXT: %switch.downshift = lshr i59 -288230375765830623, %switch.shiftamt -; CHECK-NEXT: %switch.masked = trunc i59 %switch.downshift to i1 -; CHECK-NEXT: br label %lor.end -; CHECK: lor.end: -; CHECK-NEXT: %1 = phi i1 [ true, %entry ], [ %switch.masked, %switch.lookup ], [ false, %switch.early.test ] -; CHECK-NEXT: %lor.ext = zext i1 %1 to i32 -; CHECK-NEXT: ret i32 %lor.ext -} - -; PR13946 -define i32 @overflow(i32 %type) { -entry: - switch i32 %type, label %sw.default [ - i32 -2147483648, label %sw.bb - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 -2147483645, label %sw.bb3 - i32 3, label %sw.bb3 - ] - -sw.bb: br label %if.end -sw.bb1: br label %if.end -sw.bb2: br label %if.end -sw.bb3: br label %if.end -sw.default: br label %if.end -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-LABEL: define i32 @overflow( -; CHECK: switch -; CHECK: phi -} - -; PR13985 -define i1 @undef(i32 %tmp) { -bb: - switch i32 %tmp, label %bb3 [ - i32 0, label %bb1 - i32 1, label %bb1 - i32 7, label %bb2 - i32 8, label %bb2 - ] - -bb1: br label %bb3 -bb2: br label %bb3 - -bb3: - %tmp4 = phi i1 [ undef, %bb ], [ false, %bb2 ], [ true, %bb1 ] - ret i1 %tmp4 -; CHECK-LABEL: define i1 @undef( -; CHECK: %switch.cast = trunc i32 %tmp to i9 -; CHECK: %switch.downshift = lshr i9 3, %switch.shiftamt -} - -; Also handle large switches that would be rejected by -; isValueEqualityComparison() -; CHECK: large -; CHECK-NOT: switch i32 -define i32 @large(i32 %x) { -entry: - %cmp = icmp slt i32 %x, 0 - br i1 %cmp, label %if.then, label %if.end - -if.then: - %mul = mul i32 %x, -10 - br label %if.end - -if.end: - %x.addr.0 = phi i32 [ %mul, %if.then ], [ %x, %entry ] - switch i32 %x.addr.0, label %return [ - i32 199, label %sw.bb203 - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - i32 4, label %sw.bb4 - i32 5, label %sw.bb5 - i32 6, label %sw.bb6 - i32 7, label %sw.bb7 - i32 8, label %sw.bb8 - i32 9, label %sw.bb9 - i32 10, label %sw.bb10 - i32 11, label %sw.bb11 - i32 12, label %sw.bb12 - i32 13, label %sw.bb13 - i32 14, label %sw.bb14 - i32 15, label %sw.bb15 - i32 16, label %sw.bb16 - i32 17, label %sw.bb17 - i32 18, label %sw.bb18 - i32 19, label %sw.bb19 - i32 20, label %sw.bb20 - i32 21, label %sw.bb21 - i32 22, label %sw.bb22 - i32 23, label %sw.bb23 - i32 24, label %sw.bb24 - i32 25, label %sw.bb25 - i32 26, label %sw.bb26 - i32 27, label %sw.bb27 - i32 28, label %sw.bb28 - i32 29, label %sw.bb29 - i32 30, label %sw.bb30 - i32 31, label %sw.bb31 - i32 32, label %sw.bb32 - i32 33, label %sw.bb33 - i32 34, label %sw.bb34 - i32 35, label %sw.bb35 - i32 36, label %sw.bb37 - i32 37, label %sw.bb38 - i32 38, label %sw.bb39 - i32 39, label %sw.bb40 - i32 40, label %sw.bb41 - i32 41, label %sw.bb42 - i32 42, label %sw.bb43 - i32 43, label %sw.bb44 - i32 44, label %sw.bb45 - i32 45, label %sw.bb47 - i32 46, label %sw.bb48 - i32 47, label %sw.bb49 - i32 48, label %sw.bb50 - i32 49, label %sw.bb51 - i32 50, label %sw.bb52 - i32 51, label %sw.bb53 - i32 52, label %sw.bb54 - i32 53, label %sw.bb55 - i32 54, label %sw.bb56 - i32 55, label %sw.bb58 - i32 56, label %sw.bb59 - i32 57, label %sw.bb60 - i32 58, label %sw.bb61 - i32 59, label %sw.bb62 - i32 60, label %sw.bb63 - i32 61, label %sw.bb64 - i32 62, label %sw.bb65 - i32 63, label %sw.bb66 - i32 64, label %sw.bb67 - i32 65, label %sw.bb68 - i32 66, label %sw.bb69 - i32 67, label %sw.bb70 - i32 68, label %sw.bb71 - i32 69, label %sw.bb72 - i32 70, label %sw.bb73 - i32 71, label %sw.bb74 - i32 72, label %sw.bb76 - i32 73, label %sw.bb77 - i32 74, label %sw.bb78 - i32 75, label %sw.bb79 - i32 76, label %sw.bb80 - i32 77, label %sw.bb81 - i32 78, label %sw.bb82 - i32 79, label %sw.bb83 - i32 80, label %sw.bb84 - i32 81, label %sw.bb85 - i32 82, label %sw.bb86 - i32 83, label %sw.bb87 - i32 84, label %sw.bb88 - i32 85, label %sw.bb89 - i32 86, label %sw.bb90 - i32 87, label %sw.bb91 - i32 88, label %sw.bb92 - i32 89, label %sw.bb93 - i32 90, label %sw.bb94 - i32 91, label %sw.bb95 - i32 92, label %sw.bb96 - i32 93, label %sw.bb97 - i32 94, label %sw.bb98 - i32 95, label %sw.bb99 - i32 96, label %sw.bb100 - i32 97, label %sw.bb101 - i32 98, label %sw.bb102 - i32 99, label %sw.bb103 - i32 100, label %sw.bb104 - i32 101, label %sw.bb105 - i32 102, label %sw.bb106 - i32 103, label %sw.bb107 - i32 104, label %sw.bb108 - i32 105, label %sw.bb109 - i32 106, label %sw.bb110 - i32 107, label %sw.bb111 - i32 108, label %sw.bb112 - i32 109, label %sw.bb113 - i32 110, label %sw.bb114 - i32 111, label %sw.bb115 - i32 112, label %sw.bb116 - i32 113, label %sw.bb117 - i32 114, label %sw.bb118 - i32 115, label %sw.bb119 - i32 116, label %sw.bb120 - i32 117, label %sw.bb121 - i32 118, label %sw.bb122 - i32 119, label %sw.bb123 - i32 120, label %sw.bb124 - i32 121, label %sw.bb125 - i32 122, label %sw.bb126 - i32 123, label %sw.bb127 - i32 124, label %sw.bb128 - i32 125, label %sw.bb129 - i32 126, label %sw.bb130 - i32 127, label %sw.bb131 - i32 128, label %sw.bb132 - i32 129, label %sw.bb133 - i32 130, label %sw.bb134 - i32 131, label %sw.bb135 - i32 132, label %sw.bb136 - i32 133, label %sw.bb137 - i32 134, label %sw.bb138 - i32 135, label %sw.bb139 - i32 136, label %sw.bb140 - i32 137, label %sw.bb141 - i32 138, label %sw.bb142 - i32 139, label %sw.bb143 - i32 140, label %sw.bb144 - i32 141, label %sw.bb145 - i32 142, label %sw.bb146 - i32 143, label %sw.bb147 - i32 144, label %sw.bb148 - i32 145, label %sw.bb149 - i32 146, label %sw.bb150 - i32 147, label %sw.bb151 - i32 148, label %sw.bb152 - i32 149, label %sw.bb153 - i32 150, label %sw.bb154 - i32 151, label %sw.bb155 - i32 152, label %sw.bb156 - i32 153, label %sw.bb157 - i32 154, label %sw.bb158 - i32 155, label %sw.bb159 - i32 156, label %sw.bb160 - i32 157, label %sw.bb161 - i32 158, label %sw.bb162 - i32 159, label %sw.bb163 - i32 160, label %sw.bb164 - i32 161, label %sw.bb165 - i32 162, label %sw.bb166 - i32 163, label %sw.bb167 - i32 164, label %sw.bb168 - i32 165, label %sw.bb169 - i32 166, label %sw.bb170 - i32 167, label %sw.bb171 - i32 168, label %sw.bb172 - i32 169, label %sw.bb173 - i32 170, label %sw.bb174 - i32 171, label %sw.bb175 - i32 172, label %sw.bb176 - i32 173, label %sw.bb177 - i32 174, label %sw.bb178 - i32 175, label %sw.bb179 - i32 176, label %sw.bb180 - i32 177, label %sw.bb181 - i32 178, label %sw.bb182 - i32 179, label %sw.bb183 - i32 180, label %sw.bb184 - i32 181, label %sw.bb185 - i32 182, label %sw.bb186 - i32 183, label %sw.bb187 - i32 184, label %sw.bb188 - i32 185, label %sw.bb189 - i32 186, label %sw.bb190 - i32 187, label %sw.bb191 - i32 188, label %sw.bb192 - i32 189, label %sw.bb193 - i32 190, label %sw.bb194 - i32 191, label %sw.bb195 - i32 192, label %sw.bb196 - i32 193, label %sw.bb197 - i32 194, label %sw.bb198 - i32 195, label %sw.bb199 - i32 196, label %sw.bb200 - i32 197, label %sw.bb201 - i32 198, label %sw.bb202 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.bb5: br label %return -sw.bb6: br label %return -sw.bb7: br label %return -sw.bb8: br label %return -sw.bb9: br label %return -sw.bb10: br label %return -sw.bb11: br label %return -sw.bb12: br label %return -sw.bb13: br label %return -sw.bb14: br label %return -sw.bb15: br label %return -sw.bb16: br label %return -sw.bb17: br label %return -sw.bb18: br label %return -sw.bb19: br label %return -sw.bb20: br label %return -sw.bb21: br label %return -sw.bb22: br label %return -sw.bb23: br label %return -sw.bb24: br label %return -sw.bb25: br label %return -sw.bb26: br label %return -sw.bb27: br label %return -sw.bb28: br label %return -sw.bb29: br label %return -sw.bb30: br label %return -sw.bb31: br label %return -sw.bb32: br label %return -sw.bb33: br label %return -sw.bb34: br label %return -sw.bb35: br label %return -sw.bb37: br label %return -sw.bb38: br label %return -sw.bb39: br label %return -sw.bb40: br label %return -sw.bb41: br label %return -sw.bb42: br label %return -sw.bb43: br label %return -sw.bb44: br label %return -sw.bb45: br label %return -sw.bb47: br label %return -sw.bb48: br label %return -sw.bb49: br label %return -sw.bb50: br label %return -sw.bb51: br label %return -sw.bb52: br label %return -sw.bb53: br label %return -sw.bb54: br label %return -sw.bb55: br label %return -sw.bb56: br label %return -sw.bb58: br label %return -sw.bb59: br label %return -sw.bb60: br label %return -sw.bb61: br label %return -sw.bb62: br label %return -sw.bb63: br label %return -sw.bb64: br label %return -sw.bb65: br label %return -sw.bb66: br label %return -sw.bb67: br label %return -sw.bb68: br label %return -sw.bb69: br label %return -sw.bb70: br label %return -sw.bb71: br label %return -sw.bb72: br label %return -sw.bb73: br label %return -sw.bb74: br label %return -sw.bb76: br label %return -sw.bb77: br label %return -sw.bb78: br label %return -sw.bb79: br label %return -sw.bb80: br label %return -sw.bb81: br label %return -sw.bb82: br label %return -sw.bb83: br label %return -sw.bb84: br label %return -sw.bb85: br label %return -sw.bb86: br label %return -sw.bb87: br label %return -sw.bb88: br label %return -sw.bb89: br label %return -sw.bb90: br label %return -sw.bb91: br label %return -sw.bb92: br label %return -sw.bb93: br label %return -sw.bb94: br label %return -sw.bb95: br label %return -sw.bb96: br label %return -sw.bb97: br label %return -sw.bb98: br label %return -sw.bb99: br label %return -sw.bb100: br label %return -sw.bb101: br label %return -sw.bb102: br label %return -sw.bb103: br label %return -sw.bb104: br label %return -sw.bb105: br label %return -sw.bb106: br label %return -sw.bb107: br label %return -sw.bb108: br label %return -sw.bb109: br label %return -sw.bb110: br label %return -sw.bb111: br label %return -sw.bb112: br label %return -sw.bb113: br label %return -sw.bb114: br label %return -sw.bb115: br label %return -sw.bb116: br label %return -sw.bb117: br label %return -sw.bb118: br label %return -sw.bb119: br label %return -sw.bb120: br label %return -sw.bb121: br label %return -sw.bb122: br label %return -sw.bb123: br label %return -sw.bb124: br label %return -sw.bb125: br label %return -sw.bb126: br label %return -sw.bb127: br label %return -sw.bb128: br label %return -sw.bb129: br label %return -sw.bb130: br label %return -sw.bb131: br label %return -sw.bb132: br label %return -sw.bb133: br label %return -sw.bb134: br label %return -sw.bb135: br label %return -sw.bb136: br label %return -sw.bb137: br label %return -sw.bb138: br label %return -sw.bb139: br label %return -sw.bb140: br label %return -sw.bb141: br label %return -sw.bb142: br label %return -sw.bb143: br label %return -sw.bb144: br label %return -sw.bb145: br label %return -sw.bb146: br label %return -sw.bb147: br label %return -sw.bb148: br label %return -sw.bb149: br label %return -sw.bb150: br label %return -sw.bb151: br label %return -sw.bb152: br label %return -sw.bb153: br label %return -sw.bb154: br label %return -sw.bb155: br label %return -sw.bb156: br label %return -sw.bb157: br label %return -sw.bb158: br label %return -sw.bb159: br label %return -sw.bb160: br label %return -sw.bb161: br label %return -sw.bb162: br label %return -sw.bb163: br label %return -sw.bb164: br label %return -sw.bb165: br label %return -sw.bb166: br label %return -sw.bb167: br label %return -sw.bb168: br label %return -sw.bb169: br label %return -sw.bb170: br label %return -sw.bb171: br label %return -sw.bb172: br label %return -sw.bb173: br label %return -sw.bb174: br label %return -sw.bb175: br label %return -sw.bb176: br label %return -sw.bb177: br label %return -sw.bb178: br label %return -sw.bb179: br label %return -sw.bb180: br label %return -sw.bb181: br label %return -sw.bb182: br label %return -sw.bb183: br label %return -sw.bb184: br label %return -sw.bb185: br label %return -sw.bb186: br label %return -sw.bb187: br label %return -sw.bb188: br label %return -sw.bb189: br label %return -sw.bb190: br label %return -sw.bb191: br label %return -sw.bb192: br label %return -sw.bb193: br label %return -sw.bb194: br label %return -sw.bb195: br label %return -sw.bb196: br label %return -sw.bb197: br label %return -sw.bb198: br label %return -sw.bb199: br label %return -sw.bb200: br label %return -sw.bb201: br label %return -sw.bb202: br label %return -sw.bb203: br label %return - -return: - %retval.0 = phi i32 [ 39204, %sw.bb202 ], [ 38809, %sw.bb201 ], [ 38416, %sw.bb200 ], [ 38025, %sw.bb199 ], [ 37636, %sw.bb198 ], [ 37249, %sw.bb197 ], [ 36864, %sw.bb196 ], [ 36481, %sw.bb195 ], [ 36100, %sw.bb194 ], [ 35721, %sw.bb193 ], [ 35344, %sw.bb192 ], [ 34969, %sw.bb191 ], [ 34596, %sw.bb190 ], [ 34225, %sw.bb189 ], [ 33856, %sw.bb188 ], [ 33489, %sw.bb187 ], [ 33124, %sw.bb186 ], [ 32761, %sw.bb185 ], [ 32400, %sw.bb184 ], [ 32041, %sw.bb183 ], [ 31684, %sw.bb182 ], [ 31329, %sw.bb181 ], [ 30976, %sw.bb180 ], [ 30625, %sw.bb179 ], [ 30276, %sw.bb178 ], [ 29929, %sw.bb177 ], [ 29584, %sw.bb176 ], [ 29241, %sw.bb175 ], [ 28900, %sw.bb174 ], [ 28561, %sw.bb173 ], [ 28224, %sw.bb172 ], [ 27889, %sw.bb171 ], [ 27556, %sw.bb170 ], [ 27225, %sw.bb169 ], [ 26896, %sw.bb168 ], [ 26569, %sw.bb167 ], [ 26244, %sw.bb166 ], [ 25921, %sw.bb165 ], [ 25600, %sw.bb164 ], [ 25281, %sw.bb163 ], [ 24964, %sw.bb162 ], [ 24649, %sw.bb161 ], [ 24336, %sw.bb160 ], [ 24025, %sw.bb159 ], [ 23716, %sw.bb158 ], [ 23409, %sw.bb157 ], [ 23104, %sw.bb156 ], [ 22801, %sw.bb155 ], [ 22500, %sw.bb154 ], [ 22201, %sw.bb153 ], [ 21904, %sw.bb152 ], [ 21609, %sw.bb151 ], [ 21316, %sw.bb150 ], [ 21025, %sw.bb149 ], [ 20736, %sw.bb148 ], [ 20449, %sw.bb147 ], [ 20164, %sw.bb146 ], [ 19881, %sw.bb145 ], [ 19600, %sw.bb144 ], [ 19321, %sw.bb143 ], [ 19044, %sw.bb142 ], [ 18769, %sw.bb141 ], [ 18496, %sw.bb140 ], [ 18225, %sw.bb139 ], [ 17956, %sw.bb138 ], [ 17689, %sw.bb137 ], [ 17424, %sw.bb136 ], [ 17161, %sw.bb135 ], [ 16900, %sw.bb134 ], [ 16641, %sw.bb133 ], [ 16384, %sw.bb132 ], [ 16129, %sw.bb131 ], [ 15876, %sw.bb130 ], [ 15625, %sw.bb129 ], [ 15376, %sw.bb128 ], [ 15129, %sw.bb127 ], [ 14884, %sw.bb126 ], [ 14641, %sw.bb125 ], [ 14400, %sw.bb124 ], [ 14161, %sw.bb123 ], [ 13924, %sw.bb122 ], [ 13689, %sw.bb121 ], [ 13456, %sw.bb120 ], [ 13225, %sw.bb119 ], [ 12996, %sw.bb118 ], [ 12769, %sw.bb117 ], [ 12544, %sw.bb116 ], [ 12321, %sw.bb115 ], [ 12100, %sw.bb114 ], [ 11881, %sw.bb113 ], [ 11664, %sw.bb112 ], [ 11449, %sw.bb111 ], [ 11236, %sw.bb110 ], [ 11025, %sw.bb109 ], [ 10816, %sw.bb108 ], [ 10609, %sw.bb107 ], [ 10404, %sw.bb106 ], [ 10201, %sw.bb105 ], [ 10000, %sw.bb104 ], [ 9801, %sw.bb103 ], [ 9604, %sw.bb102 ], [ 9409, %sw.bb101 ], [ 9216, %sw.bb100 ], [ 9025, %sw.bb99 ], [ 8836, %sw.bb98 ], [ 8649, %sw.bb97 ], [ 8464, %sw.bb96 ], [ 8281, %sw.bb95 ], [ 8100, %sw.bb94 ], [ 7921, %sw.bb93 ], [ 7744, %sw.bb92 ], [ 7569, %sw.bb91 ], [ 7396, %sw.bb90 ], [ 7225, %sw.bb89 ], [ 7056, %sw.bb88 ], [ 6889, %sw.bb87 ], [ 6724, %sw.bb86 ], [ 6561, %sw.bb85 ], [ 6400, %sw.bb84 ], [ 6241, %sw.bb83 ], [ 6084, %sw.bb82 ], [ 5929, %sw.bb81 ], [ 5776, %sw.bb80 ], [ 5625, %sw.bb79 ], [ 5476, %sw.bb78 ], [ 5329, %sw.bb77 ], [ 5184, %sw.bb76 ], [ 5112, %sw.bb74 ], [ 4900, %sw.bb73 ], [ 4761, %sw.bb72 ], [ 4624, %sw.bb71 ], [ 4489, %sw.bb70 ], [ 4356, %sw.bb69 ], [ 4225, %sw.bb68 ], [ 4096, %sw.bb67 ], [ 3969, %sw.bb66 ], [ 3844, %sw.bb65 ], [ 3721, %sw.bb64 ], [ 3600, %sw.bb63 ], [ 3481, %sw.bb62 ], [ 3364, %sw.bb61 ], [ 3249, %sw.bb60 ], [ 3136, %sw.bb59 ], [ 3025, %sw.bb58 ], [ 2970, %sw.bb56 ], [ 2809, %sw.bb55 ], [ 2704, %sw.bb54 ], [ 2601, %sw.bb53 ], [ 2500, %sw.bb52 ], [ 2401, %sw.bb51 ], [ 2304, %sw.bb50 ], [ 2209, %sw.bb49 ], [ 2116, %sw.bb48 ], [ 2025, %sw.bb47 ], [ 1980, %sw.bb45 ], [ 1849, %sw.bb44 ], [ 1764, %sw.bb43 ], [ 1681, %sw.bb42 ], [ 1600, %sw.bb41 ], [ 1521, %sw.bb40 ], [ 1444, %sw.bb39 ], [ 1369, %sw.bb38 ], [ 1296, %sw.bb37 ], [ 1260, %sw.bb35 ], [ 1156, %sw.bb34 ], [ 1089, %sw.bb33 ], [ 1024, %sw.bb32 ], [ 961, %sw.bb31 ], [ 900, %sw.bb30 ], [ 841, %sw.bb29 ], [ 784, %sw.bb28 ], [ 729, %sw.bb27 ], [ 676, %sw.bb26 ], [ 625, %sw.bb25 ], [ 576, %sw.bb24 ], [ 529, %sw.bb23 ], [ 484, %sw.bb22 ], [ 441, %sw.bb21 ], [ 400, %sw.bb20 ], [ 361, %sw.bb19 ], [ 342, %sw.bb18 ], [ 289, %sw.bb17 ], [ 256, %sw.bb16 ], [ 225, %sw.bb15 ], [ 196, %sw.bb14 ], [ 169, %sw.bb13 ], [ 144, %sw.bb12 ], [ 121, %sw.bb11 ], [ 100, %sw.bb10 ], [ 81, %sw.bb9 ], [ 64, %sw.bb8 ], [ 49, %sw.bb7 ], [ 36, %sw.bb6 ], [ 25, %sw.bb5 ], [ 16, %sw.bb4 ], [ 9, %sw.bb3 ], [ 4, %sw.bb2 ], [ 1, %sw.bb1 ], [ 39601, %sw.bb203 ], [ 0, %if.end ] - ret i32 %retval.0 -} - -define i32 @cprop(i32 %x, i32 %y) { -entry: - switch i32 %x, label %sw.default [ - i32 1, label %return - i32 2, label %sw.bb1 - i32 3, label %sw.bb2 - i32 4, label %sw.bb2 - i32 5, label %sw.bb2 - i32 6, label %sw.bb3 - i32 7, label %sw.bb3 - ] - -sw.bb1: br label %return - -sw.bb2: - %and = and i32 %x, 1 - %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 - -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 ], [ %select, %sw.bb3 ], [ %sub, %sw.bb2 ], [ 42, %sw.bb1 ], [ 5, %entry ] - ret i32 %retval.0 - -; CHECK-LABEL: @cprop( -; CHECK: switch.lookup: -; CHECK: %switch.gep = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.cprop, i32 0, i32 %switch.tableidx -} - -define i32 @unreachable_case(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb - i32 2, label %sw.bb - i32 3, label %sw.bb1 - i32 4, label %sw.bb2 - i32 5, label %sw.bb3 - i32 6, label %sw.bb3 - i32 7, label %sw.bb3 - i32 8, label %sw.bb3 - ] - -sw.bb: br label %return -sw.bb1: unreachable -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return - -return: - %retval.0 = phi i32 [ 1, %sw.bb3 ], [ -1, %sw.bb2 ], [ 0, %sw.bb ], [ 2, %sw.default ] - ret i32 %retval.0 - -; CHECK-LABEL: @unreachable_case( -; CHECK: switch.lookup: -; CHECK: getelementptr inbounds [9 x i32], [9 x i32]* @switch.table.unreachable_case, i32 0, i32 %x -} - -define i32 @unreachable_default(i32 %x) { -entry: - switch i32 %x, label %default [ - i32 0, label %bb0 - i32 1, label %bb1 - i32 2, label %bb2 - i32 3, label %bb3 - ] - -bb0: br label %return -bb1: br label %return -bb2: br label %return -bb3: br label %return -default: unreachable - -return: - %retval = phi i32 [ 42, %bb0 ], [ 52, %bb1 ], [ 1, %bb2 ], [ 2, %bb3 ] - ret i32 %retval - -; CHECK-LABEL: @unreachable_default( -; CHECK: entry: -; CHECK-NOT: icmp -; CHECK-NOT: br 1i -; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.unreachable_default, i32 0, i32 %x -; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep -; CHECK-NEXT: ret i32 %switch.load -} - -; Don't create a table with illegal type -define i96 @illegaltype(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 42, label %return - i32 43, label %sw.bb1 - i32 44, label %sw.bb2 - i32 45, label %sw.bb3 - i32 46, label %sw.bb4 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.bb4: br label %return -sw.default: br label %return -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-LABEL: @illegaltype( -; CHECK-NOT: @switch.table -; CHECK: switch i32 %c -} - -; If we can build a lookup table without any holes, we don't need a default result. -declare void @exit(i32) -define i32 @nodefaultnoholes(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: call void @exit(i32 1) - unreachable -return: - %x = phi i32 [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] - ret i32 %x - -; CHECK-LABEL: @nodefaultnoholes( -; CHECK: @switch.table -; CHECK-NOT: switch i32 -} - -; This lookup table will have holes, so we need to test for the holes. -define i32 @nodefaultwithholes(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - i32 5, label %sw.bb3 - ] - -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: call void @exit(i32 1) - unreachable -return: - %x = phi i32 [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] - ret i32 %x - -; CHECK-LABEL: @nodefaultwithholes( -; CHECK: entry: -; CHECK: br i1 %{{.*}}, label %switch.hole_check, label %sw.default -; CHECK: switch.hole_check: -; CHECK-NEXT: %switch.maskindex = trunc i32 %c to i8 -; CHECK-NEXT: %switch.shifted = lshr i8 47, %switch.maskindex -; The mask is binary 101111. -; CHECK-NEXT: %switch.lobit = trunc i8 %switch.shifted to i1 -; CHECK-NEXT: br i1 %switch.lobit, label %switch.lookup, label %sw.default -; CHECK-NOT: switch i32 -} - -; We don't build lookup tables with holes for switches with less than four cases. -define i32 @threecasesholes(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 3, label %sw.bb2 - ] -sw.bb1: br label %return -sw.bb2: br label %return -sw.default: br label %return -return: - %x = phi i32 [ %c, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 9, %entry ] - ret i32 %x -; CHECK-LABEL: @threecasesholes( -; CHECK: switch i32 -; CHECK-NOT: @switch.table -} - -; We build lookup tables for switches with three or more cases. -define i32 @threecases(i32 %c) { -; CHECK-LABEL: @threecases( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 %c, 3 -; CHECK-NEXT: br i1 [[TMP0]], label %switch.lookup, label %return -; CHECK: switch.lookup: -; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x i32], [3 x i32]* @switch.table.threecases, i32 0, i32 %c -; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, i32* [[SWITCH_GEP]] -; CHECK-NEXT: ret i32 [[SWITCH_LOAD]] -; CHECK: return: -; CHECK-NEXT: ret i32 3 -; -entry: - switch i32 %c, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] -sw.bb1: - br label %return -sw.bb2: - br label %return -sw.default: - br label %return -return: - %x = phi i32 [ 3, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 10, %entry ] - ret i32 %x -} - -; We don't build tables for switches with two cases. -define i32 @twocases(i32 %c) { -; CHECK-LABEL: @twocases( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 %c, 1 -; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP:%.*]], i32 7, i32 3 -; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 %c, 0 -; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i32 9, i32 [[SWITCH_SELECT]] -; CHECK-NEXT: ret i32 [[SWITCH_SELECT2]] -; -entry: - switch i32 %c, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - ] -sw.bb1: - br label %return -sw.default: - br label %return -return: - %x = phi i32 [ 3, %sw.default ], [ 7, %sw.bb1 ], [ 9, %entry ] - ret i32 %x -} - -; Don't build tables for switches with TLS variables. -@tls_a = thread_local global i32 0 -@tls_b = thread_local global i32 0 -@tls_c = thread_local global i32 0 -@tls_d = thread_local global i32 0 -define i32* @tls(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] -sw.bb1: - br label %return -sw.bb2: - br label %return -sw.default: - br label %return -return: - %retval.0 = phi i32* [ @tls_d, %sw.default ], [ @tls_c, %sw.bb2 ], [ @tls_b, %sw.bb1 ], [ @tls_a, %entry ] - ret i32* %retval.0 -; CHECK-LABEL: @tls( -; CHECK: switch i32 -; CHECK-NOT: @switch.table -} - -; Don't build tables for switches with dllimport variables. -@dllimport_a = external dllimport global [3x i32] -@dllimport_b = external dllimport global [3x i32] -@dllimport_c = external dllimport global [3x i32] -@dllimport_d = external dllimport global [3x i32] -define i32* @dllimport(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %return - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - ] -sw.bb1: - br label %return -sw.bb2: - br label %return -sw.default: - br label %return -return: - %retval.0 = phi i32* [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_d, i32 0, i32 0), %sw.default ], - [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_c, i32 0, i32 0), %sw.bb2 ], - [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_b, i32 0, i32 0), %sw.bb1 ], - [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_a, i32 0, i32 0), %entry ] - ret i32* %retval.0 -; CHECK-LABEL: @dllimport( -; CHECK: switch i32 -; CHECK-NOT: @switch.table -} - -; We can use linear mapping. -define i8 @linearmap1(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 10, label %return - i32 11, label %sw.bb1 - i32 12, label %sw.bb2 - i32 13, label %sw.bb3 - ] -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %x = phi i8 [ 3, %sw.default ], [ 3, %sw.bb3 ], [ 8, %sw.bb2 ], [ 13, %sw.bb1 ], [ 18, %entry ] - ret i8 %x -; CHECK-LABEL: @linearmap1( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %c, 10 -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8 -; CHECK-NEXT: %switch.idx.mult = mul i8 %switch.idx.cast, -5 -; CHECK-NEXT: %switch.offset = add i8 %switch.idx.mult, 18 -; CHECK-NEXT: ret i8 %switch.offset -} - -; Linear mapping in a different configuration. -define i32 @linearmap2(i8 %c) { -entry: - switch i8 %c, label %sw.default [ - i8 -10, label %return - i8 -11, label %sw.bb1 - i8 -12, label %sw.bb2 - i8 -13, label %sw.bb3 - ] -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %x = phi i32 [ 3, %sw.default ], [ 18, %sw.bb3 ], [ 19, %sw.bb2 ], [ 20, %sw.bb1 ], [ 21, %entry ] - ret i32 %x -; CHECK-LABEL: @linearmap2( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i8 %c, -13 -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.idx.cast = zext i8 %switch.tableidx to i32 -; CHECK-NEXT: %switch.offset = add i32 %switch.idx.cast, 18 -; CHECK-NEXT: ret i32 %switch.offset -} - -; Linear mapping with overflows. -define i8 @linearmap3(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 10, label %return - i32 11, label %sw.bb1 - i32 12, label %sw.bb2 - i32 13, label %sw.bb3 - ] -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %x = phi i8 [ 3, %sw.default ], [ 44, %sw.bb3 ], [ -56, %sw.bb2 ], [ 100, %sw.bb1 ], [ 0, %entry ] - ret i8 %x -; CHECK-LABEL: @linearmap3( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %c, 10 -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8 -; CHECK-NEXT: %switch.idx.mult = mul i8 %switch.idx.cast, 100 -; CHECK-NEXT: ret i8 %switch.idx.mult -} - -; Linear mapping with with multiplier 1 and offset 0. -define i8 @linearmap4(i32 %c) { -entry: - switch i32 %c, label %sw.default [ - i32 -2, label %return - i32 -1, label %sw.bb1 - i32 0, label %sw.bb2 - i32 1, label %sw.bb3 - ] -sw.bb1: br label %return -sw.bb2: br label %return -sw.bb3: br label %return -sw.default: br label %return -return: - %x = phi i8 [ 3, %sw.default ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 1, %sw.bb1 ], [ 0, %entry ] - ret i8 %x -; CHECK-LABEL: @linearmap4( -; CHECK: entry: -; CHECK-NEXT: %switch.tableidx = sub i32 %c, -2 -; CHECK: switch.lookup: -; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8 -; CHECK-NEXT: ret i8 %switch.idx.cast -} - -; Reuse the inverted table range compare. -define i32 @reuse_cmp1(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] -sw.bb: br label %sw.epilog -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog -sw.epilog: - %r.0 = phi i32 [ 0, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ] - %cmp = icmp eq i32 %r.0, 0 ; This compare can be "replaced". - br i1 %cmp, label %if.then, label %if.end -if.then: br label %return -if.end: br label %return -return: - %retval.0 = phi i32 [ 100, %if.then ], [ %r.0, %if.end ] - ret i32 %retval.0 -; CHECK-LABEL: @reuse_cmp1( -; CHECK: entry: -; CHECK-NEXT: [[C:%.+]] = icmp ult i32 %x, 4 -; CHECK-NEXT: %inverted.cmp = xor i1 [[C]], true -; CHECK: [[R:%.+]] = select i1 %inverted.cmp, i32 100, i32 {{.*}} -; CHECK-NEXT: ret i32 [[R]] -} - -; Reuse the table range compare. -define i32 @reuse_cmp2(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] -sw.bb: br label %sw.epilog -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog -sw.epilog: - %r.0 = phi i32 [ 4, %sw.default ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 1, %sw.bb1 ], [ 0, %sw.bb ] - %cmp = icmp ne i32 %r.0, 4 ; This compare can be "replaced". - br i1 %cmp, label %if.then, label %if.end -if.then: br label %return -if.end: br label %return -return: - %retval.0 = phi i32 [ %r.0, %if.then ], [ 100, %if.end ] - ret i32 %retval.0 -; CHECK-LABEL: @reuse_cmp2( -; CHECK: entry: -; CHECK-NEXT: %0 = icmp ult i32 %x, 4 -; CHECK-NEXT: %x. = select i1 %0, i32 %x, i32 4 -; CHECK-NEXT: [[C:%.+]] = icmp ne i32 %x., 4 -; CHECK: [[R:%.+]] = select i1 %0, i32 {{.*}}, i32 100 -; CHECK-NEXT: ret i32 [[R]] -} - -; Cannot reuse the table range compare, because the default value is the same -; as one of the case values. -define i32 @no_reuse_cmp(i32 %x) { -entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] -sw.bb: br label %sw.epilog -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog -sw.epilog: - %r.0 = phi i32 [ 12, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ] - %cmp = icmp ne i32 %r.0, 0 - br i1 %cmp, label %if.then, label %if.end -if.then: br label %return -if.end: br label %return -return: - %retval.0 = phi i32 [ %r.0, %if.then ], [ 100, %if.end ] - ret i32 %retval.0 -; CHECK-LABEL: @no_reuse_cmp( -; CHECK: [[S:%.+]] = select -; CHECK-NEXT: %cmp = icmp ne i32 [[S]], 0 -; CHECK-NEXT: [[R:%.+]] = select i1 %cmp, i32 [[S]], i32 100 -; CHECK-NEXT: ret i32 [[R]] -} - -; Cannot reuse the table range compare, because the phi at the switch merge -; point is not dominated by the switch. -define i32 @no_reuse_cmp2(i32 %x, i32 %y) { -entry: - %ec = icmp ne i32 %y, 0 - br i1 %ec, label %switch.entry, label %sw.epilog -switch.entry: - switch i32 %x, label %sw.default [ - i32 0, label %sw.bb - i32 1, label %sw.bb1 - i32 2, label %sw.bb2 - i32 3, label %sw.bb3 - ] -sw.bb: br label %sw.epilog -sw.bb1: br label %sw.epilog -sw.bb2: br label %sw.epilog -sw.bb3: br label %sw.epilog -sw.default: br label %sw.epilog -sw.epilog: - %r.0 = phi i32 [100, %entry], [ 0, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ] - %cmp = icmp eq i32 %r.0, 0 ; This compare can be "replaced". - br i1 %cmp, label %if.then, label %if.end -if.then: br label %return -if.end: br label %return -return: - %retval.0 = phi i32 [ 100, %if.then ], [ %r.0, %if.end ] - ret i32 %retval.0 -; CHECK-LABEL: @no_reuse_cmp2( -; CHECK: %r.0 = phi -; CHECK-NEXT: %cmp = icmp eq i32 %r.0, 0 -; CHECK-NEXT: [[R:%.+]] = select i1 %cmp -; CHECK-NEXT: ret i32 [[R]] -} - -define void @pr20210(i8 %x, i1 %y) { -; %z has uses outside of its BB or the phi it feeds into, -; so doing a table lookup and jumping directly to while.cond would -; cause %z to cease dominating all its uses. - -entry: - br i1 %y, label %sw, label %intermediate - -sw: - switch i8 %x, label %end [ - i8 7, label %intermediate - i8 3, label %intermediate - i8 2, label %intermediate - i8 1, label %intermediate - i8 0, label %intermediate - ] - -intermediate: - %z = zext i8 %x to i32 - br label %while.cond - -while.cond: - %i = phi i32 [ %z, %intermediate ], [ %j, %while.body ] - %b = icmp ne i32 %i, 7 - br i1 %b, label %while.body, label %while.end - -while.body: - %j = add i32 %i, 1 - br label %while.cond - -while.end: - call void @exit(i32 %z) - unreachable - -end: - ret void -; CHECK-LABEL: @pr20210 -; CHECK: switch i8 %x -} - -; Make sure we do not crash due to trying to generate an unguarded -; lookup (since i3 can only hold values in the range of explicit -; values) and simultaneously trying to generate a branch to deal with -; the fact that we have holes in the range. -define i32 @covered_switch_with_bit_tests(i3) { -entry: - switch i3 %0, label %l6 [ - i3 -3, label %l5 - i3 -4, label %l5 - i3 3, label %l1 - i3 2, label %l1 - ] - -l1: br label %l2 - -l2: - %x = phi i32 [ 1, %l1 ], [ 2, %l5 ] - br label %l6 - -l5: br label %l2 - -l6: - %r = phi i32 [ %x, %l2 ], [ 0, %entry ] - ret i32 %r -; CHECK-LABEL: @covered_switch_with_bit_tests -; CHECK: entry -; CHECK-NEXT: switch -} - -; Speculation depth must be limited to avoid a zero-cost instruction cycle. - -; CHECK-LABEL: @PR26308( -; CHECK: cleanup4: -; CHECK-NEXT: br label %cleanup4 - -define i32 @PR26308(i1 %B, i64 %load) { -entry: - br label %while.body - -while.body: - br label %cleanup - -cleanup: - %cleanup.dest.slot.0 = phi i1 [ false, %while.body ] - br i1 %cleanup.dest.slot.0, label %for.cond, label %cleanup4 - -for.cond: - %e.0 = phi i64* [ undef, %cleanup ], [ %incdec.ptr, %for.cond2 ] - %pi = ptrtoint i64* %e.0 to i64 - %incdec.ptr = getelementptr inbounds i64, i64* %e.0, i64 1 - br label %for.cond2 - -for.cond2: - %storemerge = phi i64 [ %pi, %for.cond ], [ %load, %for.cond2 ] - br i1 %B, label %for.cond2, label %for.cond - -cleanup4: - br label %while.body -} - -declare void @throw(i1) - -define void @wineh_test(i64 %val) personality i32 (...)* @__CxxFrameHandler3 { -entry: - invoke void @throw(i1 false) - to label %unreachable unwind label %cleanup1 - -unreachable: - unreachable - -cleanup1: - %cleanuppad1 = cleanuppad within none [] - switch i64 %val, label %cleanupdone2 [ - i64 0, label %cleanupdone1 - i64 1, label %cleanupdone1 - i64 6, label %cleanupdone1 - ] - -cleanupdone1: - cleanupret from %cleanuppad1 unwind label %cleanup2 - -cleanupdone2: - cleanupret from %cleanuppad1 unwind label %cleanup2 - -cleanup2: - %phi = phi i1 [ true, %cleanupdone1 ], [ false, %cleanupdone2 ] - %cleanuppad2 = cleanuppad within none [] - call void @throw(i1 %phi) [ "funclet"(token %cleanuppad2) ] - unreachable -} - -; CHECK-LABEL: @wineh_test( -; CHECK: entry: -; CHECK: invoke void @throw(i1 false) -; CHECK: to label %[[unreachable:.*]] unwind label %[[cleanup1:.*]] - -; CHECK: [[unreachable]]: -; CHECK: unreachable - -; CHECK: [[cleanup1]]: -; CHECK: %[[cleanuppad1:.*]] = cleanuppad within none [] -; CHECK: switch i64 %val, label %[[cleanupdone2:.*]] [ -; CHECK: i64 0, label %[[cleanupdone1:.*]] -; CHECK: i64 1, label %[[cleanupdone1]] -; CHECK: i64 6, label %[[cleanupdone1]] -; CHECK: ] - -; CHECK: [[cleanupdone1]]: -; CHECK: cleanupret from %[[cleanuppad1]] unwind label %[[cleanup2:.*]] - -; CHECK: [[cleanupdone2]]: -; CHECK: cleanupret from %[[cleanuppad1]] unwind label %[[cleanup2]] - -; CHECK: [[cleanup2]]: -; CHECK: %[[phi:.*]] = phi i1 [ true, %[[cleanupdone1]] ], [ false, %[[cleanupdone2]] ] -; CHECK: %[[cleanuppad2:.*]] = cleanuppad within none [] -; CHECK: call void @throw(i1 %[[phi]]) [ "funclet"(token %[[cleanuppad2]]) ] -; CHECK: unreachable - -declare i32 @__CxxFrameHandler3(...) diff --git a/llvm/test/Transforms/SimplifyCFG/assume.ll b/llvm/test/Transforms/SimplifyCFG/assume.ll deleted file mode 100644 index 1d1b96a58ed..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/assume.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -define void @test1() { - call void @llvm.assume(i1 0) - ret void - -; CHECK-LABEL: @test1 -; CHECK-NOT: llvm.assume -; CHECK: unreachable -} - -define void @test2() { - call void @llvm.assume(i1 undef) - ret void - -; CHECK-LABEL: @test2 -; CHECK-NOT: llvm.assume -; CHECK: unreachable -} - -declare void @llvm.assume(i1) nounwind - diff --git a/llvm/test/Transforms/SimplifyCFG/attr-convergent.ll b/llvm/test/Transforms/SimplifyCFG/attr-convergent.ll deleted file mode 100644 index a5f363d055a..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/attr-convergent.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Checks that the SimplifyCFG pass won't duplicate a call to a function marked -; convergent. -; -; CHECK: call void @barrier -; CHECK-NOT: call void @barrier -define void @check(i1 %cond, i32* %out) { -entry: - br i1 %cond, label %if.then, label %if.end - -if.then: - store i32 5, i32* %out - br label %if.end - -if.end: - %x = phi i1 [ true, %entry ], [ false, %if.then ] - call void @barrier() - br i1 %x, label %cond.end, label %cond.false - -cond.false: - br label %cond.end - -cond.end: - ret void -} - -declare void @barrier() convergent diff --git a/llvm/test/Transforms/SimplifyCFG/attr-noduplicate.ll b/llvm/test/Transforms/SimplifyCFG/attr-noduplicate.ll deleted file mode 100644 index 5f8456ba405..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/attr-noduplicate.ll +++ /dev/null @@ -1,37 +0,0 @@ -; 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, i32* %out, i32 1 - %out2 = getelementptr i32, 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/llvm/test/Transforms/SimplifyCFG/basictest.ll b/llvm/test/Transforms/SimplifyCFG/basictest.ll deleted file mode 100644 index dedf698e1ce..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/basictest.ll +++ /dev/null @@ -1,133 +0,0 @@ -; Test CFG simplify removal of branch instructions. -; -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; RUN: opt < %s -passes=simplify-cfg -S | FileCheck %s - -define void @test1() { - br label %1 - ret void -; CHECK-LABEL: @test1( -; CHECK-NEXT: ret void -} - -define void @test2() { - ret void - ret void -; CHECK-LABEL: @test2( -; CHECK-NEXT: ret void -; CHECK-NEXT: } -} - -define void @test3(i1 %T) { - br i1 %T, label %1, label %1 - ret void -; CHECK-LABEL: @test3( -; CHECK-NEXT: ret void -} - -; Folding branch to a common destination. -; CHECK-LABEL: @test4_fold -; CHECK: %cmp1 = icmp eq i32 %a, %b -; CHECK: %cmp2 = icmp ugt i32 %a, 0 -; CHECK: %or.cond = and i1 %cmp1, %cmp2 -; CHECK: br i1 %or.cond, label %else, label %untaken -; CHECK-NOT: taken: -; CHECK: ret void -define void @test4_fold(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, 0 - br i1 %cmp2, label %else, label %untaken - -else: - call void @foo() - ret void - -untaken: - ret void -} - -; Prefer a simplification based on a dominating condition rather than folding a -; branch to a common destination. -; CHECK-LABEL: @test4 -; CHECK-NOT: br -; CHECK-NOT: br -; CHECK-NOT: call -; CHECK: ret void -define void @test4_no_fold(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %else, label %untaken - -else: - call void @foo() - ret void - -untaken: - ret void -} - -declare void @foo() - -; PR5795 -define void @test5(i32 %A) { - switch i32 %A, label %return [ - i32 2, label %1 - i32 10, label %2 - ] - - ret void - - ret void - -return: ; preds = %entry - ret void -; CHECK-LABEL: @test5( -; CHECK-NEXT: ret void -} - - -; PR14893 -define i8 @test6f() { -; CHECK-LABEL: @test6f -; CHECK: alloca i8, align 1 -; CHECK-NEXT: call i8 @test6g -; CHECK-NEXT: icmp eq i8 %tmp, 0 -; CHECK-NEXT: load i8, i8* %r, align 1, !dbg !{{[0-9]+$}} - -bb0: - %r = alloca i8, align 1 - %tmp = call i8 @test6g(i8* %r) - %tmp1 = icmp eq i8 %tmp, 0 - br i1 %tmp1, label %bb2, label %bb1 -bb1: - %tmp3 = load i8, i8* %r, align 1, !range !2, !tbaa !10, !dbg !5 - %tmp4 = icmp eq i8 %tmp3, 1 - br i1 %tmp4, label %bb2, label %bb3 -bb2: - br label %bb3 -bb3: - %tmp6 = phi i8 [ 0, %bb2 ], [ 1, %bb1 ] - ret i8 %tmp6 -} -declare i8 @test6g(i8*) - -!llvm.dbg.cu = !{!3} -!llvm.module.flags = !{!8, !9} - -!0 = !{!10, !10, i64 0} -!1 = !{!"foo"} -!2 = !{i8 0, i8 2} -!3 = distinct !DICompileUnit(language: DW_LANG_C99, file: !7, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !4) -!4 = !{} -!5 = !DILocation(line: 23, scope: !6) -!6 = distinct !DISubprogram(name: "foo", scope: !3, file: !7, line: 1, type: !DISubroutineType(types: !4), isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !3, retainedNodes: !4) -!7 = !DIFile(filename: "foo.c", directory: "/") -!8 = !{i32 2, !"Dwarf Version", i32 2} -!9 = !{i32 2, !"Debug Info Version", i32 3} -!10 = !{!"scalar type", !1} diff --git a/llvm/test/Transforms/SimplifyCFG/bbi-23595.ll b/llvm/test/Transforms/SimplifyCFG/bbi-23595.ll deleted file mode 100644 index 676a80bb33f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/bbi-23595.ll +++ /dev/null @@ -1,50 +0,0 @@ -; RUN: opt < %s -S -simplifycfg | FileCheck %s - -; In 'simplifycfg', during the flattening of a 'br', the instructions for the -; 'true' and 'false' parts, are moved out from their respective basic blocks. -; Their original debug locations (DILocations) and debug intrinsic instructions -; (dbg.values) are removed. -; As those basic blocks are now empty, their associated labels are removed. -; -; For the given test case, the labels 'W' and 'cleanup4' are removed. -; We're expecting the dbg.label associated with 'W' to disappear, because -; the 'W' label was removed. - -; CHECK-LABEL: _Z7test_itv() -; CHECK: entry: -; CHECK-NEXT: %retval.0 = select i1 undef, i16 1, i16 0 -; CHECK-NEXT: ret i16 0 - -define i16 @_Z7test_itv() { -entry: - br label %sw.bb - -sw.bb: ; preds = %entry - br i1 undef, label %W, label %cleanup4 - -W: ; preds = %sw.bb - call void @llvm.dbg.label(metadata !1), !dbg !8 - br label %cleanup4 - -cleanup4: ; preds = %W, %sw.bb - %retval.0 = phi i16 [ 1, %W ], [ 0, %sw.bb ] - ret i16 0 -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.label(metadata) #0 - -attributes #0 = { nounwind readnone speculatable } - -!llvm.dbg.cu = !{} -!llvm.module.flags = !{!0} - -!0 = !{i32 2, !"Debug Info Version", i32 3} -!1 = !DILabel(scope: !2, name: "W", file: !3, line: 47) -!2 = distinct !DILexicalBlock(scope: !4, file: !3, line: 40, column: 3) -!3 = !DIFile(filename: "foo.c", directory: "./") -!4 = distinct !DISubprogram(name: "test_it", scope: !3, file: !3, line: 35, type: !5, scopeLine: 36, unit: !7) -!5 = !DISubroutineType(types: !6) -!6 = !{} -!7 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug) -!8 = !DILocation(line: 47, column: 2, scope: !2) diff --git a/llvm/test/Transforms/SimplifyCFG/branch-cond-merge.ll b/llvm/test/Transforms/SimplifyCFG/branch-cond-merge.ll deleted file mode 100644 index f73e01ca476..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-cond-merge.ll +++ /dev/null @@ -1,19 +0,0 @@ -; RUN: opt < %s -simplifycfg -instcombine \ -; RUN: -simplifycfg -S | not grep call - -declare void @bar() - -define void @test(i32 %X, i32 %Y) { -entry: - %tmp.2 = icmp ne i32 %X, %Y ; <i1> [#uses=1] - br i1 %tmp.2, label %shortcirc_next, label %UnifiedReturnBlock -shortcirc_next: ; preds = %entry - %tmp.3 = icmp ne i32 %X, %Y ; <i1> [#uses=1] - br i1 %tmp.3, label %UnifiedReturnBlock, label %then -then: ; preds = %shortcirc_next - call void @bar( ) - ret void -UnifiedReturnBlock: ; preds = %shortcirc_next, %entry - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/branch-cond-prop.ll b/llvm/test/Transforms/SimplifyCFG/branch-cond-prop.ll deleted file mode 100644 index 448934e7250..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-cond-prop.ll +++ /dev/null @@ -1,17 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep call - -declare void @bar() - -define void @test(i32 %X, i32 %Y) { -entry: - %tmp.2 = icmp slt i32 %X, %Y ; <i1> [#uses=2] - br i1 %tmp.2, label %shortcirc_next, label %UnifiedReturnBlock -shortcirc_next: ; preds = %entry - br i1 %tmp.2, label %UnifiedReturnBlock, label %then -then: ; preds = %shortcirc_next - call void @bar( ) - ret void -UnifiedReturnBlock: ; preds = %shortcirc_next, %entry - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/branch-fold-dbg.ll b/llvm/test/Transforms/SimplifyCFG/branch-fold-dbg.ll deleted file mode 100644 index 2414b569ba4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-fold-dbg.ll +++ /dev/null @@ -1,59 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -%0 = type { i32*, i32* } - -@0 = external hidden constant [5 x %0], align 4 - -define void @foo(i32) nounwind ssp !dbg !0 { -Entry: - %1 = icmp slt i32 %0, 0, !dbg !5 - br i1 %1, label %BB5, label %BB1, !dbg !5 - -BB1: ; preds = %Entry - %2 = icmp sgt i32 %0, 4, !dbg !5 - br i1 %2, label %BB5, label %BB2, !dbg !5 - -BB2: ; preds = %BB1 - %3 = shl i32 1, %0, !dbg !5 - %4 = and i32 %3, 31, !dbg !5 - %5 = icmp eq i32 %4, 0, !dbg !5 - br i1 %5, label %BB5, label %BB3, !dbg !5 - -;CHECK: icmp eq -;CHECK-NEXT: getelementptr -;CHECK-NEXT: icmp eq - -BB3: ; preds = %BB2 - %6 = getelementptr inbounds [5 x %0], [5 x %0]* @0, i32 0, i32 %0, !dbg !6 - call void @llvm.dbg.value(metadata %0* %6, metadata !7, metadata !{}), !dbg !12 - %7 = icmp eq %0* %6, null, !dbg !13 - br i1 %7, label %BB5, label %BB4, !dbg !13 - -BB4: ; preds = %BB3 - %8 = icmp slt i32 %0, 0, !dbg !5 - ret void, !dbg !14 - -BB5: ; preds = %BB3, %BB2, %BB1, %Entry - ret void, !dbg !14 -} - -declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone - -!llvm.dbg.cu = !{!2} - -!0 = distinct !DISubprogram(name: "foo", line: 231, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !2, file: !15, scope: !1, type: !3) -!1 = !DIFile(filename: "a.c", directory: "/private/tmp") -!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang (trunk 129006)", isOptimized: true, emissionKind: FullDebug, file: !15, enums: !4, retainedTypes: !4) -!3 = !DISubroutineType(types: !4) -!4 = !{null} -!5 = !DILocation(line: 131, column: 2, scope: !0) -!6 = !DILocation(line: 134, column: 2, scope: !0) -!7 = !DILocalVariable(name: "bar", line: 232, scope: !8, file: !1, type: !9) -!8 = distinct !DILexicalBlock(line: 231, column: 1, file: !15, scope: !0) -!9 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 32, align: 32, scope: !2, baseType: !10) -!10 = !DIDerivedType(tag: DW_TAG_const_type, scope: !2, baseType: !11) -!11 = !DIBasicType(tag: DW_TAG_base_type, name: "unsigned int", size: 32, align: 32, encoding: DW_ATE_unsigned) -!12 = !DILocation(line: 232, column: 40, scope: !8) -!13 = !DILocation(line: 234, column: 2, scope: !8) -!14 = !DILocation(line: 274, column: 1, scope: !8) -!15 = !DIFile(filename: "a.c", directory: "/private/tmp") diff --git a/llvm/test/Transforms/SimplifyCFG/branch-fold-test.ll b/llvm/test/Transforms/SimplifyCFG/branch-fold-test.ll deleted file mode 100644 index 460f2456d8c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-fold-test.ll +++ /dev/null @@ -1,17 +0,0 @@ -; This test ensures that the simplifycfg pass continues to constant fold -; terminator instructions. - -; RUN: opt < %s -simplifycfg -S | not grep br - -define i32 @test(i32 %A, i32 %B) { -J: - %C = add i32 %A, 12 ; <i32> [#uses=2] - br i1 true, label %L, label %K -L: ; preds = %J - %D = add i32 %C, %B ; <i32> [#uses=1] - ret i32 %D -K: ; preds = %J - %E = add i32 %C, %B ; <i32> [#uses=1] - ret i32 %E -} - diff --git a/llvm/test/Transforms/SimplifyCFG/branch-fold-three.ll b/llvm/test/Transforms/SimplifyCFG/branch-fold-three.ll deleted file mode 100644 index 953749bfb16..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-fold-three.ll +++ /dev/null @@ -1,259 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; s >= t, s != t, s <= t -define void @foo1(i32 %s, i32 %t) { -; CHECK-LABEL: @foo1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[S:%.*]], [[T:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp sge i32 %s, %t - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp ne i32 %s, %t - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -; s != t, s >= t, s <= t -define void @foo11(i32 %s, i32 %t) { -; CHECK-LABEL: @foo11( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[S:%.*]], [[T:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp ne i32 %s, %t - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp sge i32 %s, %t - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -; s >= t, t != s, s <= t -define void @foo2(i32 %s, i32 %t) { -; CHECK-LABEL: @foo2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[S:%.*]], [[T:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[T]], [[S]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp sge i32 %s, %t - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp ne i32 %t, %s - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -; s != t, t <= s, s <= t -define void @foo21(i32 %s, i32 %t) { -; CHECK-LABEL: @foo21( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[S:%.*]], [[T:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i32 [[T]], [[S]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp ne i32 %s, %t - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp sle i32 %t, %s - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -; t <= s, t != s, s <= t -define void @foo3(i32 %s, i32 %t) { -; CHECK-LABEL: @foo3( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[T:%.*]], [[S:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[T]], [[S]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp sle i32 %t, %s - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp ne i32 %t, %s - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -; t != s, t <= s, s <= t -define void @foo31(i32 %s, i32 %t) { -; CHECK-LABEL: @foo31( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T:%.*]], [[S:%.*]] -; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END6:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @bar1(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i32 [[T]], [[S]] -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END6]] -; CHECK: if.then2: -; CHECK-NEXT: call void @bar2(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[S]], [[T]] -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN4:%.*]], label [[IF_END6]] -; CHECK: if.then4: -; CHECK-NEXT: call void @bar3(i32 [[S]], i32 [[T]]) -; CHECK-NEXT: br label [[IF_END6]] -; CHECK: if.end6: -; CHECK-NEXT: ret void -; -entry: - %cmp = icmp ne i32 %t, %s - br i1 %cmp, label %if.then, label %if.end6 - -if.then: - call void @bar1(i32 %s, i32 %t) - %cmp1 = icmp sle i32 %t, %s - br i1 %cmp1, label %if.then2, label %if.end6 - -if.then2: - call void @bar2(i32 %s, i32 %t) - %cmp3 = icmp sle i32 %s, %t - br i1 %cmp3, label %if.then4, label %if.end6 - -if.then4: - call void @bar3(i32 %s, i32 %t) - br label %if.end6 - -if.end6: - ret void -} - -declare void @bar1(i32, i32) -declare void @bar2(i32, i32) -declare void @bar3(i32, i32) - diff --git a/llvm/test/Transforms/SimplifyCFG/branch-fold-threshold.ll b/llvm/test/Transforms/SimplifyCFG/branch-fold-threshold.ll deleted file mode 100644 index 592873fad23..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-fold-threshold.ll +++ /dev/null @@ -1,83 +0,0 @@ -; RUN: opt %s -simplifycfg -S | FileCheck %s --check-prefix=NORMAL -; RUN: opt %s -simplifycfg -S -bonus-inst-threshold=2 | FileCheck %s --check-prefix=AGGRESSIVE -; RUN: opt %s -simplifycfg -S -bonus-inst-threshold=4 | FileCheck %s --check-prefix=WAYAGGRESSIVE -; RUN: opt %s -passes=simplify-cfg -S | FileCheck %s --check-prefix=NORMAL -; RUN: opt %s -passes='simplify-cfg<bonus-inst-threshold=2>' -S | FileCheck %s --check-prefix=AGGRESSIVE -; RUN: opt %s -passes='simplify-cfg<bonus-inst-threshold=4>' -S | FileCheck %s --check-prefix=WAYAGGRESSIVE - -define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) { -; NORMAL-LABEL: @foo( -; AGGRESSIVE-LABEL: @foo( -entry: - %cmp = icmp sgt i32 %d, 3 - br i1 %cmp, label %cond.end, label %lor.lhs.false -; NORMAL: br i1 -; AGGRESSIVE: br i1 - -lor.lhs.false: - %mul = shl i32 %c, 1 - %add = add nsw i32 %mul, %a - %cmp1 = icmp slt i32 %add, %b - br i1 %cmp1, label %cond.false, label %cond.end -; NORMAL: br i1 -; AGGRESSIVE-NOT: br i1 - -cond.false: - %0 = load i32, i32* %input, align 4 - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.false ], [ 0, %lor.lhs.false ], [ 0, %entry ] - ret i32 %cond -} - -declare void @distinct_a(); -declare void @distinct_b(); - -;; Like foo, but have to duplicate into multiple predecessors -define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) { -; NORMAL-LABEL: @bar( -; AGGRESSIVE-LABEL: @bar( -entry: - %cmp_split = icmp slt i32 %d, %b - %cmp = icmp sgt i32 %d, 3 - br i1 %cmp_split, label %pred_a, label %pred_b -pred_a: -; NORMAL-LABEL: pred_a: -; AGGRESSIVE-LABEL: pred_a: -; WAYAGGRESSIVE-LABEL: pred_a: -; NORMAL: br i1 -; AGGRESSIVE: br i1 -; WAYAGGRESSIVE: br i1 - call void @distinct_a(); - br i1 %cmp, label %cond.end, label %lor.lhs.false -pred_b: -; NORMAL-LABEL: pred_b: -; AGGRESSIVE-LABEL: pred_b: -; WAYAGGRESSIVE-LABEL: pred_b: -; NORMAL: br i1 -; AGGRESSIVE: br i1 -; WAYAGGRESSIVE: br i1 - call void @distinct_b(); - br i1 %cmp, label %cond.end, label %lor.lhs.false - -lor.lhs.false: - %mul = shl i32 %c, 1 - %add = add nsw i32 %mul, %a - %cmp1 = icmp slt i32 %add, %b - br i1 %cmp1, label %cond.false, label %cond.end -; NORMAL-LABEL: lor.lhs.false: -; AGGRESIVE-LABEL: lor.lhs.false: -; WAYAGGRESIVE-LABEL: lor.lhs.false: -; NORMAL: br i1 -; AGGRESSIVE: br i1 -; WAYAGGRESSIVE-NOT: br i1 - -cond.false: - %0 = load i32, i32* %input, align 4 - br label %cond.end - -cond.end: - %cond = phi i32 [ %0, %cond.false ], [ 0, %lor.lhs.false ],[ 0, %pred_a ],[ 0, %pred_b ] - ret i32 %cond -} diff --git a/llvm/test/Transforms/SimplifyCFG/branch-fold.ll b/llvm/test/Transforms/SimplifyCFG/branch-fold.ll deleted file mode 100644 index 7097dea424e..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-fold.ll +++ /dev/null @@ -1,70 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define void @test(i32* %P, i32* %Q, i1 %A, i1 %B) { -; CHECK: test -; CHECK: br i1 -; CHECK-NOT: br i1 -; CHECK: ret -; CHECK: ret - -entry: - br i1 %A, label %a, label %b -a: - br i1 %B, label %b, label %c -b: - store i32 123, i32* %P - ret void -c: - ret void -} - -; rdar://10554090 -define zeroext i1 @test2(i64 %i0, i64 %i1) nounwind uwtable readonly ssp { -entry: -; CHECK: test2 -; CHECK: br i1 - %and.i.i = and i64 %i0, 281474976710655 - %and.i11.i = and i64 %i1, 281474976710655 - %or.cond = icmp eq i64 %and.i.i, %and.i11.i - br i1 %or.cond, label %c, label %a - -a: -; CHECK: br - %shr.i4.i = lshr i64 %i0, 48 - %and.i5.i = and i64 %shr.i4.i, 32767 - %shr.i.i = lshr i64 %i1, 48 - %and.i2.i = and i64 %shr.i.i, 32767 - %cmp9.i = icmp ult i64 %and.i5.i, %and.i2.i - br i1 %cmp9.i, label %c, label %b - -b: -; CHECK-NOT: br - %shr.i13.i9 = lshr i64 %i1, 48 - %and.i14.i10 = and i64 %shr.i13.i9, 32767 - %shr.i.i11 = lshr i64 %i0, 48 - %and.i11.i12 = and i64 %shr.i.i11, 32767 - %phitmp = icmp uge i64 %and.i14.i10, %and.i11.i12 - br label %c - -c: - %o2 = phi i1 [ false, %a ], [ %phitmp, %b ], [ false, %entry ] - ret i1 %o2 -} - -; PR13180 -define void @pr13180(i8 %p) { -entry: - %tobool = icmp eq i8 %p, 0 - br i1 %tobool, label %cond.false, label %cond.true - -cond.true: ; preds = %entry - br label %cond.end - -cond.false: ; preds = %entry - %phitmp = icmp eq i8 %p, 0 - br label %cond.end - -cond.end: ; preds = %cond.false, %cond.true - %cond = phi i1 [ undef, %cond.true ], [ %phitmp, %cond.false ] - unreachable -} diff --git a/llvm/test/Transforms/SimplifyCFG/branch-phi-thread.ll b/llvm/test/Transforms/SimplifyCFG/branch-phi-thread.ll deleted file mode 100644 index 4c1b7e68e25..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/branch-phi-thread.ll +++ /dev/null @@ -1,66 +0,0 @@ -; RUN: opt < %s -simplifycfg -adce -S | \ -; RUN: not grep "call void @f1" -; END. - -declare void @f1() - -declare void @f2() - -declare void @f3() - -declare void @f4() - -define i32 @test1(i32 %X, i1 %D) { -E: - %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] - br i1 %C, label %T, label %F -T: ; preds = %A, %E - br i1 %C, label %B, label %A -A: ; preds = %T - call void @f1( ) - br i1 %D, label %T, label %F -B: ; preds = %T - call void @f2( ) - ret i32 345 -F: ; preds = %A, %E - call void @f3( ) - ret i32 123 -} - -define i32 @test2(i32 %X, i1 %D) { -E: - %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] - br i1 %C, label %T, label %F -T: ; preds = %A, %E - %P = phi i1 [ true, %E ], [ %C, %A ] ; <i1> [#uses=1] - br i1 %P, label %B, label %A -A: ; preds = %T - call void @f1( ) - br i1 %D, label %T, label %F -B: ; preds = %T - call void @f2( ) - ret i32 345 -F: ; preds = %A, %E - call void @f3( ) - ret i32 123 -} - -define i32 @test3(i32 %X, i1 %D, i32* %AP, i32* %BP) { -E: - %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] - br i1 %C, label %T, label %F -T: ; preds = %A, %E - call void @f3( ) - %XX = load i32, i32* %AP ; <i32> [#uses=1] - store i32 %XX, i32* %BP - br i1 %C, label %B, label %A -A: ; preds = %T - call void @f1( ) - br i1 %D, label %T, label %F -B: ; preds = %T - call void @f2( ) - ret i32 345 -F: ; preds = %A, %E - call void @f3( ) - ret i32 123 -} diff --git a/llvm/test/Transforms/SimplifyCFG/bug-25299.ll b/llvm/test/Transforms/SimplifyCFG/bug-25299.ll deleted file mode 100644 index 706afbe540c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/bug-25299.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -;; Test case for bug 25299, contributed by David Majnemer. - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -define void @f(i1 %B) personality i1 undef { -entry: -;CHECK: entry -;CHECK-NEXT: call void @g() - invoke void @g() - to label %continue unwind label %unwind - -unwind: ; preds = %entry - %tmp101 = landingpad { i8*, i32 } - cleanup - br i1 %B, label %resume, label %then - -then: ; preds = %cleanup1 - br label %resume - -resume: ; preds = %cleanup2, %then, %cleanup1, %unwind - %tmp104 = phi { i8*, i32 } [ %tmp101, %then ], [ %tmp106, %cleanup2 ], [ %tmp101, %unwind ] -;CHECK-NOT: resume { i8*, i32 } %tmp104 - resume { i8*, i32 } %tmp104 - -continue: ; preds = %entry, %continue -;CHECK: continue: ; preds = %entry, %continue -;CHECK-NEXT: call void @g() - invoke void @g() - to label %continue unwind label %cleanup2 - -cleanup2: ; preds = %continue - %tmp106 = landingpad { i8*, i32 } - cleanup - br label %resume -} - -declare void @g()
\ No newline at end of file diff --git a/llvm/test/Transforms/SimplifyCFG/clamp.ll b/llvm/test/Transforms/SimplifyCFG/clamp.ll deleted file mode 100644 index d21894a1269..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/clamp.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define float @clamp(float %a, float %b, float %c) { -; CHECK-LABEL: @clamp -; CHECK: %cmp = fcmp ogt float %a, %c -; CHECK: %cmp1 = fcmp olt float %a, %b -; CHECK: %cond = select i1 %cmp1, float %b, float %a -; CHECK: %cond5 = select i1 %cmp, float %c, float %cond -; CHECK: ret float %cond5 -entry: - %cmp = fcmp ogt float %a, %c - br i1 %cmp, label %cond.end4, label %cond.false - -cond.false: ; preds = %entry - %cmp1 = fcmp olt float %a, %b - %cond = select i1 %cmp1, float %b, float %a - br label %cond.end4 - -cond.end4: ; preds = %entry, %cond.false - %cond5 = phi float [ %cond, %cond.false ], [ %c, %entry ] - ret float %cond5 -} diff --git a/llvm/test/Transforms/SimplifyCFG/combine-parallel-mem-md.ll b/llvm/test/Transforms/SimplifyCFG/combine-parallel-mem-md.ll deleted file mode 100644 index d3ff927825f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/combine-parallel-mem-md.ll +++ /dev/null @@ -1,56 +0,0 @@ -; RUN: opt -simplifycfg -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" - -; Function Attrs: norecurse nounwind uwtable -define void @Test(i32* nocapture %res, i32* nocapture readnone %c, i32* nocapture readonly %d, i32* nocapture readonly %p) #0 { -entry: - br label %for.body - -; CHECK-LABEL: @Test -; CHECK: load i32, i32* {{.*}}, align 4, !llvm.access.group !0 -; CHECK: load i32, i32* {{.*}}, align 4, !llvm.access.group !0 -; CHECK: store i32 {{.*}}, align 4, !llvm.access.group !0 -; CHECK-NOT: load -; CHECK-NOT: store - -for.body: ; preds = %cond.end, %entry - %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %cond.end ] - %arrayidx = getelementptr inbounds i32, i32* %p, i64 %indvars.iv - %0 = load i32, i32* %arrayidx, align 4, !llvm.access.group !0 - %cmp1 = icmp eq i32 %0, 0 - br i1 %cmp1, label %cond.true, label %cond.false - -cond.false: ; preds = %for.body - %arrayidx3 = getelementptr inbounds i32, i32* %res, i64 %indvars.iv - %v = load i32, i32* %arrayidx3, align 4, !llvm.access.group !0 - %arrayidx7 = getelementptr inbounds i32, i32* %d, i64 %indvars.iv - %1 = load i32, i32* %arrayidx7, align 4, !llvm.access.group !0 - %add = add nsw i32 %1, %v - br label %cond.end - -cond.true: ; preds = %for.body - %arrayidx4 = getelementptr inbounds i32, i32* %res, i64 %indvars.iv - %w = load i32, i32* %arrayidx4, align 4, !llvm.access.group !0 - %arrayidx8 = getelementptr inbounds i32, i32* %d, i64 %indvars.iv - %2 = load i32, i32* %arrayidx8, align 4, !llvm.access.group !0 - %add2 = add nsw i32 %2, %w - br label %cond.end - -cond.end: ; preds = %for.body, %cond.false - %cond = phi i32 [ %add, %cond.false ], [ %add2, %cond.true ] - %arrayidx9 = getelementptr inbounds i32, i32* %res, i64 %indvars.iv - store i32 %cond, i32* %arrayidx9, align 4, !llvm.access.group !0 - %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 - %exitcond = icmp eq i64 %indvars.iv.next, 16 - br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0 - -for.end: ; preds = %cond.end - ret void -} - -attributes #0 = { norecurse nounwind uwtable } - -!0 = distinct !{!0, !1, !{!"llvm.loop.parallel_accesses", !10}} -!1 = !{!"llvm.loop.vectorize.enable", i1 true} -!10 = distinct !{} diff --git a/llvm/test/Transforms/SimplifyCFG/common-dest-folding.ll b/llvm/test/Transforms/SimplifyCFG/common-dest-folding.ll deleted file mode 100644 index e3e27c706d1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/common-dest-folding.ll +++ /dev/null @@ -1,57 +0,0 @@ -; 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/llvm/test/Transforms/SimplifyCFG/critedge-assume.ll b/llvm/test/Transforms/SimplifyCFG/critedge-assume.ll deleted file mode 100644 index 42ce5a561cc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/critedge-assume.ll +++ /dev/null @@ -1,83 +0,0 @@ -; RUN: opt -o %t %s -instcombine -simplifycfg -thinlto-bc -verify-assumption-cache -; RUN: llvm-dis -o - %t | FileCheck %s - -; Test that the simplifycfg pass correctly updates the assumption cache -; when it clones the llvm.assume call as part of creating a critical -; edge. To do that, we set up a pass pipeline such that (1) an assumption -; cache is created for foo before simplifycfg updates it, and (2) foo's -; assumption cache is verified after simplifycfg has run. To satisfy 1, we -; run the instcombine pass first in our pipeline. To satisfy 2, we use the -; ThinLTOBitcodeWriter pass to write bitcode (that pass uses the assumption -; cache). That ensures that the pass manager does not call releaseMemory() -; on the AssumptionCacheTracker before the end of the pipeline, which would -; wipe out the bad assumption cache before it is verified. - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -%class.F = type { i8 } -%class.B = type { i8 } -%class.A = type { %class.C } -%class.C = type { i32 (...)** } - -define void @foo(%class.F* %this, %class.B* %out) { -entry: - %call = tail call i32 @_ZNK1F5beginEv(%class.F* %this) - %call2 = tail call i32 @_ZNK1F3endEv(%class.F* %this) - %cmp.i22 = icmp eq i32 %call, %call2 - br i1 %cmp.i22, label %while.end, label %while.body.preheader - -while.body.preheader: - br label %while.body - -while.body: - %frame_node.sroa.0.023 = phi i32 [ %inc.i, %_ZN10unique_ptrD2Ev.exit ], [ %call, %while.body.preheader ] - %call8 = tail call i8* @_Znwm(i64 8) - %inc.i = add nsw i32 %frame_node.sroa.0.023, 1 - %cmp = icmp eq i32 %inc.i, %call2 - br i1 %cmp, label %_ZN10unique_ptrD2Ev.exit, label %if.then - -if.then: - tail call void @_ZN1B6appendEv(%class.B* %out) - br label %_ZN10unique_ptrD2Ev.exit - -_ZN10unique_ptrD2Ev.exit: - %x1 = bitcast i8* %call8 to void (%class.A*)*** - %vtable.i.i = load void (%class.A*)**, void (%class.A*)*** %x1, align 8 - %x2 = bitcast void (%class.A*)** %vtable.i.i to i8* - %x3 = tail call i1 @llvm.type.test(i8* %x2, metadata !"foo") - ; CHECK: call void @llvm.assume - ; CHECK: call void @llvm.assume - tail call void @llvm.assume(i1 %x3) #5 - br i1 %cmp, label %while.end.loopexit, label %while.body - -while.end.loopexit: - br label %while.end - -while.end: - ret void -} - -declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) - -declare i32 @_ZNK1F5beginEv(%class.F*) - -declare i32 @_ZNK1F3endEv(%class.F*) - -declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) - -declare noalias nonnull i8* @_Znwm(i64) - -declare void @_ZN1B6appendEv(%class.B*) - -declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) - -declare i1 @llvm.type.test(i8*, metadata) - -declare void @llvm.assume(i1) - -!llvm.module.flags = !{!0} -!llvm.ident = !{!1} - -!0 = !{i32 1, !"PIC Level", i32 2} -!1 = !{!"clang version 5.0.0 "} diff --git a/llvm/test/Transforms/SimplifyCFG/dbginfo.ll b/llvm/test/Transforms/SimplifyCFG/dbginfo.ll deleted file mode 100644 index 12aec91c6c5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/dbginfo.ll +++ /dev/null @@ -1,71 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep "br label" - - %llvm.dbg.anchor.type = type { i32, i32 } - %llvm.dbg.basictype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, i32 } - %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8* } - %llvm.dbg.composite.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, { }*, { }* } - %llvm.dbg.derivedtype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, { }* } - %llvm.dbg.global_variable.type = type { i32, { }*, { }*, i8*, i8*, i8*, { }*, i32, { }*, i1, i1, { }* } - %llvm.dbg.subprogram.type = type { i32, { }*, { }*, i8*, i8*, i8*, { }*, i32, { }*, i1, i1 } - %llvm.dbg.subrange.type = type { i32, i64, i64 } - %struct.Group = type { %struct.Scene, %struct.Sphere, %"struct.std::list<Scene*,std::allocator<Scene*> >" } - %struct.Ray = type { %struct.Vec, %struct.Vec } - %struct.Scene = type { i32 (...)** } - %struct.Sphere = type { %struct.Scene, %struct.Vec, double } - %struct.Vec = type { double, double, double } - %struct.__class_type_info_pseudo = type { %struct.__type_info_pseudo } - %struct.__false_type = type <{ i8 }> - %"struct.__gnu_cxx::new_allocator<Scene*>" = type <{ i8 }> - %"struct.__gnu_cxx::new_allocator<std::_List_node<Scene*> >" = type <{ i8 }> - %struct.__si_class_type_info_pseudo = type { %struct.__type_info_pseudo, %"struct.std::type_info"* } - %struct.__type_info_pseudo = type { i8*, i8* } - %"struct.std::Hit" = type { double, %struct.Vec } - %"struct.std::_List_base<Scene*,std::allocator<Scene*> >" = type { %"struct.std::_List_base<Scene*,std::allocator<Scene*> >::_List_impl" } - %"struct.std::_List_base<Scene*,std::allocator<Scene*> >::_List_impl" = type { %"struct.std::_List_node_base" } - %"struct.std::_List_const_iterator<Scene*>" = type { %"struct.std::_List_node_base"* } - %"struct.std::_List_iterator<Scene*>" = type { %"struct.std::_List_node_base"* } - %"struct.std::_List_node<Scene*>" = type { %"struct.std::_List_node_base", %struct.Scene* } - %"struct.std::_List_node_base" = type { %"struct.std::_List_node_base"*, %"struct.std::_List_node_base"* } - %"struct.std::allocator<Scene*>" = type <{ i8 }> - %"struct.std::allocator<std::_List_node<Scene*> >" = type <{ i8 }> - %"struct.std::basic_ios<char,std::char_traits<char> >" = type { %"struct.std::ios_base", %"struct.std::basic_ostream<char,std::char_traits<char> >"*, i8, i8, %"struct.std::basic_streambuf<char,std::char_traits<char> >"*, %"struct.std::ctype<char>"*, %"struct.std::num_get<char,std::istreambuf_iterator<char, std::char_traits<char> > >"*, %"struct.std::num_get<char,std::istreambuf_iterator<char, std::char_traits<char> > >"* } - %"struct.std::basic_ostream<char,std::char_traits<char> >" = type { i32 (...)**, %"struct.std::basic_ios<char,std::char_traits<char> >" } - %"struct.std::basic_streambuf<char,std::char_traits<char> >" = type { i32 (...)**, i8*, i8*, i8*, i8*, i8*, i8*, %"struct.std::locale" } - %"struct.std::ctype<char>" = type { %"struct.std::locale::facet", i32*, i8, i32*, i32*, i32*, i8, [256 x i8], [256 x i8], i8 } - %"struct.std::ios_base" = type { i32 (...)**, i32, i32, i32, i32, i32, %"struct.std::ios_base::_Callback_list"*, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, %"struct.std::ios_base::_Words"*, %"struct.std::locale" } - %"struct.std::ios_base::Init" = type <{ i8 }> - %"struct.std::ios_base::_Callback_list" = type { %"struct.std::ios_base::_Callback_list"*, void (i32, %"struct.std::ios_base"*, i32)*, i32, i32 } - %"struct.std::ios_base::_Words" = type { i8*, i32 } - %"struct.std::list<Scene*,std::allocator<Scene*> >" = type { %"struct.std::_List_base<Scene*,std::allocator<Scene*> >" } - %"struct.std::locale" = type { %"struct.std::locale::_Impl"* } - %"struct.std::locale::_Impl" = type { i32, %"struct.std::locale::facet"**, i32, %"struct.std::locale::facet"**, i8** } - %"struct.std::locale::facet" = type { i32 (...)**, i32 } - %"struct.std::num_get<char,std::istreambuf_iterator<char, std::char_traits<char> > >" = type { %"struct.std::locale::facet" } - %"struct.std::num_put<char,std::ostreambuf_iterator<char, std::char_traits<char> > >" = type { %"struct.std::locale::facet" } - %"struct.std::numeric_limits<double>" = type <{ i8 }> - %"struct.std::type_info" = type { i32 (...)**, i8* } -@llvm.dbg.subprogram947 = external constant %llvm.dbg.subprogram.type ; <%llvm.dbg.subprogram.type*> [#uses=1] - -declare void @llvm.dbg.func.start({ }*) nounwind - -declare void @llvm.dbg.region.end({ }*) nounwind - -declare void @_ZN9__gnu_cxx13new_allocatorIP5SceneED2Ev(%struct.__false_type*) nounwind - -define void @_ZNSaIP5SceneED1Ev(%struct.__false_type* %this) nounwind { -entry: - %this_addr = alloca %struct.__false_type* ; <%struct.__false_type**> [#uses=2] - %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] - call void @llvm.dbg.func.start({ }* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram947 to { }*)) - store %struct.__false_type* %this, %struct.__false_type** %this_addr - %0 = load %struct.__false_type*, %struct.__false_type** %this_addr, align 4 ; <%struct.__false_type*> [#uses=1] - call void @_ZN9__gnu_cxx13new_allocatorIP5SceneED2Ev(%struct.__false_type* %0) nounwind - br label %bb - -bb: ; preds = %entry - br label %return - -return: ; preds = %bb - call void @llvm.dbg.region.end({ }* bitcast (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram947 to { }*)) - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll b/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll deleted file mode 100644 index 036a615e7ff..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll +++ /dev/null @@ -1,52 +0,0 @@ -; RUN: opt -S <%s -simplifycfg | FileCheck %s - -define void @test_br(i32 %x) { -entry: -; CHECK-LABEL: @test_br( -; CHECK-NEXT: entry: -; CHECK-NEXT: ret void - %cmp = icmp eq i32 %x, 10 - br i1 %cmp, label %if.then, label %if.then - -if.then: ; preds = %entry - br label %if.end - -if.end: ; preds = %if.else, %if.then - ret void -} - -define void @test_switch(i32 %x) nounwind { -entry: -; CHECK-LABEL: @test_switch( -; CHECK-NEXT: entry: -; CHECK-NEXT: ret void - %rem = srem i32 %x, 3 - switch i32 %rem, label %sw.bb [ - i32 1, label %sw.bb - i32 10, label %sw.bb - ] - -sw.bb: ; preds = %sw.default, %entry, %entry - br label %sw.epilog - -sw.epilog: ; preds = %sw.bb - ret void -} - -define void @test_indirectbr(i32 %x) { -entry: -; CHECK-LABEL: @test_indirectbr( -; CHECK-NEXT: entry: -; Ideally this should now check: -; CHK-NEXT: ret void -; But that doesn't happen yet. Instead: -; CHECK-NEXT: br label %L1 - - %label = bitcast i8* blockaddress(@test_indirectbr, %L1) to i8* - indirectbr i8* %label, [label %L1, label %L2] - -L1: ; preds = %entry - ret void -L2: ; preds = %entry - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll b/llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll deleted file mode 100644 index c5eb43642bf..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll +++ /dev/null @@ -1,38 +0,0 @@ -; RUN: opt %s -debugify -simplifycfg -S | FileCheck %s -; Tests Bug 37966 - -define void @bar(i32 %aa) { -; CHECK-LABEL: @bar( -; CHECK: if.end.1.critedge: -; CHECK: br label %if.end.1, !dbg ![[DBG:[0-9]+]] -entry: - %aa.addr = alloca i32, align 4 - %bb = alloca i32, align 4 - store i32 %aa, i32* %aa.addr, align 4 - store i32 0, i32* %bb, align 4 - %tobool = icmp ne i32 %aa, 0 - br i1 %tobool, label %if.then, label %if.end - -if.then: ; preds = %entry - call void @foo() - br label %if.end - -if.end: ; preds = %if.then, %entry - store i32 1, i32* %bb, align 4 - br i1 %tobool, label %if.then.1, label %if.end.1 ; "line 10" to -debugify - -if.then.1: ; preds = %if.end - call void @foo() - br label %if.end.1 - -if.end.1: ; preds = %if.then.1, %if.end - store i32 2, i32* %bb, align 4 - br label %for.end - -for.end: ; preds = %if.end.1 - ret void -} - -declare void @foo() - -; CHECK: ![[DBG]] = !DILocation(line: 10, diff --git a/llvm/test/Transforms/SimplifyCFG/div-rem-pairs.ll b/llvm/test/Transforms/SimplifyCFG/div-rem-pairs.ll deleted file mode 100644 index 4543d726930..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/div-rem-pairs.ll +++ /dev/null @@ -1,114 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -; We could hoist the div/rem in these tests because it's safe to do so. -; PR31028 - https://bugs.llvm.org/show_bug.cgi?id=31028 -; ...but since there's a separate pass for that, don't bother. - -define i32 @hoist_sdiv(i32 %a, i32 %b) { -; CHECK-LABEL: @hoist_sdiv( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[REM:%.*]] = srem i32 %a, %b -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[REM]], 42 -; CHECK-NEXT: br i1 [[CMP]], label %if, label %end -; CHECK: if: -; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 %a, %b -; CHECK-NEXT: br label %end -; CHECK: end: -; CHECK-NEXT: [[RET:%.*]] = phi i32 [ [[DIV]], %if ], [ 3, %entry ] -; CHECK-NEXT: ret i32 [[RET]] -; -entry: - %rem = srem i32 %a, %b - %cmp = icmp eq i32 %rem, 42 - br i1 %cmp, label %if, label %end - -if: - %div = sdiv i32 %a, %b - br label %end - -end: - %ret = phi i32 [ %div, %if ], [ 3, %entry ] - ret i32 %ret -} - -define i64 @hoist_udiv(i64 %a, i64 %b) { -; CHECK-LABEL: @hoist_udiv( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[REM:%.*]] = urem i64 %a, %b -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[REM]], 42 -; CHECK-NEXT: br i1 [[CMP]], label %if, label %end -; CHECK: if: -; CHECK-NEXT: [[DIV:%.*]] = udiv i64 %a, %b -; CHECK-NEXT: br label %end -; CHECK: end: -; CHECK-NEXT: [[RET:%.*]] = phi i64 [ [[DIV]], %if ], [ 3, %entry ] -; CHECK-NEXT: ret i64 [[RET]] -; -entry: - %rem = urem i64 %a, %b - %cmp = icmp eq i64 %rem, 42 - br i1 %cmp, label %if, label %end - -if: - %div = udiv i64 %a, %b - br label %end - -end: - %ret = phi i64 [ %div, %if ], [ 3, %entry ] - ret i64 %ret -} - -define i16 @hoist_srem(i16 %a, i16 %b) { -; CHECK-LABEL: @hoist_srem( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 %a, %b -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[DIV]], 42 -; CHECK-NEXT: br i1 [[CMP]], label %if, label %end -; CHECK: if: -; CHECK-NEXT: [[REM:%.*]] = srem i16 %a, %b -; CHECK-NEXT: br label %end -; CHECK: end: -; CHECK-NEXT: [[RET:%.*]] = phi i16 [ [[REM]], %if ], [ 3, %entry ] -; CHECK-NEXT: ret i16 [[RET]] -; -entry: - %div = sdiv i16 %a, %b - %cmp = icmp eq i16 %div, 42 - br i1 %cmp, label %if, label %end - -if: - %rem = srem i16 %a, %b - br label %end - -end: - %ret = phi i16 [ %rem, %if ], [ 3, %entry ] - ret i16 %ret -} - -define i8 @hoist_urem(i8 %a, i8 %b) { -; CHECK-LABEL: @hoist_urem( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[DIV:%.*]] = udiv i8 %a, %b -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[DIV]], 42 -; CHECK-NEXT: br i1 [[CMP]], label %if, label %end -; CHECK: if: -; CHECK-NEXT: [[REM:%.*]] = urem i8 %a, %b -; CHECK-NEXT: br label %end -; CHECK: end: -; CHECK-NEXT: [[RET:%.*]] = phi i8 [ [[REM]], %if ], [ 3, %entry ] -; CHECK-NEXT: ret i8 [[RET]] -; -entry: - %div = udiv i8 %a, %b - %cmp = icmp eq i8 %div, 42 - br i1 %cmp, label %if, label %end - -if: - %rem = urem i8 %a, %b - br label %end - -end: - %ret = phi i8 [ %rem, %if ], [ 3, %entry ] - ret i8 %ret -} - diff --git a/llvm/test/Transforms/SimplifyCFG/duplicate-landingpad.ll b/llvm/test/Transforms/SimplifyCFG/duplicate-landingpad.ll deleted file mode 100644 index 93c55f0064c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/duplicate-landingpad.ll +++ /dev/null @@ -1,110 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -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-S128" - -declare i32 @__gxx_personality_v0(...) -declare void @fn() - - -; CHECK-LABEL: @test1 -define void @test1() personality i32 (...)* @__gxx_personality_v0 { -entry: -; CHECK-LABEL: entry: -; CHECK: to label %invoke2 unwind label %lpad2 - invoke void @fn() - to label %invoke2 unwind label %lpad1 - -invoke2: -; CHECK-LABEL: invoke2: -; CHECK: to label %invoke.cont unwind label %lpad2 - invoke void @fn() - to label %invoke.cont unwind label %lpad2 - -invoke.cont: - ret void - -lpad1: - %exn = landingpad {i8*, i32} - cleanup - br label %shared_resume - -lpad2: -; CHECK-LABEL: lpad2: -; CHECK: landingpad { i8*, i32 } -; CHECK-NEXT: cleanup -; CHECK-NEXT: call void @fn() -; CHECK-NEXT: ret void - %exn2 = landingpad {i8*, i32} - cleanup - br label %shared_resume - -shared_resume: - call void @fn() - ret void -} - -; Don't trigger if blocks aren't the same/empty -define void @neg1() personality i32 (...)* @__gxx_personality_v0 { -; CHECK-LABEL: @neg1 -entry: -; CHECK-LABEL: entry: -; CHECK: to label %invoke2 unwind label %lpad1 - invoke void @fn() - to label %invoke2 unwind label %lpad1 - -invoke2: -; CHECK-LABEL: invoke2: -; CHECK: to label %invoke.cont unwind label %lpad2 - invoke void @fn() - to label %invoke.cont unwind label %lpad2 - -invoke.cont: - ret void - -lpad1: - %exn = landingpad {i8*, i32} - filter [0 x i8*] zeroinitializer - call void @fn() - br label %shared_resume - -lpad2: - %exn2 = landingpad {i8*, i32} - cleanup - br label %shared_resume - -shared_resume: - call void @fn() - ret void -} - -; Should not trigger when the landing pads are not the exact same -define void @neg2() personality i32 (...)* @__gxx_personality_v0 { -; CHECK-LABEL: @neg2 -entry: -; CHECK-LABEL: entry: -; CHECK: to label %invoke2 unwind label %lpad1 - invoke void @fn() - to label %invoke2 unwind label %lpad1 - -invoke2: -; CHECK-LABEL: invoke2: -; CHECK: to label %invoke.cont unwind label %lpad2 - invoke void @fn() - to label %invoke.cont unwind label %lpad2 - -invoke.cont: - ret void - -lpad1: - %exn = landingpad {i8*, i32} - filter [0 x i8*] zeroinitializer - br label %shared_resume - -lpad2: - %exn2 = landingpad {i8*, i32} - cleanup - br label %shared_resume - -shared_resume: - call void @fn() - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/duplicate-phis.ll b/llvm/test/Transforms/SimplifyCFG/duplicate-phis.ll deleted file mode 100644 index 4788406fc0f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/duplicate-phis.ll +++ /dev/null @@ -1,21 +0,0 @@ -; RUN: opt < %s -instcombine -simplifycfg -S | grep " = phi " | count 1 - -; instcombine should sort the PHI operands so that simplifycfg can see the -; duplicate and remove it. - -define i32 @foo(i1 %t) { -entry: - call void @bar() - br i1 %t, label %true, label %false -true: - call void @bar() - br label %false -false: - %a = phi i32 [ 2, %true ], [ 5, %entry ] - %b = phi i32 [ 5, %entry ], [ 2, %true ] - call void @bar() - %c = add i32 %a, %b - ret i32 %c -} - -declare void @bar() diff --git a/llvm/test/Transforms/SimplifyCFG/empty-catchpad.ll b/llvm/test/Transforms/SimplifyCFG/empty-catchpad.ll deleted file mode 100644 index 2926cd3f7dc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/empty-catchpad.ll +++ /dev/null @@ -1,115 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @f() -declare void @llvm.foo(i32) nounwind -declare void @ProcessCLRException() - -define void @test1() personality void ()* @ProcessCLRException { -entry: - invoke void @f() - to label %exit unwind label %exn.dispatch -exn.dispatch: - %cs = catchswitch within none [label %pad1, label %pad2] unwind to caller -pad1: - %cp1 = catchpad within %cs [i32 1] - call void @llvm.foo(i32 1) - catchret from %cp1 to label %exit -pad2: - %cp2 = catchpad within %cs [i32 2] - unreachable -exit: - ret void -} -; Remove unreachble catch2, leave catch1 as-is -; CHECK-LABEL: define void @test1() -; CHECK: %cs = catchswitch within none [label %pad1] unwind to caller -; CHECK-NOT: catchpad -; CHECK: %cp1 = catchpad within %cs [i32 1] -; CHECK-NOT: catchpad - -; Remove both catchpads and the catchswitch from exn.dispatch -; CHECK-LABEL: define void @test2() -define void @test2() personality void ()* @ProcessCLRException { -entry: - invoke void @f() - to label %via.cleanup unwind label %exn.dispatch - ; CHECK-NOT: invoke - ; CHECK: call void @f() -via.cleanup: - invoke void @f() - to label %via.catchswitch unwind label %cleanup.inner -cleanup.inner: - %cp.inner = cleanuppad within none [] - call void @llvm.foo(i32 0) - cleanupret from %cp.inner unwind label %exn.dispatch - ; CHECK: cleanupret from %cp.inner unwind to caller -via.catchswitch: - invoke void @f() - to label %exit unwind label %dispatch.inner -dispatch.inner: - %cs.inner = catchswitch within none [label %pad.inner] unwind label %exn.dispatch - ; CHECK: %cs.inner = catchswitch within none [label %pad.inner] unwind to caller -pad.inner: - %catch.inner = catchpad within %cs.inner [i32 0] - ; CHECK: %catch.inner = catchpad within %cs.inner - call void @llvm.foo(i32 1) - catchret from %catch.inner to label %exit -exn.dispatch: - %cs = catchswitch within none [label %pad1, label %pad2] unwind to caller - ; CHECK-NOT: catchswitch within - ; CHECK-NOT: catchpad -pad1: - catchpad within %cs [i32 1] - unreachable -pad2: - catchpad within %cs [i32 2] - unreachable -exit: - ret void -} - -; Same as @test2, but exn.dispatch catchswitch has an unwind dest that -; preds need to be reidrected to -; CHECK-LABEL: define void @test3() -define void @test3() personality void ()* @ProcessCLRException { -entry: - invoke void @f() - to label %via.cleanup unwind label %exn.dispatch - ; CHECK: invoke void @f() - ; CHECK-NEXT: to label %via.cleanup unwind label %cleanup -via.cleanup: - invoke void @f() - to label %via.catchswitch unwind label %cleanup.inner -cleanup.inner: - %cp.inner = cleanuppad within none [] - call void @llvm.foo(i32 0) - cleanupret from %cp.inner unwind label %exn.dispatch - ; CHECK: cleanupret from %cp.inner unwind label %cleanup -via.catchswitch: - invoke void @f() - to label %exit unwind label %dispatch.inner -dispatch.inner: - %cs.inner = catchswitch within none [label %pad.inner] unwind label %exn.dispatch - ; CHECK: %cs.inner = catchswitch within none [label %pad.inner] unwind label %cleanup -pad.inner: - %catch.inner = catchpad within %cs.inner [i32 0] - ; CHECK: %catch.inner = catchpad within %cs.inner - call void @llvm.foo(i32 1) - catchret from %catch.inner to label %exit -exn.dispatch: - %cs = catchswitch within none [label %pad1, label %pad2] unwind label %cleanup - ; CHECK-NOT: catchswitch within - ; CHECK-NOT: catchpad -pad1: - catchpad within %cs [i32 1] - unreachable -pad2: - catchpad within %cs [i32 2] - unreachable -cleanup: - %cp = cleanuppad within none [] - call void @llvm.foo(i32 0) - cleanupret from %cp unwind to caller -exit: - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll b/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll deleted file mode 100644 index f2e0114a2a3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll +++ /dev/null @@ -1,470 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; ModuleID = 'cppeh-simplify.cpp' -target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-pc-windows-msvc18.0.0" - - -; This case arises when two objects with empty destructors are cleaned up. -; -; void f1() { -; S a; -; S b; -; g(); -; } -; -; In this case, both cleanup pads can be eliminated and the invoke can be -; converted to a call. -; -; CHECK: define void @f1() -; CHECK: entry: -; CHECK: call void @g() -; CHECK: ret void -; CHECK-NOT: cleanuppad -; CHECK: } -; -define void @f1() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - invoke void @g() to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - ret void - -ehcleanup: ; preds = %entry - %0 = cleanuppad within none [] - cleanupret from %0 unwind label %ehcleanup.1 - -ehcleanup.1: ; preds = %ehcleanup - %1 = cleanuppad within none [] - cleanupret from %1 unwind to caller -} - - -; This case arises when an object with an empty destructor must be cleaned up -; outside of a try-block and an object with a non-empty destructor must be -; cleaned up within the try-block. -; -; void f2() { -; S a; -; try { -; S2 b; -; g(); -; } catch (...) {} -; } -; -; In this case, the outermost cleanup pad can be eliminated and the catch block -; should unwind to the caller (that is, exception handling continues with the -; parent frame of the caller). -; -; CHECK: define void @f2() -; CHECK: entry: -; CHECK: invoke void @g() -; CHECK: ehcleanup: -; CHECK: cleanuppad within none -; CHECK: call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %b) -; CHECK: cleanupret from %0 unwind label %catch.dispatch -; CHECK: catch.dispatch: -; CHECK: catchswitch within none [label %catch] unwind to caller -; CHECK: catch: -; CHECK: catchpad -; CHECK: catchret -; CHECK-NOT: cleanuppad -; CHECK: } -; -define void @f2() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - %b = alloca %struct.S2, align 1 - invoke void @g() to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - br label %try.cont - -ehcleanup: ; preds = %entry - %0 = cleanuppad within none [] - call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %b) - cleanupret from %0 unwind label %catch.dispatch - -catch.dispatch: ; preds = %ehcleanup - %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup.1 - -catch: ; preds = %catch.dispatch - %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - catchret from %1 to label %catchret.dest - -catchret.dest: ; preds = %catch - br label %try.cont - -try.cont: ; preds = %catchret.dest, %invoke.cont - ret void - -ehcleanup.1: - %2 = cleanuppad within none [] - cleanupret from %2 unwind to caller -} - - -; This case arises when an object with a non-empty destructor must be cleaned up -; outside of a try-block and an object with an empty destructor must be cleaned -; within the try-block. -; -; void f3() { -; S2 a; -; try { -; S b; -; g(); -; } catch (...) {} -; } -; -; In this case the inner cleanup pad should be eliminated and the invoke of g() -; should unwind directly to the catchpad. -; -; CHECK-LABEL: define void @f3() -; CHECK: entry: -; CHECK: invoke void @g() -; CHECK: to label %try.cont unwind label %catch.dispatch -; CHECK: catch.dispatch: -; CHECK-NEXT: catchswitch within none [label %catch] unwind label %ehcleanup.1 -; CHECK: catch: -; CHECK: catchpad within %cs1 [i8* null, i32 64, i8* null] -; CHECK: catchret -; CHECK: ehcleanup.1: -; CHECK: cleanuppad -; CHECK: call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) -; CHECK: cleanupret from %cp3 unwind to caller -; CHECK: } -; -define void @f3() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - %a = alloca %struct.S2, align 1 - invoke void @g() to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - br label %try.cont - -ehcleanup: ; preds = %entry - %0 = cleanuppad within none [] - cleanupret from %0 unwind label %catch.dispatch - -catch.dispatch: ; preds = %ehcleanup - %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup.1 - -catch: ; preds = %catch.dispatch - %cp2 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - catchret from %cp2 to label %catchret.dest - -catchret.dest: ; preds = %catch - br label %try.cont - -try.cont: ; preds = %catchret.dest, %invoke.cont - ret void - -ehcleanup.1: - %cp3 = cleanuppad within none [] - call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) - cleanupret from %cp3 unwind to caller -} - - -; This case arises when an object with an empty destructor may require cleanup -; from either inside or outside of a try-block. -; -; void f4() { -; S a; -; g(); -; try { -; g(); -; } catch (...) {} -; } -; -; In this case, the cleanuppad should be eliminated, the invoke outside of the -; catch block should be converted to a call (that is, that is, exception -; handling continues with the parent frame of the caller).) -; -; CHECK-LABEL: define void @f4() -; CHECK: entry: -; CHECK: call void @g -; Note: The cleanuppad simplification will insert an unconditional branch here -; but it will be eliminated, placing the following invoke in the entry BB. -; CHECK: invoke void @g() -; CHECK: to label %try.cont unwind label %catch.dispatch -; CHECK: catch.dispatch: -; CHECK: catchswitch within none [label %catch] unwind to caller -; CHECK: catch: -; CHECK: catchpad -; CHECK: catchret -; CHECK-NOT: cleanuppad -; CHECK: } -; -define void @f4() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - invoke void @g() - to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - invoke void @g() - to label %try.cont unwind label %catch.dispatch - -catch.dispatch: ; preds = %invoke.cont - %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup - -catch: ; preds = %catch.dispatch - %0 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - catchret from %0 to label %try.cont - -try.cont: ; preds = %catch, %invoke.cont - ret void - -ehcleanup: - %cp2 = cleanuppad within none [] - cleanupret from %cp2 unwind to caller -} - -; This case tests simplification of an otherwise empty cleanup pad that contains -; a PHI node. -; -; int f6() { -; int state = 1; -; try { -; S a; -; g(); -; state = 2; -; g(); -; } catch (...) { -; return state; -; } -; return 0; -; } -; -; In this case, the cleanup pad should be eliminated and the PHI node in the -; cleanup pad should be sunk into the catch dispatch block. -; -; CHECK-LABEL: define i32 @f6() -; CHECK: entry: -; CHECK: invoke void @g() -; CHECK: invoke.cont: -; CHECK: invoke void @g() -; CHECK-NOT: ehcleanup: -; CHECK-NOT: cleanuppad -; CHECK: catch.dispatch: -; CHECK: %state.0 = phi i32 [ 2, %invoke.cont ], [ 1, %entry ] -; CHECK: } -define i32 @f6() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - invoke void @g() - to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - invoke void @g() - to label %return unwind label %ehcleanup - -ehcleanup: ; preds = %invoke.cont, %entry - %state.0 = phi i32 [ 2, %invoke.cont ], [ 1, %entry ] - %0 = cleanuppad within none [] - cleanupret from %0 unwind label %catch.dispatch - -catch.dispatch: ; preds = %ehcleanup - %cs1 = catchswitch within none [label %catch] unwind to caller - -catch: ; preds = %catch.dispatch - %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - catchret from %1 to label %return - -return: ; preds = %invoke.cont, %catch - %retval.0 = phi i32 [ %state.0, %catch ], [ 0, %invoke.cont ] - ret i32 %retval.0 -} - -; This case tests another variation of simplification of an otherwise empty -; cleanup pad that contains a PHI node. -; -; int f7() { -; int state = 1; -; try { -; g(); -; state = 2; -; S a; -; g(); -; state = 3; -; g(); -; } catch (...) { -; return state; -; } -; return 0; -; } -; -; In this case, the cleanup pad should be eliminated and the PHI node in the -; cleanup pad should be merged with the PHI node in the catch dispatch block. -; -; CHECK-LABEL: define i32 @f7() -; CHECK: entry: -; CHECK: invoke void @g() -; CHECK: invoke.cont: -; CHECK: invoke void @g() -; CHECK: invoke.cont.1: -; CHECK: invoke void @g() -; CHECK-NOT: ehcleanup: -; CHECK-NOT: cleanuppad -; CHECK: catch.dispatch: -; CHECK: %state.1 = phi i32 [ 1, %entry ], [ 3, %invoke.cont.1 ], [ 2, %invoke.cont ] -; CHECK: } -define i32 @f7() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - invoke void @g() - to label %invoke.cont unwind label %catch.dispatch - -invoke.cont: ; preds = %entry - invoke void @g() - to label %invoke.cont.1 unwind label %ehcleanup - -invoke.cont.1: ; preds = %invoke.cont - invoke void @g() - to label %return unwind label %ehcleanup - -ehcleanup: ; preds = %invoke.cont.1, %invoke.cont - %state.0 = phi i32 [ 3, %invoke.cont.1 ], [ 2, %invoke.cont ] - %0 = cleanuppad within none [] - cleanupret from %0 unwind label %catch.dispatch - -catch.dispatch: ; preds = %ehcleanup, %entry - %state.1 = phi i32 [ %state.0, %ehcleanup ], [ 1, %entry ] - %cs1 = catchswitch within none [label %catch] unwind to caller - -catch: ; preds = %catch.dispatch - %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - catchret from %1 to label %return - -return: ; preds = %invoke.cont.1, %catch - %retval.0 = phi i32 [ %state.1, %catch ], [ 0, %invoke.cont.1 ] - ret i32 %retval.0 -} - -; This case tests a scenario where an empty cleanup pad is not dominated by all -; of the predecessors of its successor, but the successor references a PHI node -; in the empty cleanup pad. -; -; Conceptually, the case being modeled is something like this: -; -; int f8() { -; int x = 1; -; try { -; S a; -; g(); -; x = 2; -; retry: -; g(); -; return -; } catch (...) { -; use_x(x); -; } -; goto retry; -; } -; -; While that C++ syntax isn't legal, the IR below is. -; -; In this case, the PHI node that is sunk from ehcleanup to catch.dispatch -; should have an incoming value entry for path from 'foo' that references the -; PHI node itself. -; -; CHECK-LABEL: define void @f8() -; CHECK: entry: -; CHECK: invoke void @g() -; CHECK: invoke.cont: -; CHECK: invoke void @g() -; CHECK-NOT: ehcleanup: -; CHECK-NOT: cleanuppad -; CHECK: catch.dispatch: -; CHECK: %x = phi i32 [ 2, %invoke.cont ], [ 1, %entry ], [ %x, %catch.cont ] -; CHECK: } -define void @f8() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { -entry: - invoke void @g() - to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - invoke void @g() - to label %return unwind label %ehcleanup - -ehcleanup: ; preds = %invoke.cont, %entry - %x = phi i32 [ 2, %invoke.cont ], [ 1, %entry ] - %0 = cleanuppad within none [] - cleanupret from %0 unwind label %catch.dispatch - -catch.dispatch: ; preds = %ehcleanup, %catch.cont - %cs1 = catchswitch within none [label %catch] unwind to caller - -catch: ; preds = %catch.dispatch - %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] - call void @use_x(i32 %x) - catchret from %1 to label %catch.cont - -catch.cont: ; preds = %catch - invoke void @g() - to label %return unwind label %catch.dispatch - -return: ; preds = %invoke.cont, %catch.cont - ret void -} -; CHECK-LABEL: define i32 @f9() -; CHECK: entry: -; CHECK: invoke void @"\01??1S2@@QEAA@XZ"( -; CHECK-NOT: cleanuppad -; CHECK: catch.dispatch: -; CHECK: } -define i32 @f9() personality i32 (...)* @__CxxFrameHandler3 { -entry: - %s = alloca i8, align 1 - call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %s) - %bc = bitcast i8* %s to %struct.S2* - invoke void @"\01??1S2@@QEAA@XZ"(%struct.S2* %bc) - to label %try.cont unwind label %ehcleanup - -ehcleanup: - %cleanup.pad = cleanuppad within none [] - call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %s) - cleanupret from %cleanup.pad unwind label %catch.dispatch - -catch.dispatch: - %catch.switch = catchswitch within none [label %catch] unwind to caller - -catch: - %catch.pad = catchpad within %catch.switch [i8* null, i32 0, i8* null] - catchret from %catch.pad to label %try.cont - -try.cont: - ret i32 0 -} - -; CHECK-LABEL: define void @f10( -define void @f10(i32 %V) personality i32 (...)* @__CxxFrameHandler3 { -entry: - invoke void @g() - to label %unreachable unwind label %cleanup -; CHECK: call void @g() -; CHECK-NEXT: unreachable - -unreachable: - unreachable - -cleanup: - %cp = cleanuppad within none [] - switch i32 %V, label %cleanupret1 [ - i32 0, label %cleanupret2 - ] - -cleanupret1: - cleanupret from %cp unwind to caller - -cleanupret2: - cleanupret from %cp unwind to caller -} - -%struct.S = type { i8 } -%struct.S2 = type { i8 } -declare void @"\01??1S2@@QEAA@XZ"(%struct.S2*) -declare void @g() -declare void @use_x(i32 %x) - -declare i32 @__CxxFrameHandler3(...) - -declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) -declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) diff --git a/llvm/test/Transforms/SimplifyCFG/extract-cost.ll b/llvm/test/Transforms/SimplifyCFG/extract-cost.ll deleted file mode 100644 index 9c867256e78..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/extract-cost.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) #1 - -define i32 @f(i32 %a, i32 %b) #0 { -entry: - %uadd = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b) - %cmp = extractvalue { i32, i1 } %uadd, 1 - br i1 %cmp, label %return, label %if.end - -if.end: ; preds = %entry - %0 = extractvalue { i32, i1 } %uadd, 0 - br label %return - -return: ; preds = %entry, %if.end - %retval.0 = phi i32 [ %0, %if.end ], [ 0, %entry ] - ret i32 %retval.0 - -; CHECK-LABEL: @f( -; CHECK-NOT: phi -; CHECK: select -} diff --git a/llvm/test/Transforms/SimplifyCFG/fold-branch-debuginvariant.ll b/llvm/test/Transforms/SimplifyCFG/fold-branch-debuginvariant.ll deleted file mode 100644 index 7b26b6f95de..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/fold-branch-debuginvariant.ll +++ /dev/null @@ -1,49 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; RUN: opt < %s -strip-debug -simplifycfg -S | FileCheck %s - -; Verify that the and.2 instruction is eliminated even in the presence of a -; preceding debug intrinsic. - -; CHECK-LABEL: bb1: -; CHECK: and i1 false, false -; CHECK-LABEL: bb2: -; CHECK-NOT: and i1 false, false - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -; Function Attrs: norecurse nounwind -define void @foo() local_unnamed_addr #0 !dbg !4 { -bb1: - %and.1 = and i1 false, false - %cmp = icmp eq i16 0, 0 - br i1 %cmp, label %bb2, label %bb3 - -bb2: ; preds = %bb1 - call void @llvm.dbg.value(metadata i16 0, metadata !8, metadata !DIExpression()), !dbg !9 - %and.2 = and i1 false, false - br label %bb3 - -bb3: ; preds = %bb2, %bb1 - ret void -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.value(metadata, metadata, metadata) #1 - -attributes #0 = { norecurse nounwind } -attributes #1 = { nounwind readnone speculatable } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3} - -!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "Foo", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2) -!1 = !DIFile(filename: "foo.c", directory: "/") -!2 = !{} -!3 = !{i32 2, !"Debug Info Version", i32 3} -!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 10, type: !5, isLocal: false, isDefinition: true, scopeLine: 10, isOptimized: false, unit: !0, retainedNodes: !2) -!5 = !DISubroutineType(types: !6) -!6 = !{null, !7} -!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!8 = !DILocalVariable(name: "p_1", arg: 1, scope: !4, line: 4, type: !7) -!9 = distinct !DILocation(line: 11, column: 3, scope: !4) diff --git a/llvm/test/Transforms/SimplifyCFG/fold-debug-info.ll b/llvm/test/Transforms/SimplifyCFG/fold-debug-info.ll deleted file mode 100644 index bc5a9374537..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/fold-debug-info.ll +++ /dev/null @@ -1,102 +0,0 @@ -;; Check that we don't crash. PR37300. -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt %s -S -simplifycfg | FileCheck %s - -define void @patatino() { -; CHECK-LABEL: @patatino( -; CHECK-NEXT: bb: -; CHECK-NEXT: ret void -; -bb: - %tmp = icmp eq i32 7, 0 - br label %bb3 -bb3: ; preds = %bb2, %bb - br label %bb36 -bb5: ; preds = %bb4 - %tmp7 = icmp ne i32 7, 0 - %tmp8 = and i1 true, %tmp7 - br i1 %tmp8, label %bb16, label %bb14 -bb9: ; preds = %bb33, %bb10 - br label %bb18 -bb10: ; preds = %bb19, %bb13 - %tmp11 = add nsw i32 2, 1 - %tmp12 = icmp eq i32 %tmp11, 0 - br i1 %tmp12, label %bb17, label %bb9 -bb13: ; preds = %bb18, %bb13 - br label %bb10 -bb14: ; preds = %bb17, %bb6, %bb5 - br label %bb35 -bb16: ; preds = %bb6 - br label %bb31 -bb17: ; preds = %bb32, %bb10 - br label %bb14 -bb18: ; preds = %bb9 - br label %bb13 -bb21: ; preds = %bb31, %bb23 - %tmp22 = phi i32 [ 0, %bb23 ], [ 0, %bb31 ] - br label %bb27 -bb23: ; preds = %bb29, %bb28, %bb26 - %tmp24 = add nsw i32 %tmp22, 1 - %tmp25 = icmp eq i32 %tmp24, 0 - br i1 %tmp25, label %bb32, label %bb21 -bb27: ; preds = %bb21 - br label %bb30 -bb28: ; preds = %bb30 - br label %bb23 -bb30: ; preds = %bb30, %bb27 - br label %bb28 -bb31: ; preds = %bb16 - br label %bb21 -bb32: ; preds = %bb23 - br label %bb17 -bb35: ; preds = %bb14 - br label %bb3 -bb36: ; preds = %bb3, %bb3 - br label %bb37 -bb37: ; preds = %bb36 - %tmp39 = and i1 %tmp, true - br i1 %tmp39, label %bb40, label %bb67 -bb40: ; preds = %bb38 - br i1 %tmp, label %bb42, label %bb41 -bb41: ; preds = %bb40 - br label %bb43 -bb42: ; preds = %bb40 - br label %bb66 -bb43: ; preds = %bb41 - br label %bb44 -bb44: ; preds = %bb61, %bb43 - %tmp45 = phi i32 [ 0, %bb61 ], [ 0, %bb43 ] - %tmp46 = phi i32 [ %tmp62, %bb61 ], [ 0, %bb43 ] - br label %bb51 -bb48: ; preds = %bb47 - br label %bb49 -bb49: ; preds = %bb48 - %tmp50 = phi i32 [ 0, %bb48 ] - br label %bb61 -bb51: ; preds = %bb44 - br label %bb52 -bb52: ; preds = %bb55, %bb51 - %tmp53 = phi i32 [ %tmp46, %bb51 ], [ 0, %bb55 ] - br label %bb55 -bb54: ; preds = %bb52 - br label %bb55 -bb55: ; preds = %bb54, %bb52 - %tmp56 = phi i32 [ 0, %bb54 ], [ 0, %bb52 ] - %tmp57 = shl i32 %tmp56, 16 - br i1 false, label %bb52, label %bb58 -bb58: ; preds = %bb55 - %tmp59 = phi i32 [ 0, %bb55 ] - %tmp60 = phi i32 [ %tmp53, %bb55 ] - br label %bb61 -bb61: ; preds = %bb58, %bb49 - %tmp62 = phi i32 [ %tmp59, %bb58 ], [ %tmp50, %bb49 ] - %tmp63 = add nsw i32 %tmp45, 1 - %tmp64 = icmp eq i32 %tmp63, 0 - br i1 %tmp64, label %bb65, label %bb44 -bb65: ; preds = %bb61 - br label %bb66 -bb66: ; preds = %bb65, %bb42 - br label %bb67 -bb67: ; preds = %bb66, %bb38 - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/gepcost.ll b/llvm/test/Transforms/SimplifyCFG/gepcost.ll deleted file mode 100644 index 10751f747e3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/gepcost.ll +++ /dev/null @@ -1,28 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -S -simplifycfg | FileCheck %s - -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -target triple = "thumbv7m-none--eabi" - -@glob = external unnamed_addr constant [16 x i8] - -define void @f() { -; CHECK-LABEL: @f( -; CHECK-NEXT: entr: -; CHECK-NEXT: br i1 undef, label [[NEXT:%.*]], label [[EXIT:%.*]] -; CHECK: next: -; CHECK-NEXT: [[PAT:%.*]] = getelementptr [16 x i8], [16 x i8]* @glob -; CHECK-NEXT: br label [[EXIT]] -; CHECK: exit: -; CHECK-NEXT: ret void -; -entr: - br i1 undef, label %next, label %exit - -next: - %pat = getelementptr [16 x i8], [16 x i8]* @glob - br label %exit - -exit: - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/guards.ll b/llvm/test/Transforms/SimplifyCFG/guards.ll deleted file mode 100644 index 1f2d7535fd1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/guards.ll +++ /dev/null @@ -1,100 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -declare void @llvm.experimental.guard(i1, ...) - -define i32 @f_0(i1 %c) { -; CHECK-LABEL: @f_0( -; CHECK-NEXT: entry: -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] -; CHECK-NEXT: unreachable -; -entry: - call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] - ret i32 10 -} - -define i32 @f_1(i1 %c) { -; Demonstrate that we (intentionally) do not simplify a guard on undef -; CHECK-LABEL: @f_1( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]] -; CHECK: true: -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 undef) [ "deopt"() ] -; CHECK-NEXT: ret i32 10 -; CHECK: false: -; CHECK-NEXT: ret i32 20 -; - -entry: - br i1 %c, label %true, label %false - -true: - call void(i1, ...) @llvm.experimental.guard(i1 undef) [ "deopt"() ] - ret i32 10 - -false: - ret i32 20 -} - -define i32 @f_2(i1 %c, i32* %buf) { -; CHECK-LABEL: @f_2( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[GUARD_BLOCK:%.*]], label [[MERGE_BLOCK:%.*]] -; CHECK: guard_block: -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] -; CHECK-NEXT: unreachable -; CHECK: merge_block: -; CHECK-NEXT: ret i32 50 -; -entry: - br i1 %c, label %guard_block, label %merge_block - -guard_block: - call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] - %val = load i32, i32* %buf - br label %merge_block - -merge_block: - %to.return = phi i32 [ %val, %guard_block ], [ 50, %entry ] - ret i32 %to.return - -} - -define i32 @f_3(i1* %c, i32* %buf) { -; CHECK-LABEL: @f_3( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C0:%.*]] = load volatile i1, i1* [[C:%.*]] -; CHECK-NEXT: br i1 [[C0]], label [[GUARD_BLOCK:%.*]], label [[MERGE_BLOCK:%.*]] -; CHECK: guard_block: -; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] -; CHECK-NEXT: unreachable -; CHECK: merge_block: -; CHECK-NEXT: [[C1:%.*]] = load volatile i1, i1* [[C]] -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[C1]], i32 50, i32 100 -; CHECK-NEXT: ret i32 [[DOT]] -; -entry: - %c0 = load volatile i1, i1* %c - br i1 %c0, label %guard_block, label %merge_block - -guard_block: - call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] - %val = load i32, i32* %buf - %c2 = load volatile i1, i1* %c - br i1 %c2, label %left, label %right - -merge_block: - %c1 = load volatile i1, i1* %c - br i1 %c1, label %left, label %right - -left: - %val.left = phi i32 [ %val, %guard_block ], [ 50, %merge_block ] - ret i32 %val.left - -right: - %val.right = phi i32 [ %val, %guard_block ], [ 100, %merge_block ] - ret i32 %val.right - - -} diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-common-code.ll b/llvm/test/Transforms/SimplifyCFG/hoist-common-code.ll deleted file mode 100644 index c1ca605cc20..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/hoist-common-code.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep br - -declare void @bar(i32) - -define void @test(i1 %P, i32* %Q) { - br i1 %P, label %T, label %F -T: ; preds = %0 - store i32 1, i32* %Q - %A = load i32, i32* %Q ; <i32> [#uses=1] - call void @bar( i32 %A ) - ret void -F: ; preds = %0 - store i32 1, i32* %Q - %B = load i32, i32* %Q ; <i32> [#uses=1] - call void @bar( i32 %B ) - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-inlined.ll b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-inlined.ll deleted file mode 100644 index ec818416418..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-inlined.ll +++ /dev/null @@ -1,51 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s -; Verify that we don't crash due an invalid !dbg location on the hoisted llvm.dbg.value - -define i64 @caller(i64* %ptr, i64 %flag) !dbg !10 { -init: - %v9 = icmp eq i64 %flag, 0 - br i1 %v9, label %a, label %b - -; CHECK: %vala = load i64, i64* %ptr -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %vala, metadata [[MD:![0-9]*]] -; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %vala, metadata [[MD]] -; CHECK-NEXT: %valbmasked = and i64 %vala, 1 - -a: ; preds = %init - %vala = load i64, i64* %ptr, align 8 - call void @llvm.dbg.value(metadata i64 %vala, metadata !8, metadata !DIExpression()), !dbg !12 - br label %test.exit - -b: ; preds = %init - %valb = load i64, i64* %ptr, align 8 - call void @llvm.dbg.value(metadata i64 %valb, metadata !8, metadata !DIExpression()), !dbg !13 - %valbmasked = and i64 %valb, 1 - br label %test.exit - -test.exit: ; preds = %a, %b - %retv = phi i64 [ %vala, %a ], [ %valbmasked, %b ] - ret i64 %retv -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.value(metadata, metadata, metadata) #0 - -attributes #0 = { nounwind readnone speculatable } - -!llvm.module.flags = !{!0} -!llvm.dbg.cu = !{!1} - -!0 = !{i32 2, !"Debug Info Version", i32 3} -!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !3) -!2 = !DIFile(filename: "optbug", directory: "") -!3 = !{} -!4 = distinct !DISubprogram(name: "callee", scope: !2, file: !2, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, unit: !1, retainedNodes: !7) -!5 = !DISubroutineType(types: !6) -!6 = !{null} -!7 = !{!8} -!8 = !DILocalVariable(name: "var", scope: !4, file: !2, type: !9) -!9 = !DIBasicType(name: "var_t", size: 64, encoding: DW_ATE_unsigned) -!10 = distinct !DISubprogram(name: "caller", scope: !2, file: !2, line: 5, type: !5, isLocal: false, isDefinition: true, scopeLine: 5, isOptimized: false, unit: !1, retainedNodes: !3) -!11 = distinct !DILocation(line: 6, scope: !10) -!12 = !DILocation(line: 2, scope: !4, inlinedAt: !11) -!13 = !DILocation(line: 3, scope: !4, inlinedAt: !11) diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll deleted file mode 100644 index 205e384a690..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll +++ /dev/null @@ -1,55 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -define i32 @foo(i32 %i) nounwind ssp !dbg !0 { - call void @llvm.dbg.value(metadata i32 %i, metadata !6, metadata !DIExpression()), !dbg !7 - call void @llvm.dbg.value(metadata i32 0, metadata !9, metadata !DIExpression()), !dbg !11 - %1 = icmp ne i32 %i, 0, !dbg !12 -;CHECK: call i32 (...) @bar() -;CHECK-NEXT: llvm.dbg.value - br i1 %1, label %2, label %4, !dbg !12 - -; <label>:2 ; preds = %0 - %3 = call i32 (...) @bar(), !dbg !13 - call void @llvm.dbg.value(metadata i32 %3, metadata !9, metadata !DIExpression()), !dbg !13 - br label %6, !dbg !15 - -; <label>:4 ; preds = %0 - %5 = call i32 (...) @bar(), !dbg !16 - call void @llvm.dbg.value(metadata i32 %5, metadata !9, metadata !DIExpression()), !dbg !16 - br label %6, !dbg !18 - -; <label>:6 ; preds = %4, %2 - %k.0 = phi i32 [ %3, %2 ], [ %5, %4 ] - ret i32 %k.0, !dbg !19 -} - -declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone - -declare i32 @bar(...) - -declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone - -!llvm.module.flags = !{!21} -!llvm.dbg.cu = !{!2} - -!0 = distinct !DISubprogram(name: "foo", line: 2, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !2, file: !20, scope: !1, type: !3) -!1 = !DIFile(filename: "b.c", directory: "/private/tmp") -!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang", isOptimized: true, emissionKind: FullDebug, file: !20) -!3 = !DISubroutineType(types: !4) -!4 = !{!5} -!5 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) -!6 = !DILocalVariable(name: "i", line: 2, arg: 1, scope: !0, file: !1, type: !5) -!7 = !DILocation(line: 2, column: 13, scope: !0) -!9 = !DILocalVariable(name: "k", line: 3, scope: !10, file: !1, type: !5) -!10 = distinct !DILexicalBlock(line: 2, column: 16, file: !20, scope: !0) -!11 = !DILocation(line: 3, column: 12, scope: !10) -!12 = !DILocation(line: 4, column: 3, scope: !10) -!13 = !DILocation(line: 5, column: 5, scope: !14) -!14 = distinct !DILexicalBlock(line: 4, column: 10, file: !20, scope: !10) -!15 = !DILocation(line: 6, column: 3, scope: !14) -!16 = !DILocation(line: 7, column: 5, scope: !17) -!17 = distinct !DILexicalBlock(line: 6, column: 10, file: !20, scope: !10) -!18 = !DILocation(line: 8, column: 3, scope: !17) -!19 = !DILocation(line: 9, column: 3, scope: !10) -!20 = !DIFile(filename: "b.c", directory: "/private/tmp") -!21 = !{i32 1, !"Debug Info Version", i32 3} diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-with-range.ll b/llvm/test/Transforms/SimplifyCFG/hoist-with-range.ll deleted file mode 100644 index 0a2b28267ef..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/hoist-with-range.ll +++ /dev/null @@ -1,20 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define void @foo(i1 %c, i8* %p) { -; CHECK: if: -; CHECK-NEXT: load i8, i8* %p, !range !0 -; CHECK: !0 = !{i8 0, i8 1, i8 3, i8 5} -if: - br i1 %c, label %then, label %else -then: - %t = load i8, i8* %p, !range !0 - br label %out -else: - %e = load i8, i8* %p, !range !1 - br label %out -out: - ret void -} - -!0 = !{ i8 0, i8 1 } -!1 = !{ i8 3, i8 5 } diff --git a/llvm/test/Transforms/SimplifyCFG/implied-and-or.ll b/llvm/test/Transforms/SimplifyCFG/implied-and-or.ll deleted file mode 100644 index dd885c94bdc..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/implied-and-or.ll +++ /dev/null @@ -1,250 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -S -simplifycfg | FileCheck %s - -declare void @foo() -declare void @bar() - -define void @test_and1(i32 %a, i32 %b) { -; CHECK-LABEL: @test_and1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] -; CHECK-NEXT: br i1 [[AND]], label [[TAKEN:%.*]], label [[END:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %cmp1 = icmp eq i32 %a, 0 - %cmp2 = icmp eq i32 %b, 0 - %and = and i1 %cmp1, %cmp2 - br i1 %and, label %taken, label %end - -taken: - call void @bar() - %cmp3 = icmp eq i32 %a, 0 ;; <-- implied true - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - -; We can't infer anything if the result of the 'and' is false - -define void @test_and2(i32 %a, i32 %b) { -; CHECK-LABEL: @test_and2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] -; CHECK-NEXT: br i1 [[AND]], label [[END:%.*]], label [[TAKEN:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[A]], 0 -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[END]] -; CHECK: if.then: -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %cmp1 = icmp eq i32 %a, 0 - %cmp2 = icmp eq i32 %b, 0 - %and = and i1 %cmp1, %cmp2 - br i1 %and, label %end, label %taken - -taken: - call void @bar() - %cmp3 = icmp eq i32 %a, 0 - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - -define void @test_or1(i32 %a, i32 %b) { -; CHECK-LABEL: @test_or1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] -; CHECK-NEXT: br i1 [[OR]], label [[END:%.*]], label [[TAKEN:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %cmp1 = icmp eq i32 %a, 0 - %cmp2 = icmp eq i32 %b, 0 - %or = or i1 %cmp1, %cmp2 - br i1 %or, label %end, label %taken - -taken: - call void @bar() - %cmp3 = icmp ne i32 %a, 0 ;; <-- implied true - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - -; We can't infer anything if the result of the 'or' is true - -define void @test_or2(i32 %a, i32 %b) { -; CHECK-LABEL: @test_or2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] -; CHECK-NEXT: br i1 [[OR]], label [[TAKEN:%.*]], label [[END:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[A]], 0 -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[END]] -; CHECK: if.then: -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %cmp1 = icmp eq i32 %a, 0 - %cmp2 = icmp eq i32 %b, 0 - %or = or i1 %cmp1, %cmp2 - br i1 %or, label %taken, label %end - -taken: - call void @bar() - %cmp3 = icmp eq i32 %a, 0 - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - -; We can recurse a tree of 'and' or 'or's. - -define void @test_and_recurse1(i32 %a, i32 %b, i32 %c) { -; CHECK-LABEL: @test_and_recurse1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMPA:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMPB:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[CMPC:%.*]] = icmp eq i32 [[C:%.*]], 0 -; CHECK-NEXT: [[AND1:%.*]] = and i1 [[CMPA]], [[CMPB]] -; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMPC]] -; CHECK-NEXT: br i1 [[AND2]], label [[TAKEN:%.*]], label [[END:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %cmpa = icmp eq i32 %a, 0 - %cmpb = icmp eq i32 %b, 0 - %cmpc = icmp eq i32 %c, 0 - %and1 = and i1 %cmpa, %cmpb - %and2 = and i1 %and1, %cmpc - br i1 %and2, label %taken, label %end - -taken: - call void @bar() - %cmp3 = icmp eq i32 %a, 0 - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - -; Check to make sure we don't recurse too deep. - -define void @test_and_recurse2(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, -; CHECK-LABEL: @test_and_recurse2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMPA:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[CMPB:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[CMPC:%.*]] = icmp eq i32 [[C:%.*]], 0 -; CHECK-NEXT: [[CMPD:%.*]] = icmp eq i32 [[D:%.*]], 0 -; CHECK-NEXT: [[CMPE:%.*]] = icmp eq i32 [[E:%.*]], 0 -; CHECK-NEXT: [[CMPF:%.*]] = icmp eq i32 [[F:%.*]], 0 -; CHECK-NEXT: [[CMPG:%.*]] = icmp eq i32 [[G:%.*]], 0 -; CHECK-NEXT: [[CMPH:%.*]] = icmp eq i32 [[H:%.*]], 0 -; CHECK-NEXT: [[AND1:%.*]] = and i1 [[CMPA]], [[CMPB]] -; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMPC]] -; CHECK-NEXT: [[AND3:%.*]] = and i1 [[AND2]], [[CMPD]] -; CHECK-NEXT: [[AND4:%.*]] = and i1 [[AND3]], [[CMPE]] -; CHECK-NEXT: [[AND5:%.*]] = and i1 [[AND4]], [[CMPF]] -; CHECK-NEXT: [[AND6:%.*]] = and i1 [[AND5]], [[CMPG]] -; CHECK-NEXT: [[AND7:%.*]] = and i1 [[AND6]], [[CMPH]] -; CHECK-NEXT: br i1 [[AND7]], label [[TAKEN:%.*]], label [[END:%.*]] -; CHECK: taken: -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[A]], 0 -; CHECK-NEXT: br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[END]] -; CHECK: if.then: -; CHECK-NEXT: call void @foo() -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; - i32 %g, i32 %h) { -entry: - %cmpa = icmp eq i32 %a, 0 - %cmpb = icmp eq i32 %b, 0 - %cmpc = icmp eq i32 %c, 0 - %cmpd = icmp eq i32 %d, 0 - %cmpe = icmp eq i32 %e, 0 - %cmpf = icmp eq i32 %f, 0 - %cmpg = icmp eq i32 %g, 0 - %cmph = icmp eq i32 %h, 0 - %and1 = and i1 %cmpa, %cmpb - %and2 = and i1 %and1, %cmpc - %and3 = and i1 %and2, %cmpd - %and4 = and i1 %and3, %cmpe - %and5 = and i1 %and4, %cmpf - %and6 = and i1 %and5, %cmpg - %and7 = and i1 %and6, %cmph - br i1 %and7, label %taken, label %end - -taken: - call void @bar() - %cmp3 = icmp eq i32 %a, 0 ; <-- can be implied true - br i1 %cmp3, label %if.then, label %end - -if.then: - call void @foo() - br label %end - -end: - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-false-dest.ll b/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-false-dest.ll deleted file mode 100644 index 1d29813ecfa..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-false-dest.ll +++ /dev/null @@ -1,339 +0,0 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s - -declare void @is(i1) - -; If A == B is false then A == B is implied false. -; CHECK-LABEL: @test_eq_eq -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_eq(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp eq i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A == B is false then A != B is implied true. -; CHECK-LABEL: @test_eq_ne -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_ne(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ne i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A != B is false then A != B is implied false. -; CHECK-LABEL: @test_ne_ne -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ne(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ne i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A != B is false then A >u B is implied false. -; CHECK-LABEL: @test_ne_ugt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ugt(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A != B is false then A >=u B is implied true. -; CHECK-LABEL: @test_ne_uge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ne_uge(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A != B is false then A <u B is implied false. -; CHECK-LABEL: @test_ne_ult -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ult(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A != B is false then A <=u B is implied true. -; CHECK-LABEL: @test_ne_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ne_ule(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A >u B is false then A >u B is implied false. -; CHECK-LABEL: @test_ugt_ugt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ugt_ugt(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A >u B is false then A <=u B is implied true. -; CHECK-LABEL: @test_ugt_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ugt_ule(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A >=u B is false then A >=u B is implied false. -; CHECK-LABEL: @test_uge_uge -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_uge_uge(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A >=u B is false then A <u B is implied true. -; CHECK-LABEL: @test_uge_ult -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_uge_ult(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A >=u B is false then A <=u B is implied true. -; CHECK-LABEL: @test_uge_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_uge_ule(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A <u B is false then A <u B is implied false. -; CHECK-LABEL: @test_ult_ult -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ult_ult(i32 %a, i32 %b) { - %cmp1 = icmp ult i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; If A <=u B is false then A <=u B is implied false. -; CHECK-LABEL: @test_ule_ule -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ule_ule(i32 %a, i32 %b) { - %cmp1 = icmp ule i32 %a, %b - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-imm.ll b/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-imm.ll deleted file mode 100644 index 60ef8136598..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching-imm.ll +++ /dev/null @@ -1,123 +0,0 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s - -; cmp1 implies cmp2 is false -; CHECK-LABEL: @test1 -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test1(i32 %a) { - %cmp1 = icmp eq i32 %a, 0 - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp eq i32 %a, 1 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; cmp1 implies cmp2 is false -; CHECK-LABEL: @test2 -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test2(i32 %a) { - %cmp1 = icmp ugt i32 %a, 5 - br i1 %cmp1, label %untaken, label %taken - -taken: - %cmp2 = icmp ugt i32 %a, 6 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; cmp1 implies cmp2 is false -; CHECK-LABEL: @test3 -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test3(i32 %a) { - %cmp1 = icmp ugt i32 %a, 1 - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp eq i32 %a, 0 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; cmp1 implies cmp2 is true -; CHECK-LABEL: @test4 -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test4(i32 %a) { - %cmp1 = icmp sgt i32 %a, 1 - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, 0 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; cmp1 implies cmp2 is true -; CHECK-LABEL: @test5 -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test5(i32 %a) { - %cmp1 = icmp sgt i32 %a, 5 - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sgt i32 %a, -1 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -declare void @is(i1) diff --git a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll b/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll deleted file mode 100644 index 33fc016bd38..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/implied-cond-matching.ll +++ /dev/null @@ -1,1029 +0,0 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s - -declare void @dead() -declare void @alive() -declare void @is(i1) - -; Test same condition with swapped operands. -; void test_swapped_ops(unsigned a, unsigned b) { -; if (a > b) { -; if (b > a) <- always false -; dead(); -; alive(); -; } -; } -; -; CHECK-LABEL: @test_swapped_ops -; CHECK-NOT: call void @dead() -; CHECK: call void @alive() -; CHECK: ret -define void @test_swapped_ops(i32 %a, i32 %b) { -entry: - %cmp = icmp ugt i32 %a, %b - br i1 %cmp, label %if.then, label %if.end3 - -if.then: - %cmp1 = icmp ugt i32 %b, %a - br i1 %cmp1, label %if.then2, label %if.end - -if.then2: - call void @dead() - br label %if.end - -if.end: - call void @alive() - br label %if.end3 - -if.end3: - ret void -} - -; void test_swapped_pred(unsigned a, unsigned b) { -; if (a > b) { -; alive(); -; if (b < a) <- always true; remove branch -; alive(); -; } -; } -; -; CHECK-LABEL: @test_swapped_pred -; CHECK: call void @alive() -; CHECK-NEXT: call void @alive() -; CHECK: ret -define void @test_swapped_pred(i32 %a, i32 %b) { -entry: - %cmp = icmp ugt i32 %a, %b - br i1 %cmp, label %if.then, label %if.end3 - -if.then: - call void @alive() - %cmp1 = icmp ult i32 %b, %a - br i1 %cmp1, label %if.then2, label %if.end3 - -if.then2: - call void @alive() - br label %if.end3 - -if.end3: - ret void -} - -; A == B implies A == B is true. -; CHECK-LABEL: @test_eq_eq -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_eq(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp eq i32 %a, %b - br i1 %cmp2, label %eq_eq_istrue, label %eq_eq_isfalse - -eq_eq_istrue: - call void @is(i1 true) - ret void - -eq_eq_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A != B is false. -; CHECK-LABEL: @test_eq_ne -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_ne(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ne i32 %a, %b - br i1 %cmp2, label %eq_ne_istrue, label %eq_ne_isfalse - -eq_ne_istrue: - call void @is(i1 true) - ret void - -eq_ne_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A >u B is false. -; CHECK-LABEL: @test_eq_ugt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_ugt(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %eq_ugt_istrue, label %eq_ugt_isfalse - -eq_ugt_istrue: - call void @is(i1 true) - ret void - -eq_ugt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A >=u B is true. -; CHECK-LABEL: @test_eq_uge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_uge(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %eq_uge_istrue, label %eq_uge_isfalse - -eq_uge_istrue: - call void @is(i1 true) - ret void - -eq_uge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A <u B is false. -; CHECK-LABEL: @test_eq_ult -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_ult(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %eq_ult_istrue, label %eq_ult_isfalse - -eq_ult_istrue: - call void @is(i1 true) - ret void - -eq_ult_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A <=u B is true. -; CHECK-LABEL: @test_eq_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_ule(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %eq_ule_istrue, label %eq_ule_isfalse - -eq_ule_istrue: - call void @is(i1 true) - ret void - -eq_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A >s B is false. -; CHECK-LABEL: @test_eq_sgt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_sgt(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sgt i32 %a, %b - br i1 %cmp2, label %eq_sgt_istrue, label %eq_sgt_isfalse - -eq_sgt_istrue: - call void @is(i1 true) - ret void - -eq_sgt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A >=s B is true. -; CHECK-LABEL: @test_eq_sge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_sge(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sge i32 %a, %b - br i1 %cmp2, label %eq_sge_istrue, label %eq_sge_isfalse - -eq_sge_istrue: - call void @is(i1 true) - ret void - -eq_sge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A <s B is false. -; CHECK-LABEL: @test_eq_slt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_eq_slt(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp slt i32 %a, %b - br i1 %cmp2, label %eq_slt_istrue, label %eq_slt_isfalse - -eq_slt_istrue: - call void @is(i1 true) - ret void - -eq_slt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A == B implies A <=s B is true. -; CHECK-LABEL: @test_eq_sle -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_eq_sle(i32 %a, i32 %b) { - %cmp1 = icmp eq i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %eq_sle_istrue, label %eq_sle_isfalse - -eq_sle_istrue: - call void @is(i1 true) - ret void - -eq_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A != B is true. -; CHECK-LABEL: @test_ne_ne -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ne_ne(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ne i32 %a, %b - br i1 %cmp2, label %ne_ne_istrue, label %ne_ne_isfalse - -ne_ne_istrue: - call void @is(i1 true) - ret void - -ne_ne_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A >u B is unknown to be true or false. -; CHECK-LABEL: @test_ne_ugt -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ugt(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %ne_ugt_istrue, label %ne_ugt_isfalse - -ne_ugt_istrue: - call void @is(i1 true) - ret void - -ne_ugt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A >=u B is unknown to be true or false. -; CHECK-LABEL: @test_ne_uge -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_uge(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %ne_uge_istrue, label %ne_uge_isfalse - -ne_uge_istrue: - call void @is(i1 true) - ret void - -ne_uge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A <u B is unknown to be true or false. -; CHECK-LABEL: @test_ne_ult -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ult(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %ne_ult_istrue, label %ne_ult_isfalse - -ne_ult_istrue: - call void @is(i1 true) - ret void - -ne_ult_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A <=u B is unknown to be true or false. -; CHECK-LABEL: @test_ne_ule -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_ule(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %ne_ule_istrue, label %ne_ule_isfalse - -ne_ule_istrue: - call void @is(i1 true) - ret void - -ne_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A >s B is unknown to be true or false. -; CHECK-LABEL: @test_ne_sgt -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_sgt(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sgt i32 %a, %b - br i1 %cmp2, label %ne_sgt_istrue, label %ne_sgt_isfalse - -ne_sgt_istrue: - call void @is(i1 true) - ret void - -ne_sgt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A >=s B is unknown to be true or false. -; CHECK-LABEL: @test_ne_sge -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_sge(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sge i32 %a, %b - br i1 %cmp2, label %ne_sge_istrue, label %ne_sge_isfalse - -ne_sge_istrue: - call void @is(i1 true) - ret void - -ne_sge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A <s B is unknown to be true or false. -; CHECK-LABEL: @test_ne_slt -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_slt(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp slt i32 %a, %b - br i1 %cmp2, label %ne_slt_istrue, label %ne_slt_isfalse - -ne_slt_istrue: - call void @is(i1 true) - ret void - -ne_slt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A != B implies A <=s B is unknown to be true or false. -; CHECK-LABEL: @test_ne_sle -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ne_sle(i32 %a, i32 %b) { - %cmp1 = icmp ne i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %ne_sle_istrue, label %ne_sle_isfalse - -ne_sle_istrue: - call void @is(i1 true) - ret void - -ne_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >u B implies A >u B is true. -; CHECK-LABEL: @test_ugt_ugt -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ugt_ugt(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ugt i32 %a, %b - br i1 %cmp2, label %ugt_ugt_istrue, label %ugt_ugt_isfalse - -ugt_ugt_istrue: - call void @is(i1 true) - ret void - -ugt_ugt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >u B implies A >=u B is true. -; CHECK-LABEL: @test_ugt_uge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ugt_uge(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %ugt_uge_istrue, label %ugt_uge_isfalse - -ugt_uge_istrue: - call void @is(i1 true) - ret void - -ugt_uge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >u B implies A <u B is false. -; CHECK-LABEL: @test_ugt_ult -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ugt_ult(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %ugt_ult_istrue, label %ugt_ult_isfalse - -ugt_ult_istrue: - call void @is(i1 true) - ret void - -ugt_ult_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >u B implies A <=u B is false. -; CHECK-LABEL: @test_ugt_ule -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_ugt_ule(i32 %a, i32 %b) { - %cmp1 = icmp ugt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %ugt_ule_istrue, label %ugt_ule_isfalse - -ugt_ule_istrue: - call void @is(i1 true) - ret void - -ugt_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=u B implies A >=u B is true. -; CHECK-LABEL: @test_uge_uge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_uge_uge(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp uge i32 %a, %b - br i1 %cmp2, label %uge_uge_istrue, label %uge_uge_isfalse - -uge_uge_istrue: - call void @is(i1 true) - ret void - -uge_uge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=u B implies A <u B is false. -; CHECK-LABEL: @test_uge_ult -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_uge_ult(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %uge_ult_istrue, label %uge_ult_isfalse - -uge_ult_istrue: - call void @is(i1 true) - ret void - -uge_ult_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=u B implies A <=u B is unknown to be true or false. -; CHECK-LABEL: @test_uge_ule -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_uge_ule(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %uge_ule_istrue, label %uge_ule_isfalse - -uge_ule_istrue: - call void @is(i1 true) - ret void - -uge_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <u B implies A <u B is true. -; CHECK-LABEL: @test_ult_ult -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ult_ult(i32 %a, i32 %b) { - %cmp1 = icmp ult i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, %b - br i1 %cmp2, label %ult_ult_istrue, label %ult_ult_isfalse - -ult_ult_istrue: - call void @is(i1 true) - ret void - -ult_ult_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <u B implies A <=u B is true. -; CHECK-LABEL: @test_ult_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ult_ule(i32 %a, i32 %b) { - %cmp1 = icmp ult i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %ult_ule_istrue, label %ult_ule_isfalse - -ult_ule_istrue: - call void @is(i1 true) - ret void - -ult_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <=u B implies A <=u B is true. -; CHECK-LABEL: @test_ule_ule -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_ule_ule(i32 %a, i32 %b) { - %cmp1 = icmp ule i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ule i32 %a, %b - br i1 %cmp2, label %ule_ule_istrue, label %ule_ule_isfalse - -ule_ule_istrue: - call void @is(i1 true) - ret void - -ule_ule_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >s B implies A >s B is true. -; CHECK-LABEL: @test_sgt_sgt -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_sgt_sgt(i32 %a, i32 %b) { - %cmp1 = icmp sgt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sgt i32 %a, %b - br i1 %cmp2, label %sgt_sgt_istrue, label %sgt_sgt_isfalse - -sgt_sgt_istrue: - call void @is(i1 true) - ret void - -sgt_sgt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >s B implies A >=s B is true. -; CHECK-LABEL: @test_sgt_sge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_sgt_sge(i32 %a, i32 %b) { - %cmp1 = icmp sgt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sge i32 %a, %b - br i1 %cmp2, label %sgt_sge_istrue, label %sgt_sge_isfalse - -sgt_sge_istrue: - call void @is(i1 true) - ret void - -sgt_sge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >s B implies A <s B is false. -; CHECK-LABEL: @test_sgt_slt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_sgt_slt(i32 %a, i32 %b) { - %cmp1 = icmp sgt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp slt i32 %a, %b - br i1 %cmp2, label %sgt_slt_istrue, label %sgt_slt_isfalse - -sgt_slt_istrue: - call void @is(i1 true) - ret void - -sgt_slt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >s B implies A <=s B is false. -; CHECK-LABEL: @test_sgt_sle -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_sgt_sle(i32 %a, i32 %b) { - %cmp1 = icmp sgt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %sgt_sle_istrue, label %sgt_sle_isfalse - -sgt_sle_istrue: - call void @is(i1 true) - ret void - -sgt_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=s B implies A >=s B is true. -; CHECK-LABEL: @test_sge_sge -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_sge_sge(i32 %a, i32 %b) { - %cmp1 = icmp sge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sge i32 %a, %b - br i1 %cmp2, label %sge_sge_istrue, label %sge_sge_isfalse - -sge_sge_istrue: - call void @is(i1 true) - ret void - -sge_sge_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=s B implies A <s B is false. -; CHECK-LABEL: @test_sge_slt -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_sge_slt(i32 %a, i32 %b) { - %cmp1 = icmp sge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp slt i32 %a, %b - br i1 %cmp2, label %sge_slt_istrue, label %sge_slt_isfalse - -sge_slt_istrue: - call void @is(i1 true) - ret void - -sge_slt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=s B implies A <=s B is unknown to be true or false. -; CHECK-LABEL: @test_sge_sle -; CHECK: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_sge_sle(i32 %a, i32 %b) { - %cmp1 = icmp sge i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %sge_sle_istrue, label %sge_sle_isfalse - -sge_sle_istrue: - call void @is(i1 true) - ret void - -sge_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <s B implies A <s B is true. -; CHECK-LABEL: @test_slt_slt -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_slt_slt(i32 %a, i32 %b) { - %cmp1 = icmp slt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp slt i32 %a, %b - br i1 %cmp2, label %slt_slt_istrue, label %slt_slt_isfalse - -slt_slt_istrue: - call void @is(i1 true) - ret void - -slt_slt_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <s B implies A <=s B is true. -; CHECK-LABEL: @test_slt_sle -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_slt_sle(i32 %a, i32 %b) { - %cmp1 = icmp slt i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %slt_sle_istrue, label %slt_sle_isfalse - -slt_sle_istrue: - call void @is(i1 true) - ret void - -slt_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A <=s B implies A <=s B is true. -; CHECK-LABEL: @test_sle_sle -; CHECK: call void @is(i1 true) -; CHECK-NOT: call void @is(i1 false) -define void @test_sle_sle(i32 %a, i32 %b) { - %cmp1 = icmp sle i32 %a, %b - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp sle i32 %a, %b - br i1 %cmp2, label %sle_sle_istrue, label %sle_sle_isfalse - -sle_sle_istrue: - call void @is(i1 true) - ret void - -sle_sle_isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} - -; A >=u 5 implies A <u 5 is false. -; CHECK-LABEL: @test_uge_ult_const -; CHECK-NOT: call void @is(i1 true) -; CHECK: call void @is(i1 false) -define void @test_uge_ult_const(i32 %a, i32 %b) { - %cmp1 = icmp uge i32 %a, 5 - br i1 %cmp1, label %taken, label %untaken - -taken: - %cmp2 = icmp ult i32 %a, 5 - br i1 %cmp2, label %istrue, label %isfalse - -istrue: - call void @is(i1 true) - ret void - -isfalse: - call void @is(i1 false) - ret void - -untaken: - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/implied-cond.ll b/llvm/test/Transforms/SimplifyCFG/implied-cond.ll deleted file mode 100644 index 317adc4c347..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/implied-cond.ll +++ /dev/null @@ -1,81 +0,0 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s -; Check for when one branch implies the value of a successors conditional and -; it's not simply the same conditional repeated. - -define void @test(i32 %length.i, i32 %i) { -; CHECK-LABEL: @test - %iplus1 = add nsw i32 %i, 1 - %var29 = icmp slt i32 %iplus1, %length.i -; CHECK: br i1 %var29, label %in_bounds, label %out_of_bounds - br i1 %var29, label %next, label %out_of_bounds - -next: -; CHECK-LABEL: in_bounds: -; CHECK-NEXT: ret void - %var30 = icmp slt i32 %i, %length.i - br i1 %var30, label %in_bounds, label %out_of_bounds2 - -in_bounds: - ret void - -out_of_bounds: - call void @foo(i64 0) - unreachable - -out_of_bounds2: - call void @foo(i64 1) - unreachable -} - -; If the add is not nsw, it's not safe to use the fact about i+1 to imply the -; i condition since it could have overflowed. -define void @test_neg(i32 %length.i, i32 %i) { -; CHECK-LABEL: @test_neg - %iplus1 = add i32 %i, 1 - %var29 = icmp slt i32 %iplus1, %length.i -; CHECK: br i1 %var29, label %next, label %out_of_bounds - br i1 %var29, label %next, label %out_of_bounds - -next: - %var30 = icmp slt i32 %i, %length.i -; CHECK: br i1 %var30, label %in_bounds, label %out_of_bounds2 - br i1 %var30, label %in_bounds, label %out_of_bounds2 - -in_bounds: - ret void - -out_of_bounds: - call void @foo(i64 0) - unreachable - -out_of_bounds2: - call void @foo(i64 1) - unreachable -} - - -define void @test2(i32 %length.i, i32 %i) { -; CHECK-LABEL: @test2 - %iplus100 = add nsw i32 %i, 100 - %var29 = icmp slt i32 %iplus100, %length.i -; CHECK: br i1 %var29, label %in_bounds, label %out_of_bounds - br i1 %var29, label %next, label %out_of_bounds - -next: - %var30 = icmp slt i32 %i, %length.i - br i1 %var30, label %in_bounds, label %out_of_bounds2 - -in_bounds: - ret void - -out_of_bounds: - call void @foo(i64 0) - unreachable - -out_of_bounds2: - call void @foo(i64 1) - unreachable -} - -declare void @foo(i64) - diff --git a/llvm/test/Transforms/SimplifyCFG/indirectbr.ll b/llvm/test/Transforms/SimplifyCFG/indirectbr.ll deleted file mode 100644 index 67e23d2fe93..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/indirectbr.ll +++ /dev/null @@ -1,251 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -; SimplifyCFG should eliminate redundant indirectbr edges. - -; CHECK: indbrtest0 -; CHECK: indirectbr i8* %t, [label %BB0, label %BB1, label %BB2] -; CHECK: %x = phi i32 [ 0, %BB0 ], [ 1, %entry ] - -declare void @foo() -declare void @A() -declare void @B(i32) -declare void @C() - -define void @indbrtest0(i8** %P, i8** %Q) { -entry: - store i8* blockaddress(@indbrtest0, %BB0), i8** %P - store i8* blockaddress(@indbrtest0, %BB1), i8** %P - store i8* blockaddress(@indbrtest0, %BB2), i8** %P - call void @foo() - %t = load i8*, i8** %Q - indirectbr i8* %t, [label %BB0, label %BB1, label %BB2, label %BB0, label %BB1, label %BB2] -BB0: - call void @A() - br label %BB1 -BB1: - %x = phi i32 [ 0, %BB0 ], [ 1, %entry ], [ 1, %entry ] - call void @B(i32 %x) - ret void -BB2: - call void @C() - ret void -} - -; SimplifyCFG should convert the indirectbr into a directbr. It would be even -; better if it removed the branch altogether, but simplifycfdg currently misses -; that because the predecessor is the entry block. - -; CHECK: indbrtest1 -; CHECK: br label %BB0 - -define void @indbrtest1(i8** %P, i8** %Q) { -entry: - store i8* blockaddress(@indbrtest1, %BB0), i8** %P - call void @foo() - %t = load i8*, i8** %Q - indirectbr i8* %t, [label %BB0, label %BB0] -BB0: - call void @A() - ret void -} - -; SimplifyCFG should notice that BB0 does not have its address taken and -; remove it from entry's successor list. - -; CHECK: indbrtest2 -; CHECK: entry: -; CHECK-NEXT: unreachable - -define void @indbrtest2(i8* %t) { -entry: - indirectbr i8* %t, [label %BB0, label %BB0] -BB0: - ret void -} - - -; Make sure the blocks in the next few tests aren't trivially removable as -; successors by taking their addresses. - -@anchor = constant [13 x i8*] [ - i8* blockaddress(@indbrtest3, %L1), i8* blockaddress(@indbrtest3, %L2), i8* blockaddress(@indbrtest3, %L3), - i8* blockaddress(@indbrtest4, %L1), i8* blockaddress(@indbrtest4, %L2), i8* blockaddress(@indbrtest4, %L3), - i8* blockaddress(@indbrtest5, %L1), i8* blockaddress(@indbrtest5, %L2), i8* blockaddress(@indbrtest5, %L3), i8* blockaddress(@indbrtest5, %L4), - i8* blockaddress(@indbrtest6, %L1), i8* blockaddress(@indbrtest6, %L2), i8* blockaddress(@indbrtest6, %L3) -] - -; SimplifyCFG should turn the indirectbr into a conditional branch on the -; condition of the select. - -; CHECK-LABEL: @indbrtest3( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %L1, label %L2 -; CHECK-NOT: indirectbr -; CHECK-NOT: br -; CHECK-NOT: L3: -define void @indbrtest3(i1 %cond, i8* %address) nounwind { -entry: - %indirect.goto.dest = select i1 %cond, i8* blockaddress(@indbrtest3, %L1), i8* blockaddress(@indbrtest3, %L2) - indirectbr i8* %indirect.goto.dest, [label %L1, label %L2, label %L3] - -L1: - call void @A() - ret void -L2: - call void @C() - ret void -L3: - call void @foo() - ret void -} - -; SimplifyCFG should turn the indirectbr into an unconditional branch to the -; only possible destination. -; As in @indbrtest1, it should really remove the branch entirely, but it doesn't -; because it's in the entry block. - -; CHECK-LABEL: @indbrtest4( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label %L1 -define void @indbrtest4(i1 %cond) nounwind { -entry: - %indirect.goto.dest = select i1 %cond, i8* blockaddress(@indbrtest4, %L1), i8* blockaddress(@indbrtest4, %L1) - indirectbr i8* %indirect.goto.dest, [label %L1, label %L2, label %L3] - -L1: - call void @A() - ret void -L2: - call void @C() - ret void -L3: - call void @foo() - ret void -} - -; SimplifyCFG should turn the indirectbr into an unreachable because neither -; destination is listed as a successor. - -; CHECK-LABEL: @indbrtest5( -; CHECK-NEXT: entry: -; CHECK-NEXT: unreachable -; CHECK-NEXT: } -define void @indbrtest5(i1 %cond, i8* %anchor) nounwind { -entry: - %indirect.goto.dest = select i1 %cond, i8* blockaddress(@indbrtest5, %L1), i8* blockaddress(@indbrtest5, %L2) -; This needs to have more than one successor for this test, otherwise it gets -; replaced with an unconditional branch to the single successor. - indirectbr i8* %indirect.goto.dest, [label %L3, label %L4] - -L1: - call void @A() - ret void -L2: - call void @C() - ret void -L3: - call void @foo() - ret void -L4: - call void @foo() - -; This keeps blockaddresses not otherwise listed as successors from being zapped -; before SimplifyCFG even looks at the indirectbr. - indirectbr i8* %anchor, [label %L1, label %L2] -} - -; The same as above, except the selected addresses are equal. - -; CHECK-LABEL: @indbrtest6( -; CHECK-NEXT: entry: -; CHECK-NEXT: unreachable -; CHECK-NEXT: } -define void @indbrtest6(i1 %cond, i8* %anchor) nounwind { -entry: - %indirect.goto.dest = select i1 %cond, i8* blockaddress(@indbrtest6, %L1), i8* blockaddress(@indbrtest6, %L1) -; This needs to have more than one successor for this test, otherwise it gets -; replaced with an unconditional branch to the single successor. - indirectbr i8* %indirect.goto.dest, [label %L2, label %L3] - -L1: - call void @A() - ret void -L2: - call void @C() - ret void -L3: - call void @foo() - -; This keeps blockaddresses not otherwise listed as successors from being zapped -; before SimplifyCFG even looks at the indirectbr. - indirectbr i8* %anchor, [label %L1, label %L2] -} - -; PR10072 - -@xblkx.bbs = internal unnamed_addr constant [9 x i8*] [i8* blockaddress(@indbrtest7, %xblkx.begin), i8* blockaddress(@indbrtest7, %xblkx.begin3), i8* blockaddress(@indbrtest7, %xblkx.begin4), i8* blockaddress(@indbrtest7, %xblkx.begin5), i8* blockaddress(@indbrtest7, %xblkx.begin6), i8* blockaddress(@indbrtest7, %xblkx.begin7), i8* blockaddress(@indbrtest7, %xblkx.begin8), i8* blockaddress(@indbrtest7, %xblkx.begin9), i8* blockaddress(@indbrtest7, %xblkx.end)] - -define void @indbrtest7() { -escape-string.top: - %xval202x = call i32 @xfunc5x() - br label %xlab5x - -xlab8x: ; preds = %xlab5x - %xvaluex = call i32 @xselectorx() - %xblkx.x = getelementptr [9 x i8*], [9 x i8*]* @xblkx.bbs, i32 0, i32 %xvaluex - %xblkx.load = load i8*, i8** %xblkx.x - indirectbr i8* %xblkx.load, [label %xblkx.begin, label %xblkx.begin3, label %xblkx.begin4, label %xblkx.begin5, label %xblkx.begin6, label %xblkx.begin7, label %xblkx.begin8, label %xblkx.begin9, label %xblkx.end] - -xblkx.begin: - br label %xblkx.end - -xblkx.begin3: - br label %xblkx.end - -xblkx.begin4: - br label %xblkx.end - -xblkx.begin5: - br label %xblkx.end - -xblkx.begin6: - br label %xblkx.end - -xblkx.begin7: - br label %xblkx.end - -xblkx.begin8: - br label %xblkx.end - -xblkx.begin9: - br label %xblkx.end - -xblkx.end: - %yes.0 = phi i1 [ false, %xblkx.begin ], [ true, %xlab8x ], [ false, %xblkx.begin9 ], [ false, %xblkx.begin8 ], [ false, %xblkx.begin7 ], [ false, %xblkx.begin6 ], [ false, %xblkx.begin5 ], [ true, %xblkx.begin4 ], [ false, %xblkx.begin3 ] - br i1 %yes.0, label %v2j, label %xlab17x - -v2j: -; CHECK: %xunusedx = call i32 @xactionx() - %xunusedx = call i32 @xactionx() - br label %xlab4x - -xlab17x: - br label %xlab4x - -xlab4x: - %incr19 = add i32 %xval704x.0, 1 - br label %xlab5x - -xlab5x: - %xval704x.0 = phi i32 [ 0, %escape-string.top ], [ %incr19, %xlab4x ] - %xval10x = icmp ult i32 %xval704x.0, %xval202x - br i1 %xval10x, label %xlab8x, label %xlab9x - -xlab9x: - ret void -} - -declare i32 @xfunc5x() -declare i8 @xfunc7x() -declare i32 @xselectorx() -declare i32 @xactionx() diff --git a/llvm/test/Transforms/SimplifyCFG/inline-asm-sink.ll b/llvm/test/Transforms/SimplifyCFG/inline-asm-sink.ll deleted file mode 100644 index da281d6c4a7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/inline-asm-sink.ll +++ /dev/null @@ -1,29 +0,0 @@ -; RUN: opt < %s -mem2reg -simplifycfg -S | FileCheck -enable-var-scope %s - -define i32 @test(i32 %x) { -; CHECK-LABEL: @test -entry: - %y = alloca i32, align 4 - %tobool = icmp ne i32 %x, 0 - br i1 %tobool, label %if.then, label %if.else - -if.then: -; CHECK: if.then: -; CHECK: [[ASM1:%.*]] = call i32 asm "mov $0, #1", "=r"() - %tmp1 = call i32 asm "mov $0, #1", "=r"() nounwind readnone - store i32 %tmp1, i32* %y, align 4 - br label %if.end - -if.else: -; CHECK: if.else: -; CHECK: [[ASM2:%.*]] = call i32 asm "mov $0, #2", "=r"() - %tmp2 = call i32 asm "mov $0, #2", "=r"() nounwind readnone - store i32 %tmp2, i32* %y, align 4 - br label %if.end - -if.end: -; CHECK: if.end: -; CHECK: {{%.*}} = phi i32 [ [[ASM1]], %if.then ], [ [[ASM2]], %if.else ] - %tmp3 = load i32, i32* %y, align 4 - ret i32 %tmp3 -} diff --git a/llvm/test/Transforms/SimplifyCFG/invoke.ll b/llvm/test/Transforms/SimplifyCFG/invoke.ll deleted file mode 100644 index a58e8005793..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/invoke.ll +++ /dev/null @@ -1,162 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -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-S128" - -declare i32 @__gxx_personality_v0(...) -declare void @__cxa_call_unexpected(i8*) -declare void @purefn() nounwind readnone -declare i32 @read_only() nounwind readonly -declare i32 @nounwind_fn() nounwind -declare i32 @fn() - - -; CHECK-LABEL: @f1( -define i8* @f1() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: -; CHECK: call void @llvm.trap() -; CHECK: unreachable - %call = invoke noalias i8* undef() - to label %invoke.cont unwind label %lpad - -invoke.cont: - ret i8* %call - -lpad: - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer - %1 = extractvalue { i8*, i32 } %0, 0 - tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind - unreachable -} - -; CHECK-LABEL: @f2( -define i8* @f2() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: -; CHECK: call void @llvm.trap() -; CHECK: unreachable - %call = invoke noalias i8* null() - to label %invoke.cont unwind label %lpad - -invoke.cont: - ret i8* %call - -lpad: - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer - %1 = extractvalue { i8*, i32 } %0, 0 - tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind - unreachable -} - -; CHECK-LABEL: @f2_no_null_opt( -define i8* @f2_no_null_opt() nounwind uwtable ssp #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: -; CHECK: invoke noalias i8* null() - %call = invoke noalias i8* null() - to label %invoke.cont unwind label %lpad - -; CHECK: invoke.cont: -; CHECK: ret i8* %call -invoke.cont: - ret i8* %call - -lpad: - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer - %1 = extractvalue { i8*, i32 } %0, 0 - tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind -; CHECK: unreachable - unreachable -} - -; CHECK-LABEL: @f3( -define i32 @f3() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -; CHECK-NEXT: entry -entry: -; CHECK-NEXT: ret i32 3 - %call = invoke i32 @read_only() - to label %invoke.cont unwind label %lpad - -invoke.cont: - ret i32 3 - -lpad: - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer - %1 = extractvalue { i8*, i32 } %0, 0 - tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind - unreachable -} - -; CHECK-LABEL: @f4( -define i32 @f4() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -; CHECK-NEXT: entry -entry: -; CHECK-NEXT: call i32 @read_only() - %call = invoke i32 @read_only() - to label %invoke.cont unwind label %lpad - -invoke.cont: -; CHECK-NEXT: ret i32 %call - ret i32 %call - -lpad: - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer - %1 = extractvalue { i8*, i32 } %0, 0 - tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind - unreachable -} - -; CHECK-LABEL: @f5( -define i32 @f5(i1 %cond, i8* %a, i8* %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: - br i1 %cond, label %x, label %y - -x: -; CHECK: invoke i32 @fn() - %call = invoke i32 @fn() - to label %cont unwind label %lpad - -y: -; CHECK: call i32 @nounwind_fn() - %call2 = invoke i32 @nounwind_fn() - to label %cont unwind label %lpad - -cont: -; CHECK: phi i32 -; CHECK: ret i32 %phi - %phi = phi i32 [%call, %x], [%call2, %y] - ret i32 %phi - -lpad: -; CHECK-NOT: phi - %phi2 = phi i8* [%a, %x], [%b, %y] - %0 = landingpad { i8*, i32 } - filter [0 x i8*] zeroinitializer -; CHECK: __cxa_call_unexpected(i8* %a) - tail call void @__cxa_call_unexpected(i8* %phi2) noreturn nounwind - unreachable -} - -; CHECK-LABEL: @f6( -define void @f6() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: - invoke void @purefn() - to label %invoke.cont1 unwind label %lpad - -invoke.cont1: - %foo = invoke i32 @fn() - to label %invoke.cont2 unwind label %lpad - -invoke.cont2: - ret void - -lpad: -; CHECK-NOT: phi - %tmp = phi i8* [ null, %invoke.cont1 ], [ null, %entry ] - landingpad { i8*, i32 } - cleanup - ret void -} - -attributes #0 = { "null-pointer-is-valid"="true" } diff --git a/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll b/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll deleted file mode 100644 index b11b7c15fa3..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll +++ /dev/null @@ -1,75 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -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() personality i32 (...)* @__gxx_personality_v0 { -; CHECK-LABEL: @test1( -; CHECK-NEXT: call void @bar() -; CHECK-NEXT: ret i32 0 - invoke void @bar( ) - to label %1 unwind label %Rethrow - ret i32 0 -Rethrow: - %exn = landingpad {i8*, i32} - catch i8* null - resume { i8*, i32 } %exn -} - -define i32 @test2() personality i32 (...)* @__gxx_personality_v0 { -; CHECK-LABEL: @test2( -; CHECK-NEXT: call void @bar() [ "foo"(i32 100) ] -; CHECK-NEXT: ret i32 0 - invoke void @bar( ) [ "foo"(i32 100) ] - to label %1 unwind label %Rethrow - ret i32 0 -Rethrow: - %exn = landingpad {i8*, i32} - catch i8* null - resume { i8*, i32 } %exn -} - -declare i64 @dummy1() -declare i64 @dummy2() - -; This testcase checks to see if simplifycfg pass can convert two invoke -; instructions to call instructions if they share a common trivial unwind -; block. -define i64 @test3(i1 %cond) personality i32 (...)* @__gxx_personality_v0 { -entry: -; CHECK-LABEL: @test3( -; CHECK: %call1 = call i64 @dummy1() -; CHECK: %call2 = call i64 @dummy2() -; CHECK-NOT: resume { i8*, i32 } %lp - br i1 %cond, label %br1, label %br2 - -br1: - %call1 = invoke i64 @dummy1() - to label %invoke.cont unwind label %lpad1 - -br2: - %call2 = invoke i64 @dummy2() - to label %invoke.cont unwind label %lpad2 - -invoke.cont: - %c = phi i64 [%call1, %br1], [%call2, %br2] - ret i64 %c - - -lpad1: - %0 = landingpad { i8*, i32 } - cleanup - br label %rethrow - -rethrow: - %lp = phi { i8*, i32 } [%0, %lpad1], [%1, %lpad2] - resume { i8*, i32 } %lp - -lpad2: - %1 = landingpad { i8*, i32 } - cleanup - br label %rethrow -} - -declare i32 @__gxx_personality_v0(...) diff --git a/llvm/test/Transforms/SimplifyCFG/iterative-simplify.ll b/llvm/test/Transforms/SimplifyCFG/iterative-simplify.ll deleted file mode 100644 index 60728b9a957..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/iterative-simplify.ll +++ /dev/null @@ -1,100 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep bb17 -; PR1786 - -define i32 @main() { -entry: - %retval = alloca i32, align 4 ; <i32*> [#uses=1] - %i = alloca i32, align 4 ; <i32*> [#uses=7] - %z = alloca i32, align 4 ; <i32*> [#uses=4] - %z16 = alloca i32, align 4 ; <i32*> [#uses=4] - %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] - store i32 0, i32* %i - %toBool = icmp ne i8 1, 0 ; <i1> [#uses=1] - br i1 %toBool, label %cond_true, label %cond_false - -cond_true: ; preds = %entry - store i32 0, i32* %z - br label %bb - -bb: ; preds = %cond_next, %cond_true - %tmp = load i32, i32* %z ; <i32> [#uses=1] - %tmp1 = sub i32 %tmp, 16384 ; <i32> [#uses=1] - store i32 %tmp1, i32* %z - %tmp2 = load i32, i32* %i ; <i32> [#uses=1] - %tmp3 = add i32 %tmp2, 1 ; <i32> [#uses=1] - store i32 %tmp3, i32* %i - %tmp4 = load i32, i32* %i ; <i32> [#uses=1] - %tmp5 = icmp sgt i32 %tmp4, 262144 ; <i1> [#uses=1] - %tmp56 = zext i1 %tmp5 to i8 ; <i8> [#uses=1] - %toBool7 = icmp ne i8 %tmp56, 0 ; <i1> [#uses=1] - br i1 %toBool7, label %cond_true8, label %cond_next - -cond_true8: ; preds = %bb - call void @abort( ) - unreachable - -cond_next: ; preds = %bb - %tmp9 = load i32, i32* %z ; <i32> [#uses=1] - %tmp10 = icmp ne i32 %tmp9, 0 ; <i1> [#uses=1] - %tmp1011 = zext i1 %tmp10 to i8 ; <i8> [#uses=1] - %toBool12 = icmp ne i8 %tmp1011, 0 ; <i1> [#uses=1] - br i1 %toBool12, label %bb, label %bb13 - -bb13: ; preds = %cond_next - call void @exit( i32 0 ) - unreachable - -cond_false: ; preds = %entry - %toBool14 = icmp ne i8 1, 0 ; <i1> [#uses=1] - br i1 %toBool14, label %cond_true15, label %cond_false33 - -cond_true15: ; preds = %cond_false - store i32 0, i32* %z16 - br label %bb17 - -bb17: ; preds = %cond_next27, %cond_true15 - %tmp18 = load i32, i32* %z16 ; <i32> [#uses=1] - %tmp19 = sub i32 %tmp18, 16384 ; <i32> [#uses=1] - store i32 %tmp19, i32* %z16 - %tmp20 = load i32, i32* %i ; <i32> [#uses=1] - %tmp21 = add i32 %tmp20, 1 ; <i32> [#uses=1] - store i32 %tmp21, i32* %i - %tmp22 = load i32, i32* %i ; <i32> [#uses=1] - %tmp23 = icmp sgt i32 %tmp22, 262144 ; <i1> [#uses=1] - %tmp2324 = zext i1 %tmp23 to i8 ; <i8> [#uses=1] - %toBool25 = icmp ne i8 %tmp2324, 0 ; <i1> [#uses=1] - br i1 %toBool25, label %cond_true26, label %cond_next27 - -cond_true26: ; preds = %bb17 - call void @abort( ) - unreachable - -cond_next27: ; preds = %bb17 - %tmp28 = load i32, i32* %z16 ; <i32> [#uses=1] - %tmp29 = icmp ne i32 %tmp28, 0 ; <i1> [#uses=1] - %tmp2930 = zext i1 %tmp29 to i8 ; <i8> [#uses=1] - %toBool31 = icmp ne i8 %tmp2930, 0 ; <i1> [#uses=1] - br i1 %toBool31, label %bb17, label %bb32 - -bb32: ; preds = %cond_next27 - call void @exit( i32 0 ) - unreachable - -cond_false33: ; preds = %cond_false - call void @exit( i32 0 ) - unreachable - -cond_next34: ; No predecessors! - br label %cond_next35 - -cond_next35: ; preds = %cond_next34 - br label %return - -return: ; preds = %cond_next35 - %retval36 = load i32, i32* %retval ; <i32> [#uses=1] - ret i32 %retval36 -} - -declare void @abort() - -declare void @exit(i32) diff --git a/llvm/test/Transforms/SimplifyCFG/lifetime.ll b/llvm/test/Transforms/SimplifyCFG/lifetime.ll deleted file mode 100644 index 270fe4d5442..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/lifetime.ll +++ /dev/null @@ -1,29 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Test that a lifetime intrinsic isn't removed because that would change semantics - -; CHECK: foo -; CHECK: entry: -; CHECK: bb0: -; CHECK: bb1: -; CHECK: ret -define void @foo(i1 %x) { -entry: - %a = alloca i8 - call void @llvm.lifetime.start.p0i8(i64 -1, i8* %a) nounwind - br i1 %x, label %bb0, label %bb1 - -bb0: - call void @llvm.lifetime.end.p0i8(i64 -1, i8* %a) nounwind - br label %bb1 - -bb1: - call void @f() - ret void -} - -declare void @f() - -declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind - -declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind diff --git a/llvm/test/Transforms/SimplifyCFG/merge-cleanuppads.ll b/llvm/test/Transforms/SimplifyCFG/merge-cleanuppads.ll deleted file mode 100644 index 23bbbca7234..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/merge-cleanuppads.ll +++ /dev/null @@ -1,39 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-pc-windows-msvc18.0.0" - -; Function Attrs: uwtable -define void @test1() #0 personality i32 (...)* @__CxxFrameHandler3 { -entry: - invoke void @may_throw(i32 3) - to label %invoke.cont unwind label %ehcleanup - -invoke.cont: ; preds = %entry - tail call void @may_throw(i32 2) #2 - tail call void @may_throw(i32 1) #2 - ret void - -ehcleanup: ; preds = %entry - %cp = cleanuppad within none [] - tail call void @may_throw(i32 2) #2 [ "funclet"(token %cp) ] - cleanupret from %cp unwind label %ehcleanup2 - -ehcleanup2: - %cp2 = cleanuppad within none [] - tail call void @may_throw(i32 1) #2 [ "funclet"(token %cp2) ] - cleanupret from %cp2 unwind to caller -} - -; CHECK-LABEL: define void @test1( -; CHECK: %[[cp:.*]] = cleanuppad within none [] -; CHECK: tail call void @may_throw(i32 2) #2 [ "funclet"(token %[[cp]]) ] -; CHECK: tail call void @may_throw(i32 1) #2 [ "funclet"(token %[[cp]]) ] -; CHECK: cleanupret from %[[cp]] unwind to caller - -declare void @may_throw(i32) #1 - -declare i32 @__CxxFrameHandler3(...) - -attributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #2 = { nounwind } diff --git a/llvm/test/Transforms/SimplifyCFG/merge-cond-stores-2.ll b/llvm/test/Transforms/SimplifyCFG/merge-cond-stores-2.ll deleted file mode 100644 index a2ca63d0a2d..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/merge-cond-stores-2.ll +++ /dev/null @@ -1,321 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S < %s -simplifycfg -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=1 | FileCheck %s - -target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -target triple = "armv7--linux-gnueabihf" - -; This is a bit reversal that has been run through the early optimizer (-mem2reg -gvn -instcombine). -; There should be no additional PHIs created at all. The store should be on its own in a predicated -; block and there should be no PHIs. - -define i32 @f(i32* %b) { -; CHECK-LABEL: @f( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[B:%.*]], align 4 -; CHECK-NEXT: [[AND:%.*]] = and i32 [[TMP0]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[AND]], 0 -; CHECK-NEXT: [[OR:%.*]] = or i32 [[TMP0]], -2147483648 -; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[TOBOOL]], i32 [[TMP0]], i32 [[OR]] -; CHECK-NEXT: [[AND1:%.*]] = and i32 [[TMP1]], 2 -; CHECK-NEXT: [[TOBOOL2:%.*]] = icmp eq i32 [[AND1]], 0 -; CHECK-NEXT: [[OR4:%.*]] = or i32 [[TMP1]], 1073741824 -; CHECK-NEXT: [[DOTOR4:%.*]] = select i1 [[TOBOOL2]], i32 [[TMP1]], i32 [[OR4]] -; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TOBOOL2]], true -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]] -; CHECK-NEXT: [[AND6:%.*]] = and i32 [[DOTOR4]], 4 -; CHECK-NEXT: [[TOBOOL7:%.*]] = icmp eq i32 [[AND6]], 0 -; CHECK-NEXT: [[OR9:%.*]] = or i32 [[DOTOR4]], 536870912 -; CHECK-NEXT: [[DOTOR4_OR9:%.*]] = select i1 [[TOBOOL7]], i32 [[DOTOR4]], i32 [[OR9]] -; CHECK-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL7]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TMP5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP7]], [[TMP6]] -; CHECK-NEXT: [[AND11:%.*]] = and i32 [[DOTOR4_OR9]], 8 -; CHECK-NEXT: [[TOBOOL12:%.*]] = icmp eq i32 [[AND11]], 0 -; CHECK-NEXT: [[OR14:%.*]] = or i32 [[DOTOR4_OR9]], 268435456 -; CHECK-NEXT: [[DOTOR4_OR9_OR14:%.*]] = select i1 [[TOBOOL12]], i32 [[DOTOR4_OR9]], i32 [[OR14]] -; CHECK-NEXT: [[TMP9:%.*]] = xor i1 [[TMP8]], true -; CHECK-NEXT: [[TMP10:%.*]] = xor i1 [[TOBOOL12]], true -; CHECK-NEXT: [[TMP11:%.*]] = xor i1 [[TMP9]], true -; CHECK-NEXT: [[TMP12:%.*]] = or i1 [[TMP11]], [[TMP10]] -; CHECK-NEXT: [[AND16:%.*]] = and i32 [[DOTOR4_OR9_OR14]], 16 -; CHECK-NEXT: [[TOBOOL17:%.*]] = icmp eq i32 [[AND16]], 0 -; CHECK-NEXT: [[OR19:%.*]] = or i32 [[DOTOR4_OR9_OR14]], 134217728 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19:%.*]] = select i1 [[TOBOOL17]], i32 [[DOTOR4_OR9_OR14]], i32 [[OR19]] -; CHECK-NEXT: [[TMP13:%.*]] = xor i1 [[TMP12]], true -; CHECK-NEXT: [[TMP14:%.*]] = xor i1 [[TOBOOL17]], true -; CHECK-NEXT: [[TMP15:%.*]] = xor i1 [[TMP13]], true -; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP15]], [[TMP14]] -; CHECK-NEXT: [[AND21:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19]], 32 -; CHECK-NEXT: [[TOBOOL22:%.*]] = icmp eq i32 [[AND21]], 0 -; CHECK-NEXT: [[OR24:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19]], 67108864 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24:%.*]] = select i1 [[TOBOOL22]], i32 [[DOTOR4_OR9_OR14_OR19]], i32 [[OR24]] -; CHECK-NEXT: [[TMP17:%.*]] = xor i1 [[TMP16]], true -; CHECK-NEXT: [[TMP18:%.*]] = xor i1 [[TOBOOL22]], true -; CHECK-NEXT: [[TMP19:%.*]] = xor i1 [[TMP17]], true -; CHECK-NEXT: [[TMP20:%.*]] = or i1 [[TMP19]], [[TMP18]] -; CHECK-NEXT: [[AND26:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24]], 64 -; CHECK-NEXT: [[TOBOOL27:%.*]] = icmp eq i32 [[AND26]], 0 -; CHECK-NEXT: [[OR29:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24]], 33554432 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29:%.*]] = select i1 [[TOBOOL27]], i32 [[DOTOR4_OR9_OR14_OR19_OR24]], i32 [[OR29]] -; CHECK-NEXT: [[TMP21:%.*]] = xor i1 [[TMP20]], true -; CHECK-NEXT: [[TMP22:%.*]] = xor i1 [[TOBOOL27]], true -; CHECK-NEXT: [[TMP23:%.*]] = xor i1 [[TMP21]], true -; CHECK-NEXT: [[TMP24:%.*]] = or i1 [[TMP23]], [[TMP22]] -; CHECK-NEXT: [[AND31:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29]], 256 -; CHECK-NEXT: [[TOBOOL32:%.*]] = icmp eq i32 [[AND31]], 0 -; CHECK-NEXT: [[OR34:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29]], 8388608 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34:%.*]] = select i1 [[TOBOOL32]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29]], i32 [[OR34]] -; CHECK-NEXT: [[TMP25:%.*]] = xor i1 [[TMP24]], true -; CHECK-NEXT: [[TMP26:%.*]] = xor i1 [[TOBOOL32]], true -; CHECK-NEXT: [[TMP27:%.*]] = xor i1 [[TMP25]], true -; CHECK-NEXT: [[TMP28:%.*]] = or i1 [[TMP27]], [[TMP26]] -; CHECK-NEXT: [[AND36:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34]], 512 -; CHECK-NEXT: [[TOBOOL37:%.*]] = icmp eq i32 [[AND36]], 0 -; CHECK-NEXT: [[OR39:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34]], 4194304 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39:%.*]] = select i1 [[TOBOOL37]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34]], i32 [[OR39]] -; CHECK-NEXT: [[TMP29:%.*]] = xor i1 [[TMP28]], true -; CHECK-NEXT: [[TMP30:%.*]] = xor i1 [[TOBOOL37]], true -; CHECK-NEXT: [[TMP31:%.*]] = xor i1 [[TMP29]], true -; CHECK-NEXT: [[TMP32:%.*]] = or i1 [[TMP31]], [[TMP30]] -; CHECK-NEXT: [[AND41:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39]], 1024 -; CHECK-NEXT: [[TOBOOL42:%.*]] = icmp eq i32 [[AND41]], 0 -; CHECK-NEXT: [[OR44:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39]], 2097152 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44:%.*]] = select i1 [[TOBOOL42]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39]], i32 [[OR44]] -; CHECK-NEXT: [[TMP33:%.*]] = xor i1 [[TMP32]], true -; CHECK-NEXT: [[TMP34:%.*]] = xor i1 [[TOBOOL42]], true -; CHECK-NEXT: [[TMP35:%.*]] = xor i1 [[TMP33]], true -; CHECK-NEXT: [[TMP36:%.*]] = or i1 [[TMP35]], [[TMP34]] -; CHECK-NEXT: [[AND46:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44]], 2048 -; CHECK-NEXT: [[TOBOOL47:%.*]] = icmp eq i32 [[AND46]], 0 -; CHECK-NEXT: [[OR49:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44]], 1048576 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49:%.*]] = select i1 [[TOBOOL47]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44]], i32 [[OR49]] -; CHECK-NEXT: [[TMP37:%.*]] = xor i1 [[TMP36]], true -; CHECK-NEXT: [[TMP38:%.*]] = xor i1 [[TOBOOL47]], true -; CHECK-NEXT: [[TMP39:%.*]] = xor i1 [[TMP37]], true -; CHECK-NEXT: [[TMP40:%.*]] = or i1 [[TMP39]], [[TMP38]] -; CHECK-NEXT: [[AND51:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49]], 4096 -; CHECK-NEXT: [[TOBOOL52:%.*]] = icmp eq i32 [[AND51]], 0 -; CHECK-NEXT: [[OR54:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49]], 524288 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54:%.*]] = select i1 [[TOBOOL52]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49]], i32 [[OR54]] -; CHECK-NEXT: [[TMP41:%.*]] = xor i1 [[TMP40]], true -; CHECK-NEXT: [[TMP42:%.*]] = xor i1 [[TOBOOL52]], true -; CHECK-NEXT: [[TMP43:%.*]] = xor i1 [[TMP41]], true -; CHECK-NEXT: [[TMP44:%.*]] = or i1 [[TMP43]], [[TMP42]] -; CHECK-NEXT: [[AND56:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54]], 8192 -; CHECK-NEXT: [[TOBOOL57:%.*]] = icmp eq i32 [[AND56]], 0 -; CHECK-NEXT: [[OR59:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54]], 262144 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59:%.*]] = select i1 [[TOBOOL57]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54]], i32 [[OR59]] -; CHECK-NEXT: [[TMP45:%.*]] = xor i1 [[TMP44]], true -; CHECK-NEXT: [[TMP46:%.*]] = xor i1 [[TOBOOL57]], true -; CHECK-NEXT: [[TMP47:%.*]] = xor i1 [[TMP45]], true -; CHECK-NEXT: [[TMP48:%.*]] = or i1 [[TMP47]], [[TMP46]] -; CHECK-NEXT: [[AND61:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59]], 16384 -; CHECK-NEXT: [[TOBOOL62:%.*]] = icmp eq i32 [[AND61]], 0 -; CHECK-NEXT: [[OR64:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59]], 131072 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64:%.*]] = select i1 [[TOBOOL62]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59]], i32 [[OR64]] -; CHECK-NEXT: [[TMP49:%.*]] = xor i1 [[TMP48]], true -; CHECK-NEXT: [[TMP50:%.*]] = xor i1 [[TOBOOL62]], true -; CHECK-NEXT: [[TMP51:%.*]] = xor i1 [[TMP49]], true -; CHECK-NEXT: [[TMP52:%.*]] = or i1 [[TMP51]], [[TMP50]] -; CHECK-NEXT: [[AND66:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64]], 32768 -; CHECK-NEXT: [[TOBOOL67:%.*]] = icmp eq i32 [[AND66]], 0 -; CHECK-NEXT: [[OR69:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64]], 65536 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69:%.*]] = select i1 [[TOBOOL67]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64]], i32 [[OR69]] -; CHECK-NEXT: [[TMP53:%.*]] = xor i1 [[TMP52]], true -; CHECK-NEXT: [[TMP54:%.*]] = xor i1 [[TOBOOL67]], true -; CHECK-NEXT: [[TMP55:%.*]] = xor i1 [[TMP53]], true -; CHECK-NEXT: [[TMP56:%.*]] = or i1 [[TMP55]], [[TMP54]] -; CHECK-NEXT: [[AND71:%.*]] = and i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69]], 128 -; CHECK-NEXT: [[TOBOOL72:%.*]] = icmp eq i32 [[AND71]], 0 -; CHECK-NEXT: [[OR74:%.*]] = or i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69]], 16777216 -; CHECK-NEXT: [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69_OR74:%.*]] = select i1 [[TOBOOL72]], i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69]], i32 [[OR74]] -; CHECK-NEXT: [[TMP57:%.*]] = xor i1 [[TMP56]], true -; CHECK-NEXT: [[TMP58:%.*]] = xor i1 [[TOBOOL72]], true -; CHECK-NEXT: [[TMP59:%.*]] = xor i1 [[TMP57]], true -; CHECK-NEXT: [[TMP60:%.*]] = or i1 [[TMP59]], [[TMP58]] -; CHECK-NEXT: br i1 [[TMP60]], label [[TMP61:%.*]], label [[TMP62:%.*]] -; CHECK: store i32 [[DOTOR4_OR9_OR14_OR19_OR24_OR29_OR34_OR39_OR44_OR49_OR54_OR59_OR64_OR69_OR74]], i32* [[B]], align 4 -; CHECK-NEXT: br label [[TMP62]] -; CHECK: ret i32 0 -; -entry: - %0 = load i32, i32* %b, align 4 - %and = and i32 %0, 1 - %tobool = icmp eq i32 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %or = or i32 %0, -2147483648 - store i32 %or, i32* %b, align 4 - br label %if.end - -if.end: ; preds = %entry, %if.then - %1 = phi i32 [ %0, %entry ], [ %or, %if.then ] - %and1 = and i32 %1, 2 - %tobool2 = icmp eq i32 %and1, 0 - br i1 %tobool2, label %if.end5, label %if.then3 - -if.then3: ; preds = %if.end - %or4 = or i32 %1, 1073741824 - store i32 %or4, i32* %b, align 4 - br label %if.end5 - -if.end5: ; preds = %if.end, %if.then3 - %2 = phi i32 [ %1, %if.end ], [ %or4, %if.then3 ] - %and6 = and i32 %2, 4 - %tobool7 = icmp eq i32 %and6, 0 - br i1 %tobool7, label %if.end10, label %if.then8 - -if.then8: ; preds = %if.end5 - %or9 = or i32 %2, 536870912 - store i32 %or9, i32* %b, align 4 - br label %if.end10 - -if.end10: ; preds = %if.end5, %if.then8 - %3 = phi i32 [ %2, %if.end5 ], [ %or9, %if.then8 ] - %and11 = and i32 %3, 8 - %tobool12 = icmp eq i32 %and11, 0 - br i1 %tobool12, label %if.end15, label %if.then13 - -if.then13: ; preds = %if.end10 - %or14 = or i32 %3, 268435456 - store i32 %or14, i32* %b, align 4 - br label %if.end15 - -if.end15: ; preds = %if.end10, %if.then13 - %4 = phi i32 [ %3, %if.end10 ], [ %or14, %if.then13 ] - %and16 = and i32 %4, 16 - %tobool17 = icmp eq i32 %and16, 0 - br i1 %tobool17, label %if.end20, label %if.then18 - -if.then18: ; preds = %if.end15 - %or19 = or i32 %4, 134217728 - store i32 %or19, i32* %b, align 4 - br label %if.end20 - -if.end20: ; preds = %if.end15, %if.then18 - %5 = phi i32 [ %4, %if.end15 ], [ %or19, %if.then18 ] - %and21 = and i32 %5, 32 - %tobool22 = icmp eq i32 %and21, 0 - br i1 %tobool22, label %if.end25, label %if.then23 - -if.then23: ; preds = %if.end20 - %or24 = or i32 %5, 67108864 - store i32 %or24, i32* %b, align 4 - br label %if.end25 - -if.end25: ; preds = %if.end20, %if.then23 - %6 = phi i32 [ %5, %if.end20 ], [ %or24, %if.then23 ] - %and26 = and i32 %6, 64 - %tobool27 = icmp eq i32 %and26, 0 - br i1 %tobool27, label %if.end30, label %if.then28 - -if.then28: ; preds = %if.end25 - %or29 = or i32 %6, 33554432 - store i32 %or29, i32* %b, align 4 - br label %if.end30 - -if.end30: ; preds = %if.end25, %if.then28 - %7 = phi i32 [ %6, %if.end25 ], [ %or29, %if.then28 ] - %and31 = and i32 %7, 256 - %tobool32 = icmp eq i32 %and31, 0 - br i1 %tobool32, label %if.end35, label %if.then33 - -if.then33: ; preds = %if.end30 - %or34 = or i32 %7, 8388608 - store i32 %or34, i32* %b, align 4 - br label %if.end35 - -if.end35: ; preds = %if.end30, %if.then33 - %8 = phi i32 [ %7, %if.end30 ], [ %or34, %if.then33 ] - %and36 = and i32 %8, 512 - %tobool37 = icmp eq i32 %and36, 0 - br i1 %tobool37, label %if.end40, label %if.then38 - -if.then38: ; preds = %if.end35 - %or39 = or i32 %8, 4194304 - store i32 %or39, i32* %b, align 4 - br label %if.end40 - -if.end40: ; preds = %if.end35, %if.then38 - %9 = phi i32 [ %8, %if.end35 ], [ %or39, %if.then38 ] - %and41 = and i32 %9, 1024 - %tobool42 = icmp eq i32 %and41, 0 - br i1 %tobool42, label %if.end45, label %if.then43 - -if.then43: ; preds = %if.end40 - %or44 = or i32 %9, 2097152 - store i32 %or44, i32* %b, align 4 - br label %if.end45 - -if.end45: ; preds = %if.end40, %if.then43 - %10 = phi i32 [ %9, %if.end40 ], [ %or44, %if.then43 ] - %and46 = and i32 %10, 2048 - %tobool47 = icmp eq i32 %and46, 0 - br i1 %tobool47, label %if.end50, label %if.then48 - -if.then48: ; preds = %if.end45 - %or49 = or i32 %10, 1048576 - store i32 %or49, i32* %b, align 4 - br label %if.end50 - -if.end50: ; preds = %if.end45, %if.then48 - %11 = phi i32 [ %10, %if.end45 ], [ %or49, %if.then48 ] - %and51 = and i32 %11, 4096 - %tobool52 = icmp eq i32 %and51, 0 - br i1 %tobool52, label %if.end55, label %if.then53 - -if.then53: ; preds = %if.end50 - %or54 = or i32 %11, 524288 - store i32 %or54, i32* %b, align 4 - br label %if.end55 - -if.end55: ; preds = %if.end50, %if.then53 - %12 = phi i32 [ %11, %if.end50 ], [ %or54, %if.then53 ] - %and56 = and i32 %12, 8192 - %tobool57 = icmp eq i32 %and56, 0 - br i1 %tobool57, label %if.end60, label %if.then58 - -if.then58: ; preds = %if.end55 - %or59 = or i32 %12, 262144 - store i32 %or59, i32* %b, align 4 - br label %if.end60 - -if.end60: ; preds = %if.end55, %if.then58 - %13 = phi i32 [ %12, %if.end55 ], [ %or59, %if.then58 ] - %and61 = and i32 %13, 16384 - %tobool62 = icmp eq i32 %and61, 0 - br i1 %tobool62, label %if.end65, label %if.then63 - -if.then63: ; preds = %if.end60 - %or64 = or i32 %13, 131072 - store i32 %or64, i32* %b, align 4 - br label %if.end65 - -if.end65: ; preds = %if.end60, %if.then63 - %14 = phi i32 [ %13, %if.end60 ], [ %or64, %if.then63 ] - %and66 = and i32 %14, 32768 - %tobool67 = icmp eq i32 %and66, 0 - br i1 %tobool67, label %if.end70, label %if.then68 - -if.then68: ; preds = %if.end65 - %or69 = or i32 %14, 65536 - store i32 %or69, i32* %b, align 4 - br label %if.end70 - -if.end70: ; preds = %if.end65, %if.then68 - %15 = phi i32 [ %14, %if.end65 ], [ %or69, %if.then68 ] - %and71 = and i32 %15, 128 - %tobool72 = icmp eq i32 %and71, 0 - br i1 %tobool72, label %if.end75, label %if.then73 - -if.then73: ; preds = %if.end70 - %or74 = or i32 %15, 16777216 - store i32 %or74, i32* %b, align 4 - br label %if.end75 - -if.end75: ; preds = %if.end70, %if.then73 - ret i32 0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/merge-cond-stores.ll b/llvm/test/Transforms/SimplifyCFG/merge-cond-stores.ll deleted file mode 100644 index fd629c8cec5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/merge-cond-stores.ll +++ /dev/null @@ -1,408 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -simplifycfg -instcombine < %s -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=2 -S | FileCheck %s - -; This test should succeed and end up if-converted. -define void @test_simple(i32* %p, i32 %a, i32 %b) { -; CHECK-LABEL: @test_simple( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp ne i32 [[A:%.*]], 0 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X2]], true -; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[X1]], [[TMP0]] -; CHECK-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] -; CHECK: [[NOT_X2:%.*]] = xor i1 [[X2]], true -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[NOT_X2]] to i32 -; CHECK-NEXT: store i32 [[SPEC_SELECT]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[TMP3]] -; CHECK: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -fallthrough: - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %end, label %yes2 - -yes2: - store i32 1, i32* %p - br label %end - -end: - ret void -} - -; This is the same as test_simple, but the branch target order has been swapped -define void @test_simple_commuted(i32* %p, i32 %a, i32 %b) { -; CHECK-LABEL: @test_simple_commuted( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[X1]], [[X2]] -; CHECK-NEXT: br i1 [[TMP0]], label [[TMP1:%.*]], label [[TMP2:%.*]] -; CHECK: [[SPEC_SELECT:%.*]] = zext i1 [[X2]] to i32 -; CHECK-NEXT: store i32 [[SPEC_SELECT]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[TMP2]] -; CHECK: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %yes1, label %fallthrough - -yes1: - store i32 0, i32* %p - br label %fallthrough - -fallthrough: - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %yes2, label %end - -yes2: - store i32 1, i32* %p - br label %end - -end: - ret void -} - -; This test should entirely fold away, leaving one large basic block. -define void @test_recursive(i32* %p, i32 %a, i32 %b, i32 %c, i32 %d) { -; CHECK-LABEL: @test_recursive( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[B:%.*]], [[A:%.*]] -; CHECK-NEXT: [[X4:%.*]] = icmp eq i32 [[D:%.*]], 0 -; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[TMP0]], [[C:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[X4]], true -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP2]], [[TMP3]] -; CHECK-NEXT: br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP6:%.*]] -; CHECK: [[X3:%.*]] = icmp eq i32 [[C]], 0 -; CHECK-NEXT: [[X2:%.*]] = icmp ne i32 [[B]], 0 -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[X2]] to i32 -; CHECK-NEXT: [[SPEC_SELECT1:%.*]] = select i1 [[X3]], i32 [[SPEC_SELECT]], i32 2 -; CHECK-NEXT: [[SPEC_SELECT2:%.*]] = select i1 [[X4]], i32 [[SPEC_SELECT1]], i32 3 -; CHECK-NEXT: store i32 [[SPEC_SELECT2]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[TMP6]] -; CHECK: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -fallthrough: - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %next, label %yes2 - -yes2: - store i32 1, i32* %p - br label %next - -next: - %x3 = icmp eq i32 %c, 0 - br i1 %x3, label %fallthrough2, label %yes3 - -yes3: - store i32 2, i32* %p - br label %fallthrough2 - -fallthrough2: - %x4 = icmp eq i32 %d, 0 - br i1 %x4, label %end, label %yes4 - -yes4: - store i32 3, i32* %p - br label %end - - -end: - ret void -} - -; The code in each diamond is too large - it won't be if-converted so our -; heuristics should say no. -define void @test_not_ifconverted(i32* %p, i32 %a, i32 %b) { -; CHECK-LABEL: @test_not_ifconverted( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] -; CHECK: yes1: -; CHECK-NEXT: [[Y1:%.*]] = or i32 [[B:%.*]], 55 -; CHECK-NEXT: [[Y2:%.*]] = add i32 [[Y1]], 24 -; CHECK-NEXT: [[Y3:%.*]] = and i32 [[Y2]], 67 -; CHECK-NEXT: store i32 [[Y3]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[FALLTHROUGH]] -; CHECK: fallthrough: -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 -; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] -; CHECK: yes2: -; CHECK-NEXT: [[Z1:%.*]] = or i32 [[A]], 55 -; CHECK-NEXT: [[Z2:%.*]] = add i32 [[Z1]], 24 -; CHECK-NEXT: [[Z3:%.*]] = and i32 [[Z2]], 67 -; CHECK-NEXT: store i32 [[Z3]], i32* [[P]], align 4 -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 - -yes1: - %y1 = or i32 %b, 55 - %y2 = add i32 %y1, 24 - %y3 = and i32 %y2, 67 - store i32 %y3, i32* %p - br label %fallthrough - -fallthrough: - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %end, label %yes2 - -yes2: - %z1 = or i32 %a, 55 - %z2 = add i32 %z1, 24 - %z3 = and i32 %z2, 67 - store i32 %z3, i32* %p - br label %end - -end: - ret void -} - -; The store to %p clobbers the previous store, so if-converting this would -; be illegal. -define void @test_aliasing1(i32* %p, i32 %a, i32 %b) { -; CHECK-LABEL: @test_aliasing1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] -; CHECK: yes1: -; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[FALLTHROUGH]] -; CHECK: fallthrough: -; CHECK-NEXT: [[Y1:%.*]] = load i32, i32* [[P]], align 4 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[Y1]], 0 -; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] -; CHECK: yes2: -; CHECK-NEXT: store i32 1, i32* [[P]], align 4 -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -fallthrough: - %y1 = load i32, i32* %p - %x2 = icmp eq i32 %y1, 0 - br i1 %x2, label %end, label %yes2 - -yes2: - store i32 1, i32* %p - br label %end - -end: - ret void -} - -; The load from %q aliases with %p, so if-converting this would be illegal. -define void @test_aliasing2(i32* %p, i32* %q, i32 %a, i32 %b) { -; CHECK-LABEL: @test_aliasing2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: br i1 [[X1]], label [[FALLTHROUGH:%.*]], label [[YES1:%.*]] -; CHECK: yes1: -; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[FALLTHROUGH]] -; CHECK: fallthrough: -; CHECK-NEXT: [[Y1:%.*]] = load i32, i32* [[Q:%.*]], align 4 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[Y1]], 0 -; CHECK-NEXT: br i1 [[X2]], label [[END:%.*]], label [[YES2:%.*]] -; CHECK: yes2: -; CHECK-NEXT: store i32 1, i32* [[P]], align 4 -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -fallthrough: - %y1 = load i32, i32* %q - %x2 = icmp eq i32 %y1, 0 - br i1 %x2, label %end, label %yes2 - -yes2: - store i32 1, i32* %p - br label %end - -end: - ret void -} - -declare void @f() - -; This should get if-converted. -define i32 @test_diamond_simple(i32* %p, i32* %q, i32 %a, i32 %b) { -; CHECK-LABEL: @test_diamond_simple( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: [[Z2:%.*]] = select i1 [[X1]], i32 [[B:%.*]], i32 0 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 -; CHECK-NEXT: [[Z4:%.*]] = select i1 [[X2]], i32 [[Z2]], i32 3 -; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[A]], [[B]] -; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 0 -; CHECK-NEXT: br i1 [[TMP1]], label [[TMP3:%.*]], label [[TMP2:%.*]] -; CHECK: [[SIMPLIFYCFG_MERGE:%.*]] = select i1 [[X2]], i32 [[Z2]], i32 1 -; CHECK-NEXT: store i32 [[SIMPLIFYCFG_MERGE]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[TMP3]] -; CHECK: ret i32 [[Z4]] -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %no1, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -no1: - %z1 = add i32 %a, %b - br label %fallthrough - -fallthrough: - %z2 = phi i32 [ %z1, %no1 ], [ 0, %yes1 ] - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %no2, label %yes2 - -yes2: - store i32 1, i32* %p - br label %end - -no2: - %z3 = sub i32 %z2, %b - br label %end - -end: - %z4 = phi i32 [ %z3, %no2 ], [ 3, %yes2 ] - ret i32 %z4 -} - -; Now there is a call to f() in the bottom branch. The store in the first -; branch would now be reordered with respect to the call if we if-converted, -; so we must not. -define i32 @test_diamond_alias3(i32* %p, i32* %q, i32 %a, i32 %b) { -; CHECK-LABEL: @test_diamond_alias3( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X1:%.*]] = icmp eq i32 [[A:%.*]], 0 -; CHECK-NEXT: br i1 [[X1]], label [[NO1:%.*]], label [[YES1:%.*]] -; CHECK: yes1: -; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[FALLTHROUGH:%.*]] -; CHECK: no1: -; CHECK-NEXT: call void @f() -; CHECK-NEXT: [[Z1:%.*]] = add i32 [[A]], [[B:%.*]] -; CHECK-NEXT: br label [[FALLTHROUGH]] -; CHECK: fallthrough: -; CHECK-NEXT: [[Z2:%.*]] = phi i32 [ [[Z1]], [[NO1]] ], [ 0, [[YES1]] ] -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B]], 0 -; CHECK-NEXT: br i1 [[X2]], label [[NO2:%.*]], label [[YES2:%.*]] -; CHECK: yes2: -; CHECK-NEXT: store i32 1, i32* [[P]], align 4 -; CHECK-NEXT: br label [[END:%.*]] -; CHECK: no2: -; CHECK-NEXT: call void @f() -; CHECK-NEXT: [[Z3:%.*]] = sub i32 [[Z2]], [[B]] -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: [[Z4:%.*]] = phi i32 [ [[Z3]], [[NO2]] ], [ 3, [[YES2]] ] -; CHECK-NEXT: ret i32 [[Z4]] -; -entry: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %no1, label %yes1 - -yes1: - store i32 0, i32* %p - br label %fallthrough - -no1: - call void @f() - %z1 = add i32 %a, %b - br label %fallthrough - -fallthrough: - %z2 = phi i32 [ %z1, %no1 ], [ 0, %yes1 ] - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %no2, label %yes2 - -yes2: - store i32 1, i32* %p - br label %end - -no2: - call void @f() - %z3 = sub i32 %z2, %b - br label %end - -end: - %z4 = phi i32 [ %z3, %no2 ], [ 3, %yes2 ] - ret i32 %z4 -} - -; This test has an outer if over the two triangles. This requires creating a new BB to hold the store. -define void @test_outer_if(i32* %p, i32 %a, i32 %b, i32 %c) { -; CHECK-LABEL: @test_outer_if( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X3:%.*]] = icmp eq i32 [[C:%.*]], 0 -; CHECK-NEXT: br i1 [[X3]], label [[END:%.*]], label [[CONTINUE:%.*]] -; CHECK: continue: -; CHECK-NEXT: [[X1:%.*]] = icmp ne i32 [[A:%.*]], 0 -; CHECK-NEXT: [[X2:%.*]] = icmp eq i32 [[B:%.*]], 0 -; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X2]], true -; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[X1]], [[TMP0]] -; CHECK-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[END]] -; CHECK: [[NOT_X2:%.*]] = xor i1 [[X2]], true -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[NOT_X2]] to i32 -; CHECK-NEXT: store i32 [[SPEC_SELECT]], i32* [[P:%.*]], align 4 -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: ret void -; -entry: - %x3 = icmp eq i32 %c, 0 - br i1 %x3, label %end, label %continue -continue: - %x1 = icmp eq i32 %a, 0 - br i1 %x1, label %fallthrough, label %yes1 -yes1: - store i32 0, i32* %p - br label %fallthrough - fallthrough: - %x2 = icmp eq i32 %b, 0 - br i1 %x2, label %end, label %yes2 -yes2: - store i32 1, i32* %p - br label %end -end: - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/multiple-phis.ll b/llvm/test/Transforms/SimplifyCFG/multiple-phis.ll deleted file mode 100644 index f8a18a05bab..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/multiple-phis.ll +++ /dev/null @@ -1,59 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -simplifycfg -keep-loops=false -S < %s | FileCheck %s -; RUN: opt -passes='simplify-cfg<no-keep-loops>' -S < %s | FileCheck %s - -; It's not worthwhile to if-convert one of the phi nodes and leave -; the other behind, because that still requires a branch. If -; SimplifyCFG if-converts one of the phis, it should do both. - -define i32 @upper_bound(i32* %r, i32 %high, i32 %k) nounwind { -; CHECK-LABEL: @upper_bound( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[WHILE_COND:%.*]] -; CHECK: while.cond: -; CHECK-NEXT: [[HIGH_ADDR_0:%.*]] = phi i32 [ [[HIGH:%.*]], [[ENTRY:%.*]] ], [ [[DIV_HIGH_ADDR_0:%.*]], [[WHILE_BODY:%.*]] ] -; CHECK-NEXT: [[LOW_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[LOW_0_ADD2:%.*]], [[WHILE_BODY]] ] -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LOW_0]], [[HIGH_ADDR_0]] -; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_BODY]], label [[WHILE_END:%.*]] -; CHECK: while.body: -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[LOW_0]], [[HIGH_ADDR_0]] -; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], 2 -; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[DIV]] to i64 -; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[R:%.*]], i64 [[IDXPROM]] -; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[K:%.*]], [[TMP0]] -; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[DIV]], 1 -; CHECK-NEXT: [[DIV_HIGH_ADDR_0]] = select i1 [[CMP1]], i32 [[DIV]], i32 [[HIGH_ADDR_0]] -; CHECK-NEXT: [[LOW_0_ADD2]] = select i1 [[CMP1]], i32 [[LOW_0]], i32 [[ADD2]] -; CHECK-NEXT: br label [[WHILE_COND]] -; CHECK: while.end: -; CHECK-NEXT: ret i32 [[LOW_0]] -; -entry: - br label %while.cond - -while.cond: ; preds = %if.then, %if.else, %entry - %high.addr.0 = phi i32 [ %high, %entry ], [ %div, %if.then ], [ %high.addr.0, %if.else ] - %low.0 = phi i32 [ 0, %entry ], [ %low.0, %if.then ], [ %add2, %if.else ] - %cmp = icmp ult i32 %low.0, %high.addr.0 - br i1 %cmp, label %while.body, label %while.end - -while.body: ; preds = %while.cond - %add = add i32 %low.0, %high.addr.0 - %div = udiv i32 %add, 2 - %idxprom = zext i32 %div to i64 - %arrayidx = getelementptr inbounds i32, i32* %r, i64 %idxprom - %0 = load i32, i32* %arrayidx - %cmp1 = icmp ult i32 %k, %0 - br i1 %cmp1, label %if.then, label %if.else - -if.then: ; preds = %while.body - br label %while.cond - -if.else: ; preds = %while.body - %add2 = add i32 %div, 1 - br label %while.cond - -while.end: ; preds = %while.cond - ret i32 %low.0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/no-md-sink.ll b/llvm/test/Transforms/SimplifyCFG/no-md-sink.ll deleted file mode 100644 index 62d87112ea1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/no-md-sink.ll +++ /dev/null @@ -1,52 +0,0 @@ -; RUN: opt < %s -simplifycfg -sink-common-insts -S | FileCheck %s -; RUN: opt < %s -passes='simplify-cfg<sink-common-insts>' -S | FileCheck %s - -define i1 @test1(i1 zeroext %flag, i8* %y) #0 { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %r = call i1 @llvm.type.test(i8* %y, metadata !0) - br label %if.end - -if.else: - %s = call i1 @llvm.type.test(i8* %y, metadata !1) - br label %if.end - -if.end: - %t = phi i1 [ %s, %if.else ], [ %r, %if.then ] - ret i1 %t -} - -!0 = !{i32 0, !"typeid1"} -!1 = !{i32 4, !"typeid1"} - -declare i1 @llvm.type.test(i8* %ptr, metadata %bitset) nounwind readnone - -; CHECK-LABEL: test1 -; CHECK: @llvm.type.test -; CHECK: @llvm.type.test -; CHECK: ret i1 - -define i1 @test2(i1 zeroext %flag, i8* %y, i8* %z) #0 { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %r = call i1 @llvm.type.test(i8* %y, metadata !0) - br label %if.end - -if.else: - %s = call i1 @llvm.type.test(i8* %z, metadata !0) - br label %if.end - -if.end: - %t = phi i1 [ %s, %if.else ], [ %r, %if.then ] - ret i1 %t -} - -; CHECK-LABEL: test2 -; CHECK: %[[S:[a-z0-9.]+]] = select i1 %flag, i8* %y, i8* %z -; CHECK: %[[R:[a-z0-9.]+]] = call i1 @llvm.type.test(i8* %[[S]], metadata !0) -; CHECK: ret i1 %[[R]] - diff --git a/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll b/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll deleted file mode 100644 index dfd0d71a010..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll +++ /dev/null @@ -1,59 +0,0 @@ -; RUN: opt -simplifycfg -S %s | FileCheck %s -; Make sure we don't speculate loads under AddressSanitizer. -@g = global i32 0, align 4 - -define i32 @TestNoAsan(i32 %cond) nounwind readonly uwtable { -entry: - %tobool = icmp eq i32 %cond, 0 - br i1 %tobool, label %return, label %if.then - -if.then: ; preds = %entry - %0 = load i32, i32* @g, align 4 - br label %return - -return: ; preds = %entry, %if.then - %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] - ret i32 %retval -; CHECK-LABEL: @TestNoAsan -; CHECK: %[[LOAD:[^ ]*]] = load -; CHECK: select{{.*}}[[LOAD]] -; CHECK: ret i32 -} - -define i32 @TestAsan(i32 %cond) nounwind readonly uwtable sanitize_address { -entry: - %tobool = icmp eq i32 %cond, 0 - br i1 %tobool, label %return, label %if.then - -if.then: ; preds = %entry - %0 = load i32, i32* @g, align 4 - br label %return - -return: ; preds = %entry, %if.then - %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] - ret i32 %retval -; CHECK-LABEL: @TestAsan -; CHECK: br i1 -; CHECK: load i32, i32* @g -; CHECK: br label -; CHECK: ret i32 -} - -define i32 @TestHWAsan(i32 %cond) nounwind readonly uwtable sanitize_hwaddress { -entry: - %tobool = icmp eq i32 %cond, 0 - br i1 %tobool, label %return, label %if.then - -if.then: ; preds = %entry - %0 = load i32, i32* @g, align 4 - br label %return - -return: ; preds = %entry, %if.then - %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] - ret i32 %retval -; CHECK-LABEL: @TestHWAsan -; CHECK: br i1 -; CHECK: load i32, i32* @g -; CHECK: br label -; CHECK: ret i32 -} diff --git a/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_tsan.ll b/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_tsan.ll deleted file mode 100644 index 4792e9565b2..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_tsan.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt -simplifycfg -S %s | FileCheck %s -; Make sure we don't speculate loads under ThreadSanitizer. -@g = global i32 0, align 4 - -define i32 @TestNoTsan(i32 %cond) nounwind readonly uwtable { -entry: - %tobool = icmp eq i32 %cond, 0 - br i1 %tobool, label %return, label %if.then - -if.then: ; preds = %entry - %0 = load i32, i32* @g, align 4 - br label %return - -return: ; preds = %entry, %if.then - %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] - ret i32 %retval -; CHECK-LABEL: @TestNoTsan -; CHECK: %[[LOAD:[^ ]*]] = load -; CHECK: select{{.*}}[[LOAD]] -; CHECK: ret i32 -} - -define i32 @TestTsan(i32 %cond) nounwind readonly uwtable sanitize_thread { -entry: - %tobool = icmp eq i32 %cond, 0 - br i1 %tobool, label %return, label %if.then - -if.then: ; preds = %entry - %0 = load i32, i32* @g, align 4 - br label %return - -return: ; preds = %entry, %if.then - %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] - ret i32 %retval -; CHECK-LABEL: @TestTsan -; CHECK: br i1 -; CHECK: load i32, i32* @g -; CHECK: br label -; CHECK: ret i32 -} diff --git a/llvm/test/Transforms/SimplifyCFG/noreturn-call.ll b/llvm/test/Transforms/SimplifyCFG/noreturn-call.ll deleted file mode 100644 index 88d4f85713b..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/noreturn-call.ll +++ /dev/null @@ -1,29 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; PR1796 - -declare void @Finisher(i32) noreturn - -; Make sure we optimize a sequence of two calls (second unreachable); -define void @double_call(i32) { -; CHECK-LABEL: @double_call( -; CHECK-NEXT: tail call void @Finisher(i32 %0) #0 -; CHECK-NEXT: unreachable -; - tail call void @Finisher(i32 %0) noreturn - tail call void @Finisher(i32 %0) noreturn - ret void -} - -; Make sure we DON'T try to optimize a musttail call (the IR invariant -; is that it must be followed by [optional bitcast then] ret). -define void @must_tail(i32) { -; CHECK-LABEL: @must_tail( -; CHECK-NEXT: musttail call void @Finisher(i32 %0) #0 -; CHECK-NEXT: ret void -; - musttail call void @Finisher(i32 %0) #0 - ret void -} - -; CHECK: attributes #0 = { noreturn } -attributes #0 = { noreturn } diff --git a/llvm/test/Transforms/SimplifyCFG/opt-for-fuzzing.ll b/llvm/test/Transforms/SimplifyCFG/opt-for-fuzzing.ll deleted file mode 100644 index 429f4a3f854..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/opt-for-fuzzing.ll +++ /dev/null @@ -1,49 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define i32 @foo(i32 %x) optforfuzzing { -entry: - %x.addr = alloca i32, align 4 - store i32 %x, i32* %x.addr, align 4 - %0 = load i32, i32* %x.addr, align 4 - %cmp = icmp sgt i32 %0, 16 - br i1 %cmp, label %land.rhs, label %land.end - -land.rhs: - %1 = load i32, i32* %x.addr, align 4 - %cmp1 = icmp slt i32 %1, 32 - br label %land.end - -land.end: - %2 = phi i1 [ false, %entry ], [ %cmp1, %land.rhs ] - %conv = zext i1 %2 to i32 - ret i32 %conv - -; CHECK-LABEL: define i32 @foo(i32 %x) -; CHECK: br i1 %cmp, label %land.rhs, label %land.end -; CHECK-LABEL: land.rhs: -; CHECK: br label %land.end -; CHECK-LABEL: land.end: -; CHECK: phi {{.*}} %entry {{.*}} %land.rhs -} - -define i32 @bar(i32 %x) { -entry: - %x.addr = alloca i32, align 4 - store i32 %x, i32* %x.addr, align 4 - %0 = load i32, i32* %x.addr, align 4 - %cmp = icmp sgt i32 %0, 16 - br i1 %cmp, label %land.rhs, label %land.end - -land.rhs: - %1 = load i32, i32* %x.addr, align 4 - %cmp1 = icmp slt i32 %1, 32 - br label %land.end - -land.end: - %2 = phi i1 [ false, %entry ], [ %cmp1, %land.rhs ] - %conv = zext i1 %2 to i32 - ret i32 %conv - -; CHECK-LABEL: define i32 @bar(i32 %x) -; CHECK-NOT: br -} diff --git a/llvm/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll b/llvm/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll deleted file mode 100644 index e7e9e727346..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll +++ /dev/null @@ -1,239 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -declare void @bar() nounwind - -define i32 @test1(i32* %a, i32 %b, i32* %c, i32 %d) nounwind { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ %c, %if.then4 ], [ null, %if.else ] - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 - -; CHECK-LABEL: @test1( -; CHECK: if.else: -; CHECK: br label %if.end7 - -; CHECK: phi i32* [ %a, %if.then ], [ %c, %if.else ] -} - -define i32 @test1_no_null_opt(i32* %a, i32 %b, i32* %c, i32 %d) nounwind #0 { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ %c, %if.then4 ], [ null, %if.else ] - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 - -; CHECK-LABEL: @test1_no_null_opt( -; CHECK: if.then: -; CHECK: if.else: -; CHECK: if.then4: -; CHECK: br label %if.end7 -; CHECK: if.end7: -; CHECK-NEXT: phi i32* [ %a, %if.then ], [ %c, %if.then4 ], [ null, %if.else ] -} - -define i32 @test2(i32* %a, i32 %b, i32* %c, i32 %d) nounwind { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 -; CHECK-LABEL: @test2( -; CHECK: if.else: -; CHECK: unreachable - -; CHECK-NOT: phi -} - -define i32 @test2_no_null_opt(i32* %a, i32 %b, i32* %c, i32 %d) nounwind #0 { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 -; CHECK-LABEL: @test2_no_null_opt( -; CHECK: if.then: -; CHECK: if.else: -; CHECK: if.then4: -; CHECK: if.end7: -; CHECK-NEXT: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] -} - -define i32 @test3(i32* %a, i32 %b, i32* %c, i32 %d) nounwind { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - tail call void @bar() nounwind - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 -; CHECK-LABEL: @test3( -; CHECK: if.end7: -; CHECK: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] -} - -define i32 @test3_no_null_opt(i32* %a, i32 %b, i32* %c, i32 %d) nounwind #0 { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - tail call void @bar() nounwind - %tmp9 = load i32, i32* %x.0 - ret i32 %tmp9 -; CHECK-LABEL: @test3_no_null_opt( -; CHECK: if.then: -; CHECK: if.else: -; CHECK: if.then4: -; CHECK: if.end7: -; CHECK-NEXT: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] -} - -define i32 @test4(i32* %a, i32 %b, i32* %c, i32 %d) nounwind { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - %gep = getelementptr i32, i32* %x.0, i32 10 - %tmp9 = load i32, i32* %gep - %tmp10 = or i32 %tmp9, 1 - store i32 %tmp10, i32* %gep - ret i32 %tmp9 -; CHECK-LABEL: @test4( -; CHECK-NOT: phi -} - -define i32 @test4_no_null_opt(i32* %a, i32 %b, i32* %c, i32 %d) nounwind #0 { -entry: - %tobool = icmp eq i32 %b, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: ; preds = %entry - tail call void @bar() nounwind - br label %if.end7 - -if.else: ; preds = %entry - %tobool3 = icmp eq i32 %d, 0 - br i1 %tobool3, label %if.end7, label %if.then4 - -if.then4: ; preds = %if.else - tail call void @bar() nounwind - br label %if.end7 - -if.end7: ; preds = %if.else, %if.then4, %if.then - %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] - %gep = getelementptr i32, i32* %x.0, i32 10 - %tmp9 = load i32, i32* %gep - %tmp10 = or i32 %tmp9, 1 - store i32 %tmp10, i32* %gep - ret i32 %tmp9 -; CHECK-LABEL: @test4_no_null_opt( -; CHECK: if.then: -; CHECK: if.else: -; CHECK: if.then4: -; CHECK: if.end7: -; CHECK-NEXT: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ] -} - -attributes #0 = { "null-pointer-is-valid"="true" } diff --git a/llvm/test/Transforms/SimplifyCFG/pr33605.ll b/llvm/test/Transforms/SimplifyCFG/pr33605.ll deleted file mode 100644 index 963b1599126..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/pr33605.ll +++ /dev/null @@ -1,64 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Skip simplifying unconditional branches from empty blocks in simplifyCFG, -; when it can destroy canonical loop structure. - -; void foo(); -; bool test(int a, int b, int *c) { -; bool changed = false; -; for (unsigned int i = 2; i--;) { -; int r = a | b; -; if ( r != c[i]) { -; c[i] = r; -; foo(); -; changed = true; -; } -; } -; return changed; -; } - -; CHECK-LABEL: @test( -; CHECK: for.cond: -; CHECK-NEXT: %i.0 = phi i32 [ 2, %entry ], [ %dec, %if.end ] -; CHECK: for.body: -; CHECK: br i1 %cmp, label %if.end, label %if.then -; CHECK-NOT: br i1 %cmp, label %for.cond, label %if.then -; CHECK: if.then: -; CHECK: br label %if.end -; CHECK-NOT: br label %for.cond -; CHECK: if.end: -; CHECK br label %for.cond -define i1 @test(i32 %a, i32 %b, i32* %c) { -entry: - br label %for.cond - -for.cond: ; preds = %if.end, %entry - %i.0 = phi i32 [ 2, %entry ], [ %dec, %if.end ] - %changed.0.off0 = phi i1 [ false, %entry ], [ %changed.1.off0, %if.end ] - %dec = add nsw i32 %i.0, -1 - %tobool = icmp eq i32 %i.0, 0 - br i1 %tobool, label %for.cond.cleanup, label %for.body - -for.cond.cleanup: ; preds = %for.cond - %changed.0.off0.lcssa = phi i1 [ %changed.0.off0, %for.cond ] - ret i1 %changed.0.off0.lcssa - -for.body: ; preds = %for.cond - %or = or i32 %a, %b - %idxprom = sext i32 %dec to i64 - %arrayidx = getelementptr inbounds i32, i32* %c, i64 %idxprom - %0 = load i32, i32* %arrayidx, align 4 - %cmp = icmp eq i32 %or, %0 - br i1 %cmp, label %if.end, label %if.then - -if.then: ; preds = %for.body - store i32 %or, i32* %arrayidx, align 4 - call void @foo() - br label %if.end - -if.end: ; preds = %for.body, %if.then - %changed.1.off0 = phi i1 [ true, %if.then ], [ %changed.0.off0, %for.body ] - br label %for.cond -} - -declare void @foo() diff --git a/llvm/test/Transforms/SimplifyCFG/pr34131.ll b/llvm/test/Transforms/SimplifyCFG/pr34131.ll deleted file mode 100644 index b64b6876e04..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/pr34131.ll +++ /dev/null @@ -1,74 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -; Just checking for lack of crash here, but we should be able to check the IR? -; Earlier version using auto-generated checks from utils/update_test_checks.py -; had bot problems though... - -define void @patatino() { - -; CHECK-LABEL: @patatino - - br label %bb1 -bb1: ; preds = %bb36, %0 - br label %bb2 -bb2: ; preds = %bb3, %bb1 - br i1 undef, label %bb4, label %bb3 -bb3: ; preds = %bb4, %bb2 - br i1 undef, label %bb2, label %bb5 -bb4: ; preds = %bb2 - switch i32 undef, label %bb3 [ - ] -bb5: ; preds = %bb3 - br label %bb6 -bb6: ; preds = %bb5 - br i1 undef, label %bb7, label %bb9 -bb7: ; preds = %bb6 - %tmp = or i64 undef, 1 - %tmp8 = icmp ult i64 %tmp, 0 - br i1 %tmp8, label %bb12, label %bb9 -bb9: ; preds = %bb35, %bb34, %bb33, %bb32, %bb31, %bb30, %bb27, %bb24, %bb21, %bb18, %bb16, %bb14, %bb12, %bb7, %bb6 - br label %bb11 -bb10: ; preds = %bb36 - br label %bb11 -bb11: ; preds = %bb10, %bb9 - ret void -bb12: ; preds = %bb7 - %tmp13 = icmp ult i64 0, 0 - br i1 %tmp13, label %bb14, label %bb9 -bb14: ; preds = %bb12 - %tmp15 = icmp ult i64 undef, 0 - br i1 %tmp15, label %bb16, label %bb9 -bb16: ; preds = %bb14 - %tmp17 = icmp ult i64 undef, 0 - br i1 %tmp17, label %bb18, label %bb9 -bb18: ; preds = %bb16 - %tmp19 = or i64 undef, 5 - %tmp20 = icmp ult i64 %tmp19, 0 - br i1 %tmp20, label %bb21, label %bb9 -bb21: ; preds = %bb18 - %tmp22 = or i64 undef, 6 - %tmp23 = icmp ult i64 %tmp22, 0 - br i1 %tmp23, label %bb24, label %bb9 -bb24: ; preds = %bb21 - %tmp25 = or i64 undef, 7 - %tmp26 = icmp ult i64 %tmp25, 0 - br i1 %tmp26, label %bb27, label %bb9 -bb27: ; preds = %bb24 - %tmp28 = or i64 undef, 8 - %tmp29 = icmp ult i64 %tmp28, 0 - br i1 %tmp29, label %bb30, label %bb9 -bb30: ; preds = %bb27 - br i1 undef, label %bb31, label %bb9 -bb31: ; preds = %bb30 - br i1 undef, label %bb32, label %bb9 -bb32: ; preds = %bb31 - br i1 undef, label %bb33, label %bb9 -bb33: ; preds = %bb32 - br i1 undef, label %bb34, label %bb9 -bb34: ; preds = %bb33 - br i1 undef, label %bb35, label %bb9 -bb35: ; preds = %bb34 - br i1 undef, label %bb36, label %bb9 -bb36: ; preds = %bb35 - br i1 undef, label %bb1, label %bb10 -} diff --git a/llvm/test/Transforms/SimplifyCFG/pr35774.ll b/llvm/test/Transforms/SimplifyCFG/pr35774.ll deleted file mode 100644 index 149252085d5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/pr35774.ll +++ /dev/null @@ -1,35 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -simplifycfg -S %s | FileCheck %s - -%foo = type { i32 (%foo)*, i32 } - -declare i32 @putchar(i32) - -define i32 @intercept(%foo %f) { -; CHECK-LABEL: @intercept( -; CHECK-NEXT: [[FN:%.*]] = extractvalue [[FOO:%.*]] %f, 0 -; CHECK-NEXT: [[X:%.*]] = extractvalue [[FOO]] %f, 1 -; CHECK-NEXT: [[X0:%.*]] = icmp eq i32 [[X]], 0 -; CHECK-NEXT: br i1 [[X0]], label [[ZERO:%.*]], label [[NONZERO:%.*]] -; CHECK: Zero: -; CHECK-NEXT: [[R0:%.*]] = musttail call i32 [[FN]](%foo [[F:%.*]]) -; CHECK-NEXT: ret i32 [[R0]] -; CHECK: Nonzero: -; CHECK-NEXT: [[R1:%.*]] = tail call i32 [[FN]](%foo [[F]]) -; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @putchar(i32 [[R1]]) -; CHECK-NEXT: ret i32 [[R1]] -; - %fn = extractvalue %foo %f, 0 - %x = extractvalue %foo %f, 1 - %x0 = icmp eq i32 %x, 0 - br i1 %x0, label %Zero, label %Nonzero - -Zero: - %r0 = musttail call i32 %fn(%foo %f) - ret i32 %r0 - -Nonzero: - %r1 = tail call i32 %fn(%foo %f) - %1 = tail call i32 @putchar(i32 %r1) - ret i32 %r1 -} diff --git a/llvm/test/Transforms/SimplifyCFG/pr39807.ll b/llvm/test/Transforms/SimplifyCFG/pr39807.ll deleted file mode 100644 index 8148f79503c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/pr39807.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -declare void @personality() - -define void @test(i1 %b) personality void()* @personality !dbg !1 { -; CHECK: invoke void @inlinable() -; CHECK-NEXT: to label %success unwind label %failure, !dbg ![[DBGLOC:[0-9]+]] - br i1 %b, label %if, label %else - -if: - invoke void @inlinable() - to label %success unwind label %failure, !dbg !2 - -else: - invoke void @inlinable() - to label %success unwind label %failure, !dbg !8 - -success: - ret void - -failure: - landingpad {} - cleanup - ret void -} - -define internal void @inlinable() !dbg !7 { - ret void -} - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!4, !5, !6} - -; CHECK: ![[DBGLOC]] = !DILocation(line: 0 -!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, runtimeVersion: 0, file: !3) -!1 = distinct !DISubprogram(name: "test", unit: !0) -!2 = !DILocation(line: 2, scope: !1) -!3 = !DIFile(filename: "foo", directory: ".") -!4 = !{i32 2, !"Dwarf Version", i32 4} -!5 = !{i32 2, !"Debug Info Version", i32 3} -!6 = !{i32 1, !"wchar_size", i32 4} -!7 = distinct !DISubprogram(name: "inlinable", unit: !0) -!8 = !DILocation(line: 3, scope: !1) diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll b/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll deleted file mode 100644 index b2b384112af..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll +++ /dev/null @@ -1,37 +0,0 @@ -; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s - -; This test case was written to trigger an incorrect assert statement in -; -simplifycfg. Thus we don't actually want to check the output, just that -; -simplifycfg ran successfully. Thus we only check that the function still -; exists, and that it still calls foo(). -; -; NOTE: There are some obviously dead blocks and missing branch weight -; metadata. Both of these features were key to triggering the assert. -; Additionally, the not-taken weight of the branch with a weight had to -; be 0 to trigger the assert. - -declare void @foo() nounwind uwtable - -define void @func(i32 %A) nounwind uwtable { -; CHECK-LABEL: define void @func( -entry: - %cmp11 = icmp eq i32 %A, 1 - br i1 %cmp11, label %if.then, label %if.else, !prof !0 - -if.then: - call void @foo() -; CHECK: call void @foo() - br label %if.else - -if.else: - %cmp17 = icmp eq i32 %A, 2 - br i1 %cmp17, label %if.then2, label %if.end - -if.then2: - br label %if.end - -if.end: - ret void -} - -!0 = !{!"branch_weights", i32 1, i32 0} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-switch-create.ll b/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-switch-create.ll deleted file mode 100644 index 32a30c3cab4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-switch-create.ll +++ /dev/null @@ -1,140 +0,0 @@ -; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s - -declare void @func2(i32) -declare void @func4(i32) -declare void @func6(i32) -declare void @func8(i32) - -;; test1 - create a switch with case 2 and case 4 from two branches: N == 2 -;; and N == 4. -define void @test1(i32 %N) nounwind uwtable { -entry: - %cmp = icmp eq i32 %N, 2 - br i1 %cmp, label %if.then, label %if.else, !prof !0 -; CHECK: test1 -; CHECK: switch i32 %N -; CHECK: ], !prof !0 - -if.then: - call void @func2(i32 %N) nounwind - br label %if.end9 - -if.else: - %cmp2 = icmp eq i32 %N, 4 - br i1 %cmp2, label %if.then7, label %if.else8, !prof !1 - -if.then7: - call void @func4(i32 %N) nounwind - br label %if.end - -if.else8: - call void @func8(i32 %N) nounwind - br label %if.end - -if.end: - br label %if.end9 - -if.end9: - ret void -} - -;; test2 - Merge two switches where PredDefault == BB. -define void @test2(i32 %M, i32 %N) nounwind uwtable { -entry: - %cmp = icmp sgt i32 %M, 2 - br i1 %cmp, label %sw1, label %sw2 - -sw1: - switch i32 %N, label %sw2 [ - i32 2, label %sw.bb - i32 3, label %sw.bb1 - ], !prof !2 -; CHECK: test2 -; CHECK: switch i32 %N, label %sw.epilog -; CHECK: i32 2, label %sw.bb -; CHECK: i32 3, label %sw.bb1 -; CHECK: i32 4, label %sw.bb5 -; CHECK: ], !prof !1 - -sw.bb: - call void @func2(i32 %N) nounwind - br label %sw.epilog - -sw.bb1: - call void @func4(i32 %N) nounwind - br label %sw.epilog - -sw2: -;; Here "case 2" is invalidated if control is transferred through default case -;; of the first switch. - switch i32 %N, label %sw.epilog [ - i32 2, label %sw.bb4 - i32 4, label %sw.bb5 - ], !prof !3 - -sw.bb4: - call void @func6(i32 %N) nounwind - br label %sw.epilog - -sw.bb5: - call void @func8(i32 %N) nounwind - br label %sw.epilog - -sw.epilog: - ret void -} - -;; test3 - Merge two switches where PredDefault != BB. -define void @test3(i32 %M, i32 %N) nounwind uwtable { -entry: - %cmp = icmp sgt i32 %M, 2 - br i1 %cmp, label %sw1, label %sw2 - -sw1: - switch i32 %N, label %sw.bb [ - i32 2, label %sw2 - i32 3, label %sw2 - i32 1, label %sw.bb1 - ], !prof !4 -; CHECK: test3 -; CHECK: switch i32 %N, label %sw.bb -; CHECK: i32 1, label %sw.bb1 -; CHECK: i32 3, label %sw.bb4 -; CHECK: i32 2, label %sw.epilog -; CHECK: ], !prof !3 - -sw.bb: - call void @func2(i32 %N) nounwind - br label %sw.epilog - -sw.bb1: - call void @func4(i32 %N) nounwind - br label %sw.epilog - -sw2: - switch i32 %N, label %sw.epilog [ - i32 3, label %sw.bb4 - i32 4, label %sw.bb5 - ], !prof !5 - -sw.bb4: - call void @func6(i32 %N) nounwind - br label %sw.epilog - -sw.bb5: - call void @func8(i32 %N) nounwind - br label %sw.epilog - -sw.epilog: - ret void -} - -!0 = !{!"branch_weights", i32 64, i32 4} -!1 = !{!"branch_weights", i32 4, i32 64} -; CHECK: !0 = !{!"branch_weights", i32 256, i32 4352, i32 16} -!2 = !{!"branch_weights", i32 4, i32 4, i32 8} -!3 = !{!"branch_weights", i32 8, i32 8, i32 4} -; CHECK: !1 = !{!"branch_weights", i32 32, i32 48, i32 96, i32 16} -!4 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 3} -!5 = !{!"branch_weights", i32 17, i32 13, i32 9} -; CHECK: !3 = !{!"branch_weights", i32 7, i32 3, i32 4, i32 6} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll b/llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll deleted file mode 100644 index 66a34bab3e5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll +++ /dev/null @@ -1,675 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s - -declare void @helper(i32) - -define void @test1(i1 %a, i1 %b) { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A_NOT]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !0 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %Y, label %X, !prof !0 - -X: - %c = or i1 %b, false - br i1 %c, label %Z, label %Y, !prof !1 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -; Make sure the metadata name string is "branch_weights" before propagating it. - -define void @fake_weights(i1 %a, i1 %b) { -; CHECK-LABEL: @fake_weights( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A_NOT]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %Y, label %X, !prof !12 -X: - %c = or i1 %b, false - br i1 %c, label %Z, label %Y, !prof !1 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -define void @test2(i1 %a, i1 %b) { -; CHECK-LABEL: @test2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !2 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %X, label %Y, !prof !1 - -X: - %c = or i1 %b, false - br i1 %c, label %Z, label %Y, !prof !2 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -define void @test3(i1 %a, i1 %b) { -; CHECK-LABEL: @test3( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %X, label %Y, !prof !1 - -X: - %c = or i1 %b, false - br i1 %c, label %Z, label %Y - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -define void @test4(i1 %a, i1 %b) { -; CHECK-LABEL: @test4( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %X, label %Y - -X: - %c = or i1 %b, false - br i1 %c, label %Z, label %Y, !prof !1 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -;; test5 - The case where it jumps to the default target will be removed. -define void @test5(i32 %M, i32 %N) nounwind uwtable { -; CHECK-LABEL: @test5( -; CHECK-NEXT: entry: -; CHECK-NEXT: switch i32 [[N:%.*]], label [[SW2:%.*]] [ -; CHECK-NEXT: i32 3, label [[SW_BB1:%.*]] -; CHECK-NEXT: i32 2, label [[SW_BB:%.*]] -; CHECK-NEXT: ], !prof !3 -; CHECK: sw.bb: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: br label [[SW_EPILOG:%.*]] -; CHECK: sw.bb1: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: br label [[SW_EPILOG]] -; CHECK: sw2: -; CHECK-NEXT: call void @helper(i32 2) -; CHECK-NEXT: br label [[SW_EPILOG]] -; CHECK: sw.epilog: -; CHECK-NEXT: ret void -; -entry: - switch i32 %N, label %sw2 [ - i32 1, label %sw2 - i32 2, label %sw.bb - i32 3, label %sw.bb1 - ], !prof !3 - -sw.bb: - call void @helper(i32 0) - br label %sw.epilog - -sw.bb1: - call void @helper(i32 1) - br label %sw.epilog - -sw2: - call void @helper(i32 2) - br label %sw.epilog - -sw.epilog: - ret void -} - -;; test6 - Some cases of the second switch are pruned during optimization. -;; Then the second switch will be converted to a branch, finally, the first -;; switch and the branch will be merged into a single switch. -define void @test6(i32 %M, i32 %N) nounwind uwtable { -; CHECK-LABEL: @test6( -; CHECK-NEXT: entry: -; CHECK-NEXT: switch i32 [[N:%.*]], label [[SW_EPILOG:%.*]] [ -; CHECK-NEXT: i32 3, label [[SW_BB1:%.*]] -; CHECK-NEXT: i32 2, label [[SW_BB:%.*]] -; CHECK-NEXT: i32 4, label [[SW_BB5:%.*]] -; CHECK-NEXT: ], !prof !4 -; CHECK: sw.bb: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: br label [[SW_EPILOG]] -; CHECK: sw.bb1: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: br label [[SW_EPILOG]] -; CHECK: sw.bb5: -; CHECK-NEXT: call void @helper(i32 3) -; CHECK-NEXT: br label [[SW_EPILOG]] -; CHECK: sw.epilog: -; CHECK-NEXT: ret void -; -entry: - switch i32 %N, label %sw2 [ - i32 1, label %sw2 - i32 2, label %sw.bb - i32 3, label %sw.bb1 - ], !prof !4 - -sw.bb: - call void @helper(i32 0) - br label %sw.epilog - -sw.bb1: - call void @helper(i32 1) - br label %sw.epilog - -sw2: -;; Here "case 2" is invalidated since the default case of the first switch -;; does not include "case 2". - switch i32 %N, label %sw.epilog [ - i32 2, label %sw.bb4 - i32 4, label %sw.bb5 - ], !prof !5 - -sw.bb4: - call void @helper(i32 2) - br label %sw.epilog - -sw.bb5: - call void @helper(i32 3) - br label %sw.epilog - -sw.epilog: - ret void -} - -;; This test is based on test1 but swapped the targets of the second branch. -define void @test1_swap(i1 %a, i1 %b) { -; CHECK-LABEL: @test1_swap( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[A:%.*]], [[C]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[Y:%.*]], label [[Z:%.*]], !prof !5 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - br i1 %a, label %Y, label %X, !prof !0 - -X: - %c = or i1 %b, false - br i1 %c, label %Y, label %Z, !prof !1 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -define void @test7(i1 %a, i1 %b) { -; CHECK-LABEL: @test7( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false -; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[A:%.*]], [[C]] -; CHECK-NEXT: br i1 [[BRMERGE]], label [[Y:%.*]], label [[Z:%.*]], !prof !6 -; CHECK: Y: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; CHECK: Z: -; CHECK-NEXT: call void @helper(i32 1) -; CHECK-NEXT: ret void -; -entry: - %c = or i1 %b, false - br i1 %a, label %Y, label %X, !prof !0 - -X: - br i1 %c, label %Y, label %Z, !prof !6 - -Y: - call void @helper(i32 0) - ret void - -Z: - call void @helper(i32 1) - ret void -} - -; Test basic folding to a conditional branch. -define void @test8(i64 %x, i64 %y) nounwind { -; CHECK-LABEL: @test8( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[LT:%.*]] = icmp slt i64 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: br i1 [[LT]], label [[A:%.*]], label [[B:%.*]], !prof !7 -; CHECK: a: -; CHECK-NEXT: call void @helper(i32 0) #1 -; CHECK-NEXT: ret void -; CHECK: b: -; CHECK-NEXT: call void @helper(i32 1) #1 -; CHECK-NEXT: ret void -; -entry: - %lt = icmp slt i64 %x, %y - %qux = select i1 %lt, i32 0, i32 2 - switch i32 %qux, label %bees [ - i32 0, label %a - i32 1, label %b - i32 2, label %b - ], !prof !7 -a: - call void @helper(i32 0) nounwind - ret void -b: - call void @helper(i32 1) nounwind - ret void -bees: - call void @helper(i32 2) nounwind - ret void -} - -; Test edge splitting when the default target has icmp and unconditinal -; branch -define i1 @test9(i32 %x, i32 %y) nounwind { -; CHECK-LABEL: @test9( -; CHECK-NEXT: entry: -; CHECK-NEXT: switch i32 [[X:%.*]], label [[BEES:%.*]] [ -; CHECK-NEXT: i32 0, label [[A:%.*]] -; CHECK-NEXT: i32 1, label [[END:%.*]] -; CHECK-NEXT: i32 2, label [[END]] -; CHECK-NEXT: i32 92, label [[END]] -; CHECK-NEXT: ], !prof !8 -; CHECK: a: -; CHECK-NEXT: call void @helper(i32 0) #1 -; CHECK-NEXT: [[RETA:%.*]] = icmp slt i32 [[X]], [[Y:%.*]] -; CHECK-NEXT: ret i1 [[RETA]] -; CHECK: bees: -; CHECK-NEXT: br label [[END]] -; CHECK: end: -; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ false, [[BEES]] ], [ true, [[ENTRY]] ], [ true, [[ENTRY]] ] -; CHECK-NEXT: call void @helper(i32 2) #1 -; CHECK-NEXT: ret i1 [[RET]] -; -entry: - switch i32 %x, label %bees [ - i32 0, label %a - i32 1, label %end - i32 2, label %end - ], !prof !7 - -a: - call void @helper(i32 0) nounwind - %reta = icmp slt i32 %x, %y - ret i1 %reta - -bees: - %tmp = icmp eq i32 %x, 92 - br label %end - -end: - %ret = phi i1 [ true, %entry ], [%tmp, %bees], [true, %entry] - call void @helper(i32 2) nounwind - ret i1 %ret -} - -define void @test10(i32 %x) nounwind readnone ssp noredzone { -; CHECK-LABEL: @test10( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -1 -; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 3 -; CHECK-NEXT: br i1 [[SWITCH]], label [[LOR_END:%.*]], label [[LOR_RHS:%.*]], !prof !9 -; CHECK: lor.rhs: -; CHECK-NEXT: call void @helper(i32 1) #1 -; CHECK-NEXT: ret void -; CHECK: lor.end: -; CHECK-NEXT: call void @helper(i32 0) #1 -; CHECK-NEXT: ret void -; -entry: - switch i32 %x, label %lor.rhs [ - i32 2, label %lor.end - i32 1, label %lor.end - i32 3, label %lor.end - ], !prof !7 - -lor.rhs: - call void @helper(i32 1) nounwind - ret void - -lor.end: - call void @helper(i32 0) nounwind - ret void - -} - -; Remove dead cases from the switch. -define void @test11(i32 %x) nounwind { -; CHECK-LABEL: @test11( -; CHECK-NEXT: [[I:%.*]] = shl i32 [[X:%.*]], 1 -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I]], 24 -; CHECK-NEXT: br i1 [[COND]], label [[C:%.*]], label [[A:%.*]], !prof !10 -; CHECK: a: -; CHECK-NEXT: call void @helper(i32 0) #1 -; CHECK-NEXT: ret void -; CHECK: c: -; CHECK-NEXT: call void @helper(i32 2) #1 -; CHECK-NEXT: ret void -; - %i = shl i32 %x, 1 - switch i32 %i, label %a [ - i32 21, label %b - i32 24, label %c - ], !prof !8 - -a: - call void @helper(i32 0) nounwind - ret void -b: - call void @helper(i32 1) nounwind - ret void -c: - call void @helper(i32 2) nounwind - ret void -} - -;; test12 - Don't crash if the whole switch is removed -define void @test12(i32 %M, i32 %N) nounwind uwtable { -; CHECK-LABEL: @test12( -; CHECK-NEXT: entry: -; CHECK-NEXT: call void @helper(i32 0) -; CHECK-NEXT: ret void -; -entry: - switch i32 %N, label %sw.bb [ - i32 1, label %sw.bb - ], !prof !9 - -sw.bb: - call void @helper(i32 0) - br label %sw.epilog - -sw.epilog: - ret void -} - -;; If every case is dead, make sure they are all removed. This used to -;; crash trying to merge the metadata. -define void @test13(i32 %x) nounwind { -; CHECK-LABEL: @test13( -; CHECK-NEXT: entry: -; CHECK-NEXT: call void @helper(i32 0) #1 -; CHECK-NEXT: ret void -; -entry: - %i = shl i32 %x, 1 - switch i32 %i, label %a [ - i32 21, label %b - i32 25, label %c - ], !prof !8 - -a: - call void @helper(i32 0) nounwind - ret void -b: - call void @helper(i32 1) nounwind - ret void -c: - call void @helper(i32 2) nounwind - ret void -} - -;; When folding branches to common destination, the updated branch weights -;; can exceed uint32 by more than factor of 2. We should keep halving the -;; weights until they can fit into uint32. -@max_regno = common global i32 0, align 4 -define void @test14(i32* %old, i32 %final) { -; CHECK-LABEL: @test14( -; CHECK-NEXT: for.cond: -; CHECK-NEXT: br label [[FOR_COND2:%.*]] -; CHECK: for.cond2: -; CHECK-NEXT: [[I_1:%.*]] = phi i32 [ [[INC19:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_COND:%.*]] ] -; CHECK-NEXT: [[BIT_0:%.*]] = phi i32 [ [[SHL:%.*]], [[FOR_INC]] ], [ 1, [[FOR_COND]] ] -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[BIT_0]], 0 -; CHECK-NEXT: [[V3:%.*]] = load i32, i32* @max_regno, align 4 -; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[I_1]], [[V3]] -; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[TOBOOL]], [[CMP4]] -; CHECK-NEXT: br i1 [[OR_COND]], label [[FOR_EXIT:%.*]], label [[FOR_INC]], !prof !11 -; CHECK: for.inc: -; CHECK-NEXT: [[SHL]] = shl i32 [[BIT_0]], 1 -; CHECK-NEXT: [[INC19]] = add nsw i32 [[I_1]], 1 -; CHECK-NEXT: br label [[FOR_COND2]] -; CHECK: for.exit: -; CHECK-NEXT: ret void -; -for.cond: - br label %for.cond2 -for.cond2: - %i.1 = phi i32 [ %inc19, %for.inc ], [ 0, %for.cond ] - %bit.0 = phi i32 [ %shl, %for.inc ], [ 1, %for.cond ] - %tobool = icmp eq i32 %bit.0, 0 - br i1 %tobool, label %for.exit, label %for.body3, !prof !10 -for.body3: - %v3 = load i32, i32* @max_regno, align 4 - %cmp4 = icmp eq i32 %i.1, %v3 - br i1 %cmp4, label %for.exit, label %for.inc, !prof !11 -for.inc: - %shl = shl i32 %bit.0, 1 - %inc19 = add nsw i32 %i.1, 1 - br label %for.cond2 -for.exit: - ret void -} - -; Don't drop the metadata. - -define i32 @HoistThenElseCodeToIf(i32 %n) { -; CHECK-LABEL: @HoistThenElseCodeToIf( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[N:%.*]], 0 -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL]], i32 1, i32 234, !prof !12 -; CHECK-NEXT: ret i32 [[DOT]] -; -entry: - %tobool = icmp eq i32 %n, 0 - br i1 %tobool, label %if, label %else, !prof !0 - -if: - br label %return - -else: - br label %return - -return: - %retval.0 = phi i32 [ 1, %if ], [ 234, %else ] - ret i32 %retval.0 -} - -; The selects should have freshly calculated branch weights. - -define i32 @SimplifyCondBranchToCondBranch(i1 %cmpa, i1 %cmpb) { -; CHECK-LABEL: @SimplifyCondBranchToCondBranch( -; CHECK-NEXT: block1: -; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA:%.*]], [[CMPB:%.*]] -; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA]], i32 0, i32 2, !prof !13 -; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !14 -; CHECK-NEXT: ret i32 [[OUTVAL]] -; -block1: - br i1 %cmpa, label %block3, label %block2, !prof !13 - -block2: - br i1 %cmpb, label %block3, label %exit, !prof !14 - -block3: - %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] - br label %exit - -exit: - %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] - ret i32 %outval -} - -; Swap the operands of the compares to verify that the weights update correctly. - -define i32 @SimplifyCondBranchToCondBranchSwap(i1 %cmpa, i1 %cmpb) { -; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwap( -; CHECK-NEXT: block1: -; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 [[CMPA:%.*]], true -; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 [[CMPB:%.*]], true -; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]] -; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !15 -; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !16 -; CHECK-NEXT: ret i32 [[OUTVAL]] -; -block1: - br i1 %cmpa, label %block2, label %block3, !prof !13 - -block2: - br i1 %cmpb, label %exit, label %block3, !prof !14 - -block3: - %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] - br label %exit - -exit: - %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] - ret i32 %outval -} - -define i32 @SimplifyCondBranchToCondBranchSwapMissingWeight(i1 %cmpa, i1 %cmpb) { -; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwapMissingWeight( -; CHECK-NEXT: block1: -; CHECK-NEXT: [[CMPA_NOT:%.*]] = xor i1 [[CMPA:%.*]], true -; CHECK-NEXT: [[CMPB_NOT:%.*]] = xor i1 [[CMPB:%.*]], true -; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]] -; CHECK-NEXT: [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !17 -; CHECK-NEXT: [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !18 -; CHECK-NEXT: ret i32 [[OUTVAL]] -; -block1: - br i1 %cmpa, label %block2, label %block3, !prof !13 - -block2: - br i1 %cmpb, label %exit, label %block3 - -block3: - %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ] - br label %exit - -exit: - %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ] - ret i32 %outval -} - -!0 = !{!"branch_weights", i32 3, i32 5} -!1 = !{!"branch_weights", i32 1, i32 1} -!2 = !{!"branch_weights", i32 1, i32 2} -!3 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1} -!4 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1} -!5 = !{!"branch_weights", i32 7, i32 6, i32 5} -!6 = !{!"branch_weights", i32 1, i32 3} -!7 = !{!"branch_weights", i32 33, i32 9, i32 8, i32 7} -!8 = !{!"branch_weights", i32 33, i32 9, i32 8} -!9 = !{!"branch_weights", i32 7, i32 6} -!10 = !{!"branch_weights", i32 672646, i32 21604207} -!11 = !{!"branch_weights", i32 6960, i32 21597248} -!12 = !{!"these_are_not_the_branch_weights_you_are_looking_for", i32 3, i32 5} -!13 = !{!"branch_weights", i32 2, i32 3} -!14 = !{!"branch_weights", i32 4, i32 7} - -; CHECK: !0 = !{!"branch_weights", i32 5, i32 11} -; CHECK: !1 = !{!"branch_weights", i32 1, i32 3} -; CHECK: !2 = !{!"branch_weights", i32 1, i32 5} -; CHECK: !3 = !{!"branch_weights", i32 7, i32 1, i32 2} -; CHECK: !4 = !{!"branch_weights", i32 49, i32 12, i32 24, i32 35} -; CHECK: !5 = !{!"branch_weights", i32 11, i32 5} -; CHECK: !6 = !{!"branch_weights", i32 17, i32 15} -; CHECK: !7 = !{!"branch_weights", i32 9, i32 7} -; CHECK: !8 = !{!"branch_weights", i32 17, i32 9, i32 8, i32 7, i32 17} -; CHECK: !9 = !{!"branch_weights", i32 24, i32 33} -; CHECK: !10 = !{!"branch_weights", i32 8, i32 33} -;; The false weight prints out as a negative integer here, but inside llvm, we -;; treat the weight as an unsigned integer. -; CHECK: !11 = !{!"branch_weights", i32 112017436, i32 -735157296} -; CHECK: !12 = !{!"branch_weights", i32 3, i32 5} -; CHECK: !13 = !{!"branch_weights", i32 22, i32 12} -; CHECK: !14 = !{!"branch_weights", i32 34, i32 21} -; CHECK: !15 = !{!"branch_weights", i32 33, i32 14} -; CHECK: !16 = !{!"branch_weights", i32 47, i32 8} -; CHECK: !17 = !{!"branch_weights", i32 6, i32 2} -; CHECK: !18 = !{!"branch_weights", i32 8, i32 2} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll deleted file mode 100644 index 0615cd1fb3f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll +++ /dev/null @@ -1,54 +0,0 @@ -; RUN: opt -simplifycfg -keep-loops=false -S < %s | FileCheck %s -; RUN: opt -passes='simplify-cfg<no-keep-loops>' -S < %s | FileCheck %s - -define void @test1(i32 %n) #0 { -entry: - %n.addr = alloca i32, align 4 - %count = alloca i32, align 4 - store i32 %n, i32* %n.addr, align 4 - %0 = bitcast i32* %count to i8* - store i32 0, i32* %count, align 4 - br label %while.cond - -while.cond: ; preds = %if.end, %entry - %1 = load i32, i32* %count, align 4 - %2 = load i32, i32* %n.addr, align 4 - %cmp = icmp ule i32 %1, %2 - br i1 %cmp, label %while.body, label %while.end - -while.body: ; preds = %while.cond - %3 = load i32, i32* %count, align 4 - %rem = urem i32 %3, 2 - %cmp1 = icmp eq i32 %rem, 0 - br i1 %cmp1, label %if.then, label %if.else - -if.then: ; preds = %while.body - %4 = load i32, i32* %count, align 4 - %add = add i32 %4, 1 - store i32 %add, i32* %count, align 4 - br label %if.end - -; CHECK: if.then: -; CHECK: br label %while.cond, !llvm.loop !0 - -if.else: ; preds = %while.body - %5 = load i32, i32* %count, align 4 - %add2 = add i32 %5, 2 - store i32 %add2, i32* %count, align 4 - br label %if.end - -; CHECK: if.else: -; CHECK: br label %while.cond, !llvm.loop !0 - -if.end: ; preds = %if.else, %if.then - br label %while.cond, !llvm.loop !0 - -while.end: ; preds = %while.cond - %6 = bitcast i32* %count to i8* - ret void -} - -!0 = distinct !{!0, !1} -!1 = !{!"llvm.loop.distribute.enable", i1 true} -; CHECK: !0 = distinct !{!0, !1} -; CHECK: !1 = !{!"llvm.loop.distribute.enable", i1 true} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-2.ll deleted file mode 100644 index 94d3565ce98..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-2.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @bar(i32*) -declare void @baz(i32*) - -; CHECK-LABEL: @test_load_combine_metadata( -; Check that dereferenceable metadata is combined -; CHECK: load i32*, i32** %p -; CHECK-SAME: !dereferenceable ![[DEREF:[0-9]+]] -; CHECK: t: -; CHECK: f: -define void @test_load_combine_metadata(i1 %c, i32** %p) { - br i1 %c, label %t, label %f - -t: - %v1 = load i32*, i32** %p, !dereferenceable !0 - call void @bar(i32* %v1) - br label %cont - -f: - %v2 = load i32*, i32** %p, !dereferenceable !1 - call void @baz(i32* %v2) - br label %cont - -cont: - ret void -} - -; CHECK: ![[DEREF]] = !{i64 8} - -!0 = !{i64 8} -!1 = !{i64 16} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-3.ll b/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-3.ll deleted file mode 100644 index 92bdf6ec5c1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata-3.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @bar(i32*) -declare void @baz(i32*) - -; CHECK-LABEL: @test_load_combine_metadata( -; Check that dereferenceable_or_null metadata is combined -; CHECK: load i32*, i32** %p -; CHECK-SAME: !dereferenceable_or_null ![[DEREF:[0-9]+]] -; CHECK: t: -; CHECK: f: -define void @test_load_combine_metadata(i1 %c, i32** %p) { - br i1 %c, label %t, label %f - -t: - %v1 = load i32*, i32** %p, !dereferenceable_or_null !0 - call void @bar(i32* %v1) - br label %cont - -f: - %v2 = load i32*, i32** %p, !dereferenceable_or_null !1 - call void @baz(i32* %v2) - br label %cont - -cont: - ret void -} - -; CHECK: ![[DEREF]] = !{i64 8} - -!0 = !{i64 8} -!1 = !{i64 16} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata.ll b/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata.ll deleted file mode 100644 index 89815c84315..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-load-metadata.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -declare void @bar(i32*) -declare void @baz(i32*) - -; CHECK-LABEL: @test_load_combine_metadata( -; Check that align metadata is combined -; CHECK: load i32*, i32** %p -; CHECK-SAME: !align ![[ALIGN:[0-9]+]] -; CHECK: t: -; CHECK: f: -define void @test_load_combine_metadata(i1 %c, i32** %p) { - br i1 %c, label %t, label %f - -t: - %v1 = load i32*, i32** %p, !align !0 - call void @bar(i32* %v1) - br label %cont - -f: - %v2 = load i32*, i32** %p, !align !1 - call void @baz(i32* %v2) - br label %cont - -cont: - ret void -} - -; CHECK: ![[ALIGN]] = !{i64 8} - -!0 = !{i64 8} -!1 = !{i64 16} diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-make-implicit-on-switch-to-br.ll b/llvm/test/Transforms/SimplifyCFG/preserve-make-implicit-on-switch-to-br.ll deleted file mode 100644 index 0e95336bbc1..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-make-implicit-on-switch-to-br.ll +++ /dev/null @@ -1,30 +0,0 @@ -; RUN: opt %s -simplifycfg -S | FileCheck %s - -; ConstantFoldTerminator function can convert SwitchInst with one case (and default) to -; a conditional BranchInst. This test checks the converted BranchInst preserve the -; make.implicit metadata. - -declare i32 @consume(i32*) -declare void @trap() - -define i32 @copy-metadata(i32* %x) { - -entry: - %x.int = ptrtoint i32* %x to i64 - -; CHECK: br i1 %cond, label %is_null, label %default, !make.implicit !0 - switch i64 %x.int, label %default [ - i64 0, label %is_null - ], !make.implicit !0 - -default: - %0 = call i32 @consume(i32* %x) - ret i32 %0 - -is_null: - call void @trap() - unreachable -} - -!0 = !{} - diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-store-alignment.ll b/llvm/test/Transforms/SimplifyCFG/preserve-store-alignment.ll deleted file mode 100644 index 7d25ed2c797..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/preserve-store-alignment.ll +++ /dev/null @@ -1,267 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -%struct.Counters = type { i64, i64, i64, [8 x i8] } - -@m = global i64 3, align 8 -@counters = global %struct.Counters zeroinitializer, align 16 - -define i32 @align_both_equal() local_unnamed_addr { -; CHECK-LABEL: @align_both_equal( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 1, i64 1> -; CHECK-NEXT: store <2 x i64> [[TMP1]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @m, align 8 -; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 2, i64 2> -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], <2 x i64> [[TMP1]], <2 x i64> [[TMP3]] -; CHECK-NEXT: [[AND4:%.*]] = and i64 [[TMP2]], 2 -; CHECK-NEXT: [[TOBOOL5:%.*]] = icmp eq i64 [[AND4]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = add nsw <2 x i64> [[TMP4]], <i64 1, i64 1> -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL5]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]] -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TOBOOL5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] -; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP10:%.*]] -; CHECK: store <2 x i64> [[DOT]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: br label [[TMP10]] -; CHECK: ret i32 0 -; -entry: - %0 = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %1 = add nsw <2 x i64> %0, <i64 1, i64 1> - store <2 x i64> %1, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %2 = load i64, i64* @m, align 8 - %and = and i64 %2, 1 - %tobool = icmp eq i64 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %3 = add nsw <2 x i64> %0, <i64 2, i64 2> - store <2 x i64> %3, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - br label %if.end - -if.end: ; preds = %entry, %if.then - %4 = phi <2 x i64> [ %1, %entry ], [ %3, %if.then ] - %and4 = and i64 %2, 2 - %tobool5 = icmp eq i64 %and4, 0 - br i1 %tobool5, label %if.end9, label %if.then6 - -if.then6: ; preds = %if.end - %5 = add nsw <2 x i64> %4, <i64 1, i64 1> - store <2 x i64> %5, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - br label %if.end9 - -if.end9: ; preds = %if.end, %if.then6 - ret i32 0 -} - -define i32 @align_not_equal() local_unnamed_addr { -; CHECK-LABEL: @align_not_equal( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 1, i64 1> -; CHECK-NEXT: store <2 x i64> [[TMP1]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @m, align 8 -; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 2, i64 2> -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], <2 x i64> [[TMP1]], <2 x i64> [[TMP3]] -; CHECK-NEXT: [[AND4:%.*]] = and i64 [[TMP2]], 2 -; CHECK-NEXT: [[TOBOOL5:%.*]] = icmp eq i64 [[AND4]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = add nsw <2 x i64> [[TMP4]], <i64 1, i64 1> -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL5]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]] -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TOBOOL5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] -; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP10:%.*]] -; CHECK: store <2 x i64> [[DOT]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: br label [[TMP10]] -; CHECK: ret i32 0 -; -entry: - %0 = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %1 = add nsw <2 x i64> %0, <i64 1, i64 1> - store <2 x i64> %1, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %2 = load i64, i64* @m, align 8 - %and = and i64 %2, 1 - %tobool = icmp eq i64 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %3 = add nsw <2 x i64> %0, <i64 2, i64 2> - store <2 x i64> %3, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 16 - br label %if.end - -if.end: ; preds = %entry, %if.then - %4 = phi <2 x i64> [ %1, %entry ], [ %3, %if.then ] - %and4 = and i64 %2, 2 - %tobool5 = icmp eq i64 %and4, 0 - br i1 %tobool5, label %if.end9, label %if.then6 - -if.then6: ; preds = %if.end - %5 = add nsw <2 x i64> %4, <i64 1, i64 1> - store <2 x i64> %5, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - br label %if.end9 - -if.end9: ; preds = %if.end, %if.then6 - ret i32 0 -} - -define i32 @align_single_zero() local_unnamed_addr { -; CHECK-LABEL: @align_single_zero( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 1, i64 1> -; CHECK-NEXT: store <2 x i64> [[TMP1]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @m, align 8 -; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 2, i64 2> -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], <2 x i64> [[TMP1]], <2 x i64> [[TMP3]] -; CHECK-NEXT: [[AND4:%.*]] = and i64 [[TMP2]], 2 -; CHECK-NEXT: [[TOBOOL5:%.*]] = icmp eq i64 [[AND4]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = add nsw <2 x i64> [[TMP4]], <i64 1, i64 1> -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL5]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]] -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TOBOOL5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] -; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP10:%.*]] -; CHECK: store <2 x i64> [[DOT]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: br label [[TMP10]] -; CHECK: ret i32 0 -; -entry: - %0 = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %1 = add nsw <2 x i64> %0, <i64 1, i64 1> - store <2 x i64> %1, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %2 = load i64, i64* @m, align 8 - %and = and i64 %2, 1 - %tobool = icmp eq i64 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %3 = add nsw <2 x i64> %0, <i64 2, i64 2> - store <2 x i64> %3, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*) - br label %if.end - -if.end: ; preds = %entry, %if.then - %4 = phi <2 x i64> [ %1, %entry ], [ %3, %if.then ] - %and4 = and i64 %2, 2 - %tobool5 = icmp eq i64 %and4, 0 - br i1 %tobool5, label %if.end9, label %if.then6 - -if.then6: ; preds = %if.end - %5 = add nsw <2 x i64> %4, <i64 1, i64 1> - store <2 x i64> %5, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - br label %if.end9 - -if.end9: ; preds = %if.end, %if.then6 - ret i32 0 -} - -define i32 @align_single_zero_second_greater_default() local_unnamed_addr { -; CHECK-LABEL: @align_single_zero_second_greater_default( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 1, i64 1> -; CHECK-NEXT: store <2 x i64> [[TMP1]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @m, align 8 -; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 2, i64 2> -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], <2 x i64> [[TMP1]], <2 x i64> [[TMP3]] -; CHECK-NEXT: [[AND4:%.*]] = and i64 [[TMP2]], 2 -; CHECK-NEXT: [[TOBOOL5:%.*]] = icmp eq i64 [[AND4]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = add nsw <2 x i64> [[TMP4]], <i64 1, i64 1> -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL5]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]] -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TOBOOL5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] -; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP10:%.*]] -; CHECK: store <2 x i64> [[DOT]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 16 -; CHECK-NEXT: br label [[TMP10]] -; CHECK: ret i32 0 -; -entry: - %0 = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %1 = add nsw <2 x i64> %0, <i64 1, i64 1> - store <2 x i64> %1, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %2 = load i64, i64* @m, align 8 - %and = and i64 %2, 1 - %tobool = icmp eq i64 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %3 = add nsw <2 x i64> %0, <i64 2, i64 2> - store <2 x i64> %3, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 32 - br label %if.end - -if.end: ; preds = %entry, %if.then - %4 = phi <2 x i64> [ %1, %entry ], [ %3, %if.then ] - %and4 = and i64 %2, 2 - %tobool5 = icmp eq i64 %and4, 0 - br i1 %tobool5, label %if.end9, label %if.then6 - -if.then6: ; preds = %if.end - %5 = add nsw <2 x i64> %4, <i64 1, i64 1> - store <2 x i64> %5, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*) - br label %if.end9 - -if.end9: ; preds = %if.end, %if.then6 - ret i32 0 -} - -define i32 @align_both_zero() local_unnamed_addr { -; CHECK-LABEL: @align_both_zero( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 1, i64 1> -; CHECK-NEXT: store <2 x i64> [[TMP1]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 -; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @m, align 8 -; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], 1 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = add nsw <2 x i64> [[TMP0]], <i64 2, i64 2> -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], <2 x i64> [[TMP1]], <2 x i64> [[TMP3]] -; CHECK-NEXT: [[AND4:%.*]] = and i64 [[TMP2]], 2 -; CHECK-NEXT: [[TOBOOL5:%.*]] = icmp eq i64 [[AND4]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = add nsw <2 x i64> [[TMP4]], <i64 1, i64 1> -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TOBOOL5]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]] -; CHECK-NEXT: [[TMP6:%.*]] = xor i1 [[TOBOOL]], true -; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TOBOOL5]], true -; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] -; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP10:%.*]] -; CHECK: store <2 x i64> [[DOT]], <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 16 -; CHECK-NEXT: br label [[TMP10]] -; CHECK: ret i32 0 -; -entry: - %0 = load <2 x i64>, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %1 = add nsw <2 x i64> %0, <i64 1, i64 1> - store <2 x i64> %1, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*), align 8 - %2 = load i64, i64* @m, align 8 - %and = and i64 %2, 1 - %tobool = icmp eq i64 %and, 0 - br i1 %tobool, label %if.end, label %if.then - -if.then: ; preds = %entry - %3 = add nsw <2 x i64> %0, <i64 2, i64 2> - store <2 x i64> %3, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*) - br label %if.end - -if.end: ; preds = %entry, %if.then - %4 = phi <2 x i64> [ %1, %entry ], [ %3, %if.then ] - %and4 = and i64 %2, 2 - %tobool5 = icmp eq i64 %and4, 0 - br i1 %tobool5, label %if.end9, label %if.then6 - -if.then6: ; preds = %if.end - %5 = add nsw <2 x i64> %4, <i64 1, i64 1> - store <2 x i64> %5, <2 x i64>* bitcast (i64* getelementptr inbounds (%struct.Counters, %struct.Counters* @counters, i64 0, i32 1) to <2 x i64>*) - br label %if.end9 - -if.end9: ; preds = %if.end, %if.then6 - ret i32 0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/rangereduce.ll b/llvm/test/Transforms/SimplifyCFG/rangereduce.ll deleted file mode 100644 index 849f55f6f39..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/rangereduce.ll +++ /dev/null @@ -1,347 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -switch-to-lookup -S | FileCheck %s -; RUN: opt < %s -passes='simplify-cfg<switch-to-lookup>' -S | FileCheck %s - -target datalayout = "e-n32" - -define i32 @test1(i32 %a) { -; CHECK-LABEL: @test1( -; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 97 -; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2 -; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30 -; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]] -; CHECK-NEXT: switch i32 [[TMP4]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 0, label [[ONE:%.*]] -; CHECK-NEXT: i32 1, label [[TWO:%.*]] -; CHECK-NEXT: i32 2, label [[THREE:%.*]] -; CHECK-NEXT: i32 3, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 97, label %one - i32 101, label %two - i32 105, label %three - i32 109, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -; Optimization shouldn't trigger; bitwidth > 64 -define i128 @test2(i128 %a) { -; CHECK-LABEL: @test2( -; CHECK-NEXT: switch i128 [[A:%.*]], label [[DEF:%.*]] [ -; CHECK-NEXT: i128 97, label [[ONE:%.*]] -; CHECK-NEXT: i128 101, label [[TWO:%.*]] -; CHECK-NEXT: i128 105, label [[THREE:%.*]] -; CHECK-NEXT: i128 109, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i128 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i128 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i128 %a, label %def [ - i128 97, label %one - i128 101, label %two - i128 105, label %three - i128 109, label %three - ] - -def: - ret i128 8867 - -one: - ret i128 11984 -two: - ret i128 1143 -three: - ret i128 99783 -} - -; Optimization shouldn't trigger; no holes present -define i32 @test3(i32 %a) { -; CHECK-LABEL: @test3( -; CHECK-NEXT: switch i32 [[A:%.*]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 97, label [[ONE:%.*]] -; CHECK-NEXT: i32 98, label [[TWO:%.*]] -; CHECK-NEXT: i32 99, label [[THREE:%.*]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 97, label %one - i32 98, label %two - i32 99, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -; Optimization shouldn't trigger; not an arithmetic progression -define i32 @test4(i32 %a) { -; CHECK-LABEL: @test4( -; CHECK-NEXT: switch i32 [[A:%.*]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 97, label [[ONE:%.*]] -; CHECK-NEXT: i32 102, label [[TWO:%.*]] -; CHECK-NEXT: i32 105, label [[THREE:%.*]] -; CHECK-NEXT: i32 109, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 97, label %one - i32 102, label %two - i32 105, label %three - i32 109, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -; Optimization shouldn't trigger; not a power of two -define i32 @test5(i32 %a) { -; CHECK-LABEL: @test5( -; CHECK-NEXT: switch i32 [[A:%.*]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 97, label [[ONE:%.*]] -; CHECK-NEXT: i32 102, label [[TWO:%.*]] -; CHECK-NEXT: i32 107, label [[THREE:%.*]] -; CHECK-NEXT: i32 112, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 97, label %one - i32 102, label %two - i32 107, label %three - i32 112, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -define i32 @test6(i32 %a) optsize { -; CHECK-LABEL: @test6( -; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], -109 -; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2 -; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30 -; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]] -; CHECK-NEXT: switch i32 [[TMP4]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 3, label [[ONE:%.*]] -; CHECK-NEXT: i32 2, label [[TWO:%.*]] -; CHECK-NEXT: i32 1, label [[THREE:%.*]] -; CHECK-NEXT: i32 0, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 -97, label %one - i32 -101, label %two - i32 -105, label %three - i32 -109, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -define i8 @test7(i8 %a) optsize { -; CHECK-LABEL: @test7( -; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[A:%.*]], -36 -; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], 2 -; CHECK-NEXT: [[TMP3:%.*]] = shl i8 [[TMP1]], 6 -; CHECK-NEXT: [[TMP4:%.*]] = or i8 [[TMP2]], [[TMP3]] -; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i8 [[TMP4]], 4 -; CHECK-NEXT: br i1 [[TMP5]], label [[SWITCH_LOOKUP:%.*]], label [[DEF:%.*]] -; CHECK: switch.lookup: -; CHECK-NEXT: [[SWITCH_CAST:%.*]] = zext i8 [[TMP4]] to i32 -; CHECK-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul i32 [[SWITCH_CAST]], 8 -; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i32 -943228976, [[SWITCH_SHIFTAMT]] -; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i32 [[SWITCH_DOWNSHIFT]] to i8 -; CHECK-NEXT: ret i8 [[SWITCH_MASKED]] -; CHECK: def: -; CHECK-NEXT: ret i8 -93 -; - switch i8 %a, label %def [ - i8 220, label %one - i8 224, label %two - i8 228, label %three - i8 232, label %three - ] - -def: - ret i8 8867 - -one: - ret i8 11984 -two: - ret i8 1143 -three: - ret i8 99783 -} - -define i32 @test8(i32 %a) optsize { -; CHECK-LABEL: @test8( -; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 97 -; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 2 -; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 30 -; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]] -; CHECK-NEXT: switch i32 [[TMP4]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 0, label [[ONE:%.*]] -; CHECK-NEXT: i32 1, label [[TWO:%.*]] -; CHECK-NEXT: i32 2, label [[THREE:%.*]] -; CHECK-NEXT: i32 4, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 97, label %one - i32 101, label %two - i32 105, label %three - i32 113, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - -define i32 @test9(i32 %a) { -; CHECK-LABEL: @test9( -; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], 6 -; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 1 -; CHECK-NEXT: [[TMP3:%.*]] = shl i32 [[TMP1]], 31 -; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[TMP3]] -; CHECK-NEXT: switch i32 [[TMP4]], label [[DEF:%.*]] [ -; CHECK-NEXT: i32 6, label [[ONE:%.*]] -; CHECK-NEXT: i32 7, label [[TWO:%.*]] -; CHECK-NEXT: i32 0, label [[THREE:%.*]] -; CHECK-NEXT: i32 2, label [[THREE]] -; CHECK-NEXT: ] -; CHECK: def: -; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ 8867, [[TMP0:%.*]] ], [ 11984, [[ONE]] ], [ 1143, [[TWO]] ], [ 99783, [[THREE]] ] -; CHECK-NEXT: ret i32 [[MERGE]] -; CHECK: one: -; CHECK-NEXT: br label [[DEF]] -; CHECK: two: -; CHECK-NEXT: br label [[DEF]] -; CHECK: three: -; CHECK-NEXT: br label [[DEF]] -; - switch i32 %a, label %def [ - i32 18, label %one - i32 20, label %two - i32 6, label %three - i32 10, label %three - ] - -def: - ret i32 8867 - -one: - ret i32 11984 -two: - ret i32 1143 -three: - ret i32 99783 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/remove-debug-2.ll b/llvm/test/Transforms/SimplifyCFG/remove-debug-2.ll deleted file mode 100644 index 2415cf1977e..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/remove-debug-2.ll +++ /dev/null @@ -1,68 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Check that the debug location for the hoisted store for "ret = 0" is a -; line-0 location. -; -; int foo(int x) { -; int ret = 1; -; if (x) -; ret = 0; -; return ret; -; } -; -; CHECK: store i32 1,{{.+}}!dbg ![[DLOC1:[0-9]+]] -; CHECK: icmp ne {{.+}}!dbg ![[DLOC2:[0-9]+]] -; CHECK: [[VREG:%[^ ]+]] = select -; CHECK: store i32 [[VREG]],{{.*}} !dbg [[storeLoc:![0-9]+]] -; CHECK: ret {{.+}}!dbg ![[DLOC3:[0-9]+]] -; CHECK: ![[DLOC1]] = !DILocation(line: 2 -; CHECK: ![[DLOC2]] = !DILocation(line: 3 -; CHECK: [[storeLoc]] = !DILocation(line: 0 -; CHECK: ![[DLOC3]] = !DILocation(line: 5 - -target triple = "x86_64-unknown-linux-gnu" - -; Function Attrs: noinline nounwind uwtable -define i32 @foo(i32) !dbg !6 { - %2 = alloca i32, align 4 - %3 = alloca i32, align 4 - store i32 %0, i32* %2, align 4 - store i32 1, i32* %3, align 4, !dbg !14 - %4 = load i32, i32* %2, align 4, !dbg !15 - %5 = icmp ne i32 %4, 0, !dbg !15 - br i1 %5, label %6, label %7, !dbg !17 - -; <label>:6: ; preds = %1 - store i32 0, i32* %3, align 4, !dbg !18 - br label %7, !dbg !19 - -; <label>:7: ; preds = %6, %1 - %8 = load i32, i32* %3, align 4, !dbg !20 - ret i32 %8, !dbg !21 -} - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3, !4} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1) -!1 = !DIFile(filename: "foo.c", directory: "b/") -!2 = !{} -!3 = !{i32 2, !"Dwarf Version", i32 4} -!4 = !{i32 2, !"Debug Info Version", i32 3} -!5 = !{} -!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) -!7 = !DISubroutineType(types: !8) -!8 = !{!9, !9} -!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!10 = !DILocalVariable(name: "x", arg: 1, scope: !6, file: !1, line: 1, type: !9) -!11 = !DIExpression() -!12 = !DILocation(line: 1, column: 13, scope: !6) -!13 = !DILocalVariable(name: "ret", scope: !6, file: !1, line: 2, type: !9) -!14 = !DILocation(line: 2, column: 7, scope: !6) -!15 = !DILocation(line: 3, column: 7, scope: !16) -!16 = distinct !DILexicalBlock(scope: !6, file: !1, line: 3, column: 7) -!17 = !DILocation(line: 3, column: 7, scope: !6) -!18 = !DILocation(line: 4, column: 9, scope: !16) -!19 = !DILocation(line: 4, column: 5, scope: !16) -!20 = !DILocation(line: 5, column: 10, scope: !6) -!21 = !DILocation(line: 5, column: 3, scope: !6) diff --git a/llvm/test/Transforms/SimplifyCFG/remove-debug.ll b/llvm/test/Transforms/SimplifyCFG/remove-debug.ll deleted file mode 100644 index 2da7caf157e..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/remove-debug.ll +++ /dev/null @@ -1,88 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; TODO: Track the acutal DebugLoc of the hoisted instruction when no-line -; DebugLoc is supported (https://reviews.llvm.org/D24180) - -; Checks if the debug info for hoisted "x = i" is removed and -; the debug info for hoisted "bar()" is set as line 0 -; int x; -; void bar(); -; void baz(); -; -; void foo(int i) { -; if (i == 0) { -; x = i; -; bar(); -; } else { -; x = i; -; bar(); -; baz(); -; } -; } - -target triple = "x86_64-unknown-linux-gnu" - -@x = global i32 0, align 4 - -; Function Attrs: uwtable -define void @_Z3fooi(i32) #0 !dbg !6 { -; CHECK: load i32, i32* %2, align 4, !dbg ![[LOAD:[0-9]+]], !tbaa -; CHECK: store i32 %5, i32* @x, align 4, !dbg ![[BAR:[0-9]+]], !tbaa -; CHECK: call void @_Z3barv(), !dbg ![[BAR]] -; CHECK: call void @_Z3bazv(), !dbg ![[BAZ:[0-9]+]] - %2 = alloca i32, align 4 - store i32 %0, i32* %2, align 4, !tbaa !8 - %3 = load i32, i32* %2, align 4, !dbg !12, !tbaa !8 - %4 = icmp eq i32 %3, 0, !dbg !13 - br i1 %4, label %5, label %7, !dbg !12 - -; <label>:5: - %6 = load i32, i32* %2, align 4, !dbg !14, !tbaa !8 - store i32 %6, i32* @x, align 4, !dbg !15, !tbaa !8 - call void @_Z3barv(), !dbg !16 - br label %9, !dbg !17 - -; <label>:7: - %8 = load i32, i32* %2, align 4, !dbg !18, !tbaa !8 - store i32 %8, i32* @x, align 4, !dbg !19, !tbaa !8 - call void @_Z3barv(), !dbg !20 - call void @_Z3bazv(), !dbg !21 - br label %9 - -; <label>:9: - ret void, !dbg !21 -} - -declare void @_Z3barv() #1 - -declare void @_Z3bazv() #1 - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3, !4} - -; CHECK: ![[LOAD]] = !DILocation(line: 6, column: 7 -; CHECK: ![[BAR]] = !DILocation(line: 0 -; CHECK: ![[BAZ]] = !DILocation(line: 12, column: 5 -!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1) -!1 = !DIFile(filename: "a", directory: "b/") -!2 = !{} -!3 = !{i32 2, !"Dwarf Version", i32 4} -!4 = !{i32 2, !"Debug Info Version", i32 3} -!5 = !{} -!6 = distinct !DISubprogram(unit: !0) -!7 = !DISubroutineType(types: !2) -!8 = !{!9, !9, i64 0} -!9 = !{!"int", !10, i64 0} -!10 = !{!"omnipotent char", !11, i64 0} -!11 = !{!"Simple C++ TBAA"} -!12 = !DILocation(line: 6, column: 7, scope: !6) -!13 = !DILocation(line: 6, column: 9, scope: !6) -!14 = !DILocation(line: 7, column: 9, scope: !6) -!15 = !DILocation(line: 7, column: 7, scope: !6) -!16 = !DILocation(line: 8, column: 5, scope: !6) -!17 = !DILocation(line: 9, column: 3, scope: !6) -!18 = !DILocation(line: 10, column: 9, scope: !6) -!19 = !DILocation(line: 10, column: 7, scope: !6) -!20 = !DILocation(line: 11, column: 5, scope: !6) -!21 = !DILocation(line: 12, column: 5, scope: !6) -!22 = !DILocation(line: 14, column: 1, scope: !6) diff --git a/llvm/test/Transforms/SimplifyCFG/return-merge.ll b/llvm/test/Transforms/SimplifyCFG/return-merge.ll deleted file mode 100644 index 977b6dff87c..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/return-merge.ll +++ /dev/null @@ -1,19 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | not grep br - -define i32 @test1(i1 %C) { -entry: - br i1 %C, label %T, label %F -T: ; preds = %entry - ret i32 1 -F: ; preds = %entry - ret i32 0 -} - -define void @test2(i1 %C) { - br i1 %C, label %T, label %F -T: ; preds = %0 - ret void -F: ; preds = %0 - ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/seh-nounwind.ll b/llvm/test/Transforms/SimplifyCFG/seh-nounwind.ll deleted file mode 100644 index c380c6ce2ce..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/seh-nounwind.ll +++ /dev/null @@ -1,31 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -; Don't remove invokes of nounwind functions if the personality handles async -; exceptions. The @div function in this test can fault, even though it can't -; throw a synchronous exception. - -define i32 @div(i32 %n, i32 %d) nounwind { -entry: - %div = sdiv i32 %n, %d - ret i32 %div -} - -define i32 @main() nounwind personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) { -entry: - %call = invoke i32 @div(i32 10, i32 0) - to label %__try.cont unwind label %lpad - -lpad: - %0 = landingpad { i8*, i32 } - catch i8* null - br label %__try.cont - -__try.cont: - %retval.0 = phi i32 [ %call, %entry ], [ 0, %lpad ] - ret i32 %retval.0 -} - -; CHECK-LABEL: define i32 @main() -; CHECK: invoke i32 @div(i32 10, i32 0) - -declare i32 @__C_specific_handler(...) diff --git a/llvm/test/Transforms/SimplifyCFG/select-gep.ll b/llvm/test/Transforms/SimplifyCFG/select-gep.ll deleted file mode 100644 index 66808c92816..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/select-gep.ll +++ /dev/null @@ -1,26 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -%ST = type { i8, i8 } - -define i8* @test1(%ST* %x, i8* %y) nounwind { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp eq %ST* [[X:%.*]], null -; CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr [[ST:%.*]], %ST* [[X]], i32 0, i32 1 -; CHECK-NEXT: [[INCDEC_PTR_Y:%.*]] = select i1 [[CMP]], i8* [[INCDEC_PTR]], i8* [[Y:%.*]] -; CHECK-NEXT: ret i8* [[INCDEC_PTR_Y]] -; -entry: - %cmp = icmp eq %ST* %x, null - br i1 %cmp, label %if.then, label %if.end - -if.then: - %incdec.ptr = getelementptr %ST, %ST* %x, i32 0, i32 1 - br label %if.end - -if.end: - %x.addr = phi i8* [ %incdec.ptr, %if.then ], [ %y, %entry ] - ret i8* %x.addr - -} diff --git a/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll b/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll deleted file mode 100644 index 12a3e59cd37..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll +++ /dev/null @@ -1,892 +0,0 @@ -; RUN: opt < %s -simplifycfg -sink-common-insts -S | FileCheck -enable-var-scope %s -; RUN: opt < %s -passes='simplify-cfg<sink-common-insts>' -S | FileCheck -enable-var-scope %s - -define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) { -entry: - br i1 %flag, label %if.then, label %if.else - -; CHECK-LABEL: test1 -; CHECK: add -; CHECK: select -; CHECK: icmp -; CHECK-NOT: br -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - br label %if.end - -if.else: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = zext i1 %cmp2 to i8 - br label %if.end - -if.end: - %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ] - %tobool4 = icmp ne i8 %obeys.0, 0 - ret i1 %tobool4 -} - -define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) { -entry: - br i1 %flag, label %if.then, label %if.else - -; CHECK-LABEL: test2 -; CHECK: add -; CHECK: select -; CHECK: icmp -; CHECK-NOT: br -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - br label %if.end - -if.else: - %add = add i32 %nblks, %blksB - %cmp2 = icmp uge i32 %blksA, %add - %frombool3 = zext i1 %cmp2 to i8 - br label %if.end - -if.end: - %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ] - %tobool4 = icmp ne i8 %obeys.0, 0 - ret i1 %tobool4 -} - -declare i32 @foo(i32, i32) nounwind readnone - -define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone - %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone - br label %if.end - -if.else: - %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone - %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone - br label %if.end - -if.end: - %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ] - %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ] - %ret = add i32 %xx, %yy - ret i32 %ret -} - -; CHECK-LABEL: test3 -; CHECK: select -; CHECK: call -; CHECK: call -; CHECK: add -; CHECK-NOT: br - -define i32 @test4(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %a = add i32 %x, 5 - store i32 %a, i32* %y - br label %if.end - -if.else: - %b = add i32 %x, 7 - store i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test4 -; CHECK: select -; CHECK: store -; CHECK-NOT: store - -define i32 @test5(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %a = add i32 %x, 5 - store volatile i32 %a, i32* %y - br label %if.end - -if.else: - %b = add i32 %x, 7 - store i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test5 -; CHECK: store volatile -; CHECK: store - -define i32 @test6(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %a = add i32 %x, 5 - store volatile i32 %a, i32* %y - br label %if.end - -if.else: - %b = add i32 %x, 7 - store volatile i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test6 -; CHECK: select -; CHECK: store volatile -; CHECK-NOT: store - -define i32 @test7(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %z = load volatile i32, i32* %y - %a = add i32 %z, 5 - store volatile i32 %a, i32* %y - br label %if.end - -if.else: - %w = load volatile i32, i32* %y - %b = add i32 %w, 7 - store volatile i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test7 -; CHECK-DAG: select -; CHECK-DAG: load volatile -; CHECK: store volatile -; CHECK-NOT: load -; CHECK-NOT: store - -; %z and %w are in different blocks. We shouldn't sink the add because -; there may be intervening memory instructions. -define i32 @test8(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - %z = load volatile i32, i32* %y - br i1 %flag, label %if.then, label %if.else - -if.then: - %a = add i32 %z, 5 - store volatile i32 %a, i32* %y - br label %if.end - -if.else: - %w = load volatile i32, i32* %y - %b = add i32 %w, 7 - store volatile i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test8 -; CHECK: add -; CHECK: add - -; The extra store in %if.then means %z and %w are not equivalent. -define i32 @test9(i1 zeroext %flag, i32 %x, i32* %y, i32* %p) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - store i32 7, i32* %p - %z = load volatile i32, i32* %y - store i32 6, i32* %p - %a = add i32 %z, 5 - store volatile i32 %a, i32* %y - br label %if.end - -if.else: - %w = load volatile i32, i32* %y - %b = add i32 %w, 7 - store volatile i32 %b, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test9 -; CHECK: add -; CHECK: add - -%struct.anon = type { i32, i32 } - -; The GEP indexes a struct type so cannot have a variable last index. -define i32 @test10(i1 zeroext %flag, i32 %x, i32* %y, %struct.anon* %s) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %dummy = add i32 %x, 5 - %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0 - store volatile i32 %x, i32* %gepa - br label %if.end - -if.else: - %dummy1 = add i32 %x, 6 - %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1 - store volatile i32 %x, i32* %gepb - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test10 -; CHECK: getelementptr -; CHECK: getelementptr -; CHECK: phi -; CHECK: store volatile - -; The shufflevector's mask operand cannot be merged in a PHI. -define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %dummy = add i32 %w, 5 - %sv1 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 0, i32 1> - br label %if.end - -if.else: - %dummy1 = add i32 %w, 6 - %sv2 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 1, i32 0> - br label %if.end - -if.end: - %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ] - ret i32 1 -} - -; CHECK-LABEL: test11 -; CHECK: shufflevector -; CHECK: shufflevector - -; We can't common an intrinsic! -define i32 @test12(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %dummy = add i32 %w, 5 - %sv1 = call i32 @llvm.ctlz.i32(i32 %x) - br label %if.end - -if.else: - %dummy1 = add i32 %w, 6 - %sv2 = call i32 @llvm.cttz.i32(i32 %x) - br label %if.end - -if.end: - %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ] - ret i32 1 -} - -declare i32 @llvm.ctlz.i32(i32 %x) readnone -declare i32 @llvm.cttz.i32(i32 %x) readnone - -; CHECK-LABEL: test12 -; CHECK: call i32 @llvm.ctlz -; CHECK: call i32 @llvm.cttz - -; The TBAA metadata should be properly combined. -define i32 @test13(i1 zeroext %flag, i32 %x, i32* %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %z = load volatile i32, i32* %y - %a = add i32 %z, 5 - store volatile i32 %a, i32* %y, !tbaa !3 - br label %if.end - -if.else: - %w = load volatile i32, i32* %y - %b = add i32 %w, 7 - store volatile i32 %b, i32* %y, !tbaa !4 - br label %if.end - -if.end: - ret i32 1 -} - -!0 = !{ !"an example type tree" } -!1 = !{ !"int", !0 } -!2 = !{ !"float", !0 } -!3 = !{ !"const float", !2, i64 0 } -!4 = !{ !"special float", !2, i64 1 } - -; CHECK-LABEL: test13 -; CHECK-DAG: select -; CHECK-DAG: load volatile -; CHECK: store volatile {{.*}}, !tbaa ![[$TBAA:[0-9]]] -; CHECK-NOT: load -; CHECK-NOT: store - -; The call should be commoned. -define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %sv1 = call i32 @bar(i32 %x) - br label %if.end - -if.else: - %sv2 = call i32 @bar(i32 %y) - br label %if.end - -if.end: - %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ] - ret i32 1 -} -declare i32 @bar(i32) - -; CHECK-LABEL: test13a -; CHECK: %[[x:.*]] = select i1 %flag -; CHECK: call i32 @bar(i32 %[[x]]) - -; The load should be commoned. -define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %dummy = add i32 %x, 1 - %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1 - %sv1 = load i32, i32* %gepa - %cmp1 = icmp eq i32 %sv1, 56 - br label %if.end - -if.else: - %dummy2 = add i32 %x, 4 - %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1 - %sv2 = load i32, i32* %gepb - %cmp2 = icmp eq i32 %sv2, 57 - call void @llvm.dbg.value(metadata i32 0, metadata !9, metadata !DIExpression()), !dbg !11 - br label %if.end - -if.end: - %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ] - ret i32 1 -} - -declare void @llvm.dbg.value(metadata, metadata, metadata) -!llvm.module.flags = !{!5, !6} -!llvm.dbg.cu = !{!7} - -!5 = !{i32 2, !"Dwarf Version", i32 4} -!6 = !{i32 2, !"Debug Info Version", i32 3} -!7 = distinct !DICompileUnit(language: DW_LANG_C99, file: !10) -!8 = distinct !DISubprogram(name: "foo", unit: !7) -!9 = !DILocalVariable(name: "b", line: 1, arg: 2, scope: !8) -!10 = !DIFile(filename: "a.c", directory: "a/b") -!11 = !DILocation(line: 1, column: 14, scope: !8) - -; CHECK-LABEL: test14 -; CHECK: getelementptr -; CHECK: load -; CHECK-NOT: load - -; The load should be commoned. -define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %dummy = add i32 %x, 1 - %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0 - %sv1 = load i32, i32* %gepa - %ext1 = zext i32 %sv1 to i64 - %cmp1 = icmp eq i64 %ext1, 56 - br label %if.end - -if.else: - %dummy2 = add i32 %x, 4 - %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1 - %sv2 = load i32, i32* %gepb - %ext2 = zext i32 %sv2 to i64 - %cmp2 = icmp eq i64 %ext2, 57 - br label %if.end - -if.end: - %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ] - ret i32 1 -} - -; CHECK-LABEL: test15 -; CHECK: getelementptr -; CHECK: load -; CHECK-NOT: load - -define zeroext i1 @test_crash(i1 zeroext %flag, i32* %i4, i32* %m, i32* %n) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %tmp1 = load i32, i32* %i4 - %tmp2 = add i32 %tmp1, -1 - store i32 %tmp2, i32* %i4 - br label %if.end - -if.else: - %tmp3 = load i32, i32* %m - %tmp4 = load i32, i32* %n - %tmp5 = add i32 %tmp3, %tmp4 - store i32 %tmp5, i32* %i4 - br label %if.end - -if.end: - ret i1 true -} - -; CHECK-LABEL: test_crash -; No checks for test_crash - just ensure it doesn't crash! - -define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) { - -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - br label %if.end - -if.else: - br i1 %flag2, label %if.then2, label %if.end - -if.then2: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = zext i1 %cmp2 to i8 - br label %if.end - -if.end: - %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %if.else ] - %tobool4 = icmp ne i8 %obeys.0, 0 - ret i1 %tobool4 -} - -; CHECK-LABEL: test16 -; CHECK: zext -; CHECK: zext - -define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, i8* %p) { - -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - store i8 %frombool1, i8* %p - br label %if.end - -if.else: - br i1 %flag2, label %if.then2, label %if.end - -if.then2: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = zext i1 %cmp2 to i8 - store i8 %frombool3, i8* %p - br label %if.end - -if.end: - ret i1 true -} - -; CHECK-LABEL: test16a -; CHECK: zext -; CHECK-NOT: zext - -define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) { -entry: - switch i32 %flag, label %if.end [ - i32 0, label %if.then - i32 1, label %if.then2 - ] - -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = call i8 @i1toi8(i1 %cmp) - br label %if.end - -if.then2: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = call i8 @i1toi8(i1 %cmp2) - br label %if.end - -if.end: - %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %entry ] - %tobool4 = icmp ne i8 %obeys.0, 0 - ret i1 %tobool4 -} -declare i8 @i1toi8(i1) - -; CHECK-LABEL: test17 -; CHECK: if.then: -; CHECK-NEXT: icmp uge -; CHECK-NEXT: br label %[[x:.*]] - -; CHECK: if.then2: -; CHECK-NEXT: add -; CHECK-NEXT: icmp ule -; CHECK-NEXT: br label %[[x]] - -; CHECK: [[x]]: -; CHECK-NEXT: %[[y:.*]] = phi i1 [ %cmp -; CHECK-NEXT: %[[z:.*]] = call i8 @i1toi8(i1 %[[y]]) -; CHECK-NEXT: br label %if.end - -; CHECK: if.end: -; CHECK-NEXT: phi i8 -; CHECK-DAG: [ %[[z]], %[[x]] ] -; CHECK-DAG: [ 0, %entry ] - -define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) { -entry: - switch i32 %flag, label %if.then3 [ - i32 0, label %if.then - i32 1, label %if.then2 - ] - -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - br label %if.end - -if.then2: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = zext i1 %cmp2 to i8 - br label %if.end - -if.then3: - %add2 = add i32 %nblks, %blksA - %cmp3 = icmp ule i32 %add2, %blksA - %frombool4 = zext i1 %cmp3 to i8 - br label %if.end - -if.end: - %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ %frombool4, %if.then3 ] - %tobool4 = icmp ne i8 %obeys.0, 0 - ret i1 %tobool4 -} - -; CHECK-LABEL: test18 -; CHECK: if.end: -; CHECK-NEXT: %[[x:.*]] = phi i1 -; CHECK-DAG: [ %cmp, %if.then ] -; CHECK-DAG: [ %cmp2, %if.then2 ] -; CHECK-DAG: [ %cmp3, %if.then3 ] -; CHECK-NEXT: zext i1 %[[x]] to i8 - -define i32 @test_pr30188(i1 zeroext %flag, i32 %x) { -entry: - %y = alloca i32 - %z = alloca i32 - br i1 %flag, label %if.then, label %if.else - -if.then: - store i32 %x, i32* %y - br label %if.end - -if.else: - store i32 %x, i32* %z - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test_pr30188 -; CHECK-NOT: select -; CHECK: store -; CHECK: store - -define i32 @test_pr30188a(i1 zeroext %flag, i32 %x) { -entry: - %y = alloca i32 - %z = alloca i32 - br i1 %flag, label %if.then, label %if.else - -if.then: - call void @g() - %one = load i32, i32* %y - %two = add i32 %one, 2 - store i32 %two, i32* %y - br label %if.end - -if.else: - %three = load i32, i32* %z - %four = add i32 %three, 2 - store i32 %four, i32* %y - br label %if.end - -if.end: - ret i32 1 -} - -; CHECK-LABEL: test_pr30188a -; CHECK-NOT: select -; CHECK: load -; CHECK: load -; CHECK: store - -; The phi is confusing - both add instructions are used by it, but -; not on their respective unconditional arcs. It should not be -; optimized. -define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) { -entry: - %add1 = add i32 %a, 1 - br label %succ - -one: - br i1 %cond, label %two, label %succ - -two: - call void @g() - %add2 = add i32 %a, 1 - br label %succ - -succ: - %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ] - br label %one -} -declare void @g() - -; CHECK-LABEL: test_pr30292 -; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ] - -define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) { - -entry: - %p = alloca i8 - br i1 %flag, label %if.then, label %if.else - -if.then: - %cmp = icmp uge i32 %blksA, %nblks - %frombool1 = zext i1 %cmp to i8 - store i8 %frombool1, i8* %p - br label %if.end - -if.else: - br i1 %flag2, label %if.then2, label %if.end - -if.then2: - %add = add i32 %nblks, %blksB - %cmp2 = icmp ule i32 %add, %blksA - %frombool3 = zext i1 %cmp2 to i8 - store i8 %frombool3, i8* %p - br label %if.end - -if.end: - ret i1 true -} - -; CHECK-LABEL: @test_pr30244 -; CHECK: store -; CHECK: store - -define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone - %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone - %z0 = lshr i32 %y0, 8 - br label %if.end - -if.else: - %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone - %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone - %z1 = lshr exact i32 %y1, 8 - br label %if.end - -if.end: - %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ] - %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ] - %ret = add i32 %xx, %yy - ret i32 %ret -} - -; CHECK-LABEL: test_pr30373a -; CHECK: lshr -; CHECK-NOT: exact -; CHECK: } - -define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone - %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone - %z0 = lshr exact i32 %y0, 8 - br label %if.end - -if.else: - %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone - %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone - %z1 = lshr i32 %y1, 8 - br label %if.end - -if.end: - %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ] - %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ] - %ret = add i32 %xx, %yy - ret i32 %ret -} - -; CHECK-LABEL: test_pr30373b -; CHECK: lshr -; CHECK-NOT: exact -; CHECK: } - -; Check that simplifycfg doesn't sink and merge inline-asm instructions. - -define i32 @test_inline_asm1(i32 %c, i32 %r6) { -entry: - %tobool = icmp eq i32 %c, 0 - br i1 %tobool, label %if.else, label %if.then - -if.then: - %0 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8) - br label %if.end - -if.else: - %1 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6) - br label %if.end - -if.end: - %r6.addr.0 = phi i32 [ %0, %if.then ], [ %1, %if.else ] - ret i32 %r6.addr.0 -} - -; CHECK-LABEL: @test_inline_asm1( -; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8) -; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6) - -declare i32 @call_target() - -define void @test_operand_bundles(i1 %cond, i32* %ptr) { -entry: - br i1 %cond, label %left, label %right - -left: - %val0 = call i32 @call_target() [ "deopt"(i32 10) ] - store i32 %val0, i32* %ptr - br label %merge - -right: - %val1 = call i32 @call_target() [ "deopt"(i32 20) ] - store i32 %val1, i32* %ptr - br label %merge - -merge: - ret void -} - -; CHECK-LABEL: @test_operand_bundles( -; CHECK: left: -; CHECK-NEXT: %val0 = call i32 @call_target() [ "deopt"(i32 10) ] -; CHECK: right: -; CHECK-NEXT: %val1 = call i32 @call_target() [ "deopt"(i32 20) ] - -%T = type {i32, i32} - -define i32 @test_insertvalue(i1 zeroext %flag, %T %P) { -entry: - br i1 %flag, label %if.then, label %if.else - -if.then: - %t1 = insertvalue %T %P, i32 0, 0 - br label %if.end - -if.else: - %t2 = insertvalue %T %P, i32 1, 0 - br label %if.end - -if.end: - %t = phi %T [%t1, %if.then], [%t2, %if.else] - ret i32 1 -} - -; CHECK-LABEL: @test_insertvalue -; CHECK: select -; CHECK: insertvalue -; CHECK-NOT: insertvalue - - -declare void @baz(i32) - -define void @test_sink_void_calls(i32 %x) { -entry: - switch i32 %x, label %default [ - i32 0, label %bb0 - i32 1, label %bb1 - i32 2, label %bb2 - i32 3, label %bb3 - i32 4, label %bb4 - ] -bb0: - call void @baz(i32 12) - br label %return -bb1: - call void @baz(i32 34) - br label %return -bb2: - call void @baz(i32 56) - br label %return -bb3: - call void @baz(i32 78) - br label %return -bb4: - call void @baz(i32 90) - br label %return -default: - unreachable -return: - ret void - -; Check that the calls get sunk to the return block. -; We would previously not sink calls without uses, see PR41259. -; CHECK-LABEL: @test_sink_void_calls -; CHECK-NOT: call -; CHECK-LABEL: return: -; CHECK: phi -; CHECK: call -; CHECK-NOT: call -; CHECK: ret -} - - -; CHECK: ![[$TBAA]] = !{![[TYPE:[0-9]]], ![[TYPE]], i64 0} -; CHECK: ![[TYPE]] = !{!"float", ![[TEXT:[0-9]]]} -; CHECK: ![[TEXT]] = !{!"an example type tree"} diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-call.ll b/llvm/test/Transforms/SimplifyCFG/speculate-call.ll deleted file mode 100644 index 6e9398b6203..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-call.ll +++ /dev/null @@ -1,23 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -; CHECK-LABEL: @speculatable_attribute -; CHECK: select -define i32 @speculatable_attribute(i32 %a) { -entry: - %c = icmp sgt i32 %a, 64 - br i1 %c, label %end, label %if - -if: - %val = call i32 @func() #0 - br label %end - -end: - %ret = phi i32 [%val, %if], [0, %entry] - ret i32 %ret -} - -define i32 @func() #0 { - ret i32 1 -} -attributes #0 = { nounwind readnone speculatable } - diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-dbgvalue.ll b/llvm/test/Transforms/SimplifyCFG/speculate-dbgvalue.ll deleted file mode 100644 index 552bb42c83b..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-dbgvalue.ll +++ /dev/null @@ -1,83 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -S -simplifycfg | FileCheck %s - -; This test case was generated from speculate-dbgvalue.c: -; -; int test1(int getdirt, int dirt) { -; int result = 100; -; if (getdirt != 0) -; result = dirt; -; return result; -; } -; -; using -; clang speculate-dbgvalue.c -S -emit-llvm -g -O3 -mllvm -disable-llvm-optzns -o - | opt -mem2reg -S - - -; Function Attrs: nounwind uwtable -define i32 @test1(i32 %getdirt, i32 %dirt) #0 !dbg !7 { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[GETDIRT:%.*]], metadata !12, metadata !DIExpression()), !dbg !15 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[DIRT:%.*]], metadata !13, metadata !DIExpression()), !dbg !16 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 100, metadata !14, metadata !DIExpression()), !dbg !17 -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[GETDIRT]], 0, !dbg !18 -; *** We used to get an incorrect "call void @llvm.dbg.value(metadata i32 [[DIRT]], metadata !14, metadata !DIExpression()), !dbg !17" here, before the select. *** -; CHECK-NOT: call void @llvm.dbg.value(metadata i32 [[DIRT]], metadata !14 -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP]], i32 [[DIRT]], i32 100, !dbg !20 -; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[RESULT]], metadata !14, metadata !DIExpression()), !dbg !17 -; CHECK-NEXT: ret i32 [[RESULT]], !dbg !21 -; CHECK: !12 = !DILocalVariable(name: "getdirt" -; CHECK: !13 = !DILocalVariable(name: "dirt" -; CHECK: !14 = !DILocalVariable(name: "result" -; -entry: - call void @llvm.dbg.value(metadata i32 %getdirt, metadata !12, metadata !DIExpression()), !dbg !15 - call void @llvm.dbg.value(metadata i32 %dirt, metadata !13, metadata !DIExpression()), !dbg !16 - call void @llvm.dbg.value(metadata i32 100, metadata !14, metadata !DIExpression()), !dbg !17 - %cmp = icmp ne i32 %getdirt, 0, !dbg !18 - br i1 %cmp, label %if.then, label %if.end, !dbg !20 - -if.then: ; preds = %entry - call void @llvm.dbg.value(metadata i32 %dirt, metadata !14, metadata !DIExpression()), !dbg !17 - br label %if.end, !dbg !21 - -if.end: ; preds = %if.then, %entry - %result.0 = phi i32 [ %dirt, %if.then ], [ 100, %entry ] - call void @llvm.dbg.value(metadata i32 %result.0, metadata !14, metadata !DIExpression()), !dbg !17 - ret i32 %result.0, !dbg !22 -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.value(metadata, metadata, metadata) #1 - -attributes #0 = { nounwind uwtable } -attributes #1 = { nounwind readnone speculatable } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3, !4, !5} -!llvm.ident = !{!6} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) -!1 = !DIFile(filename: "speculate-dbgvalue.c", directory: "/foo") -!2 = !{} -!3 = !{i32 2, !"Dwarf Version", i32 4} -!4 = !{i32 2, !"Debug Info Version", i32 3} -!5 = !{i32 1, !"wchar_size", i32 4} -!6 = !{!"clang version 6.0.0"} -!7 = distinct !DISubprogram(name: "test1", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !11) -!8 = !DISubroutineType(types: !9) -!9 = !{!10, !10, !10} -!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!11 = !{!12, !13, !14} -!12 = !DILocalVariable(name: "getdirt", arg: 1, scope: !7, file: !1, line: 1, type: !10) -!13 = !DILocalVariable(name: "dirt", arg: 2, scope: !7, file: !1, line: 1, type: !10) -!14 = !DILocalVariable(name: "result", scope: !7, file: !1, line: 2, type: !10) -!15 = !DILocation(line: 1, column: 15, scope: !7) -!16 = !DILocation(line: 1, column: 28, scope: !7) -!17 = !DILocation(line: 2, column: 7, scope: !7) -!18 = !DILocation(line: 3, column: 15, scope: !19) -!19 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 7) -!20 = !DILocation(line: 3, column: 7, scope: !7) -!21 = !DILocation(line: 4, column: 5, scope: !19) -!22 = !DILocation(line: 5, column: 3, scope: !7) diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-math.ll b/llvm/test/Transforms/SimplifyCFG/speculate-math.ll deleted file mode 100644 index 87e01663edf..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-math.ll +++ /dev/null @@ -1,165 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s --check-prefix=EXPENSIVE --check-prefix=ALL -; RUN: opt -S -simplifycfg -speculate-one-expensive-inst=false < %s | FileCheck %s --check-prefix=CHEAP --check-prefix=ALL - -declare float @llvm.sqrt.f32(float) nounwind readonly -declare float @llvm.fma.f32(float, float, float) nounwind readonly -declare float @llvm.fmuladd.f32(float, float, float) nounwind readonly -declare float @llvm.fabs.f32(float) nounwind readonly -declare float @llvm.minnum.f32(float, float) nounwind readonly -declare float @llvm.maxnum.f32(float, float) nounwind readonly -declare float @llvm.minimum.f32(float, float) nounwind readonly -declare float @llvm.maximum.f32(float, float) nounwind readonly - -; ALL-LABEL: @fdiv_test( -; EXPENSIVE: select i1 %cmp, double %div, double 0.0 -; CHEAP-NOT: select - -define double @fdiv_test(double %a, double %b) { -entry: - %cmp = fcmp ogt double %a, 0.0 - br i1 %cmp, label %cond.true, label %cond.end - -cond.true: - %div = fdiv double %b, %a - br label %cond.end - -cond.end: - %cond = phi double [ %div, %cond.true ], [ 0.0, %entry ] - ret double %cond -} - -; ALL-LABEL: @sqrt_test( -; ALL: select -define void @sqrt_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_sqrt.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.sqrt.f32(float %a) nounwind readnone - br label %test_sqrt.exit - -test_sqrt.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @fabs_test( -; ALL: select -define void @fabs_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_fabs.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.fabs.f32(float %a) nounwind readnone - br label %test_fabs.exit - -test_fabs.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @fma_test( -; ALL: select -define void @fma_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_fma.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.fma.f32(float %a, float %b, float %c) nounwind readnone - br label %test_fma.exit - -test_fma.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @fmuladd_test( -; ALL: select -define void @fmuladd_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_fmuladd.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.fmuladd.f32(float %a, float %b, float %c) nounwind readnone - br label %test_fmuladd.exit - -test_fmuladd.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @minnum_test( -; ALL: select -define void @minnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_minnum.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.minnum.f32(float %a, float %b) nounwind readnone - br label %test_minnum.exit - -test_minnum.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @maxnum_test( -; ALL: select -define void @maxnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_maxnum.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.maxnum.f32(float %a, float %b) nounwind readnone - br label %test_maxnum.exit - -test_maxnum.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @minimum_test( -; ALL: select -define void @minimum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_minimum.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.minimum.f32(float %a, float %b) nounwind readnone - br label %test_minimum.exit - -test_minimum.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} - -; ALL-LABEL: @maximum_test( -; ALL: select -define void @maximum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { -entry: - %cmp.i = fcmp olt float %a, 0.000000e+00 - br i1 %cmp.i, label %test_maximum.exit, label %cond.else.i - -cond.else.i: ; preds = %entry - %0 = tail call float @llvm.maximum.f32(float %a, float %b) nounwind readnone - br label %test_maximum.exit - -test_maximum.exit: ; preds = %cond.else.i, %entry - %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] - store float %cond.i, float addrspace(1)* %out, align 4 - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-store.ll b/llvm/test/Transforms/SimplifyCFG/speculate-store.ll deleted file mode 100644 index 497e024e248..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-store.ll +++ /dev/null @@ -1,90 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -define void @ifconvertstore(i32* %A, i32 %B, i32 %C, i32 %D) { -; CHECK-LABEL: @ifconvertstore( -; CHECK: store i32 %B, i32* %A -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 %D, 42 -; CHECK-NEXT: [[C_B:%.*]] = select i1 [[CMP]], i32 %C, i32 %B, !prof !0 -; CHECK-NEXT: store i32 [[C_B]], i32* %A -; CHECK-NEXT: ret void -; -entry: -; First store to the location. - store i32 %B, i32* %A - %cmp = icmp sgt i32 %D, 42 - br i1 %cmp, label %if.then, label %ret.end, !prof !0 - -; Make sure we speculate stores like the following one. It is cheap compared to -; a mispredicated branch. -if.then: - store i32 %C, i32* %A - br label %ret.end - -ret.end: - ret void -} - -; Store to a different location. - -define void @noifconvertstore1(i32* %A1, i32* %A2, i32 %B, i32 %C, i32 %D) { -; CHECK-LABEL: @noifconvertstore1( -; CHECK-NOT: select -; -entry: - store i32 %B, i32* %A1 - %cmp = icmp sgt i32 %D, 42 - br i1 %cmp, label %if.then, label %ret.end - -if.then: - store i32 %C, i32* %A2 - br label %ret.end - -ret.end: - ret void -} - -; This function could store to our address, so we can't repeat the first store a second time. -declare void @unknown_fun() - -define void @noifconvertstore2(i32* %A, i32 %B, i32 %C, i32 %D) { -; CHECK-LABEL: @noifconvertstore2( -; CHECK-NOT: select -; -entry: -; First store to the location. - store i32 %B, i32* %A - call void @unknown_fun() - %cmp6 = icmp sgt i32 %D, 42 - br i1 %cmp6, label %if.then, label %ret.end - -if.then: - store i32 %C, i32* %A - br label %ret.end - -ret.end: - ret void -} - -; Make sure we don't speculate volatile stores. - -define void @noifconvertstore_volatile(i32* %A, i32 %B, i32 %C, i32 %D) { -; CHECK-LABEL: @noifconvertstore_volatile( -; CHECK-NOT: select -; -entry: -; First store to the location. - store i32 %B, i32* %A - %cmp6 = icmp sgt i32 %D, 42 - br i1 %cmp6, label %if.then, label %ret.end - -if.then: - store volatile i32 %C, i32* %A - br label %ret.end - -ret.end: - ret void -} - -; CHECK: !0 = !{!"branch_weights", i32 3, i32 5} -!0 = !{!"branch_weights", i32 3, i32 5} - diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-vector-ops.ll b/llvm/test/Transforms/SimplifyCFG/speculate-vector-ops.ll deleted file mode 100644 index 91972eb5dd9..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-vector-ops.ll +++ /dev/null @@ -1,60 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -define i32 @speculate_vector_extract(i32 %d, <4 x i32> %v) #0 { -; CHECK-LABEL: @speculate_vector_extract( -; CHECK-NOT: br -entry: - %conv = insertelement <4 x i32> undef, i32 %d, i32 0 - %conv2 = insertelement <4 x i32> %conv, i32 %d, i32 1 - %conv3 = insertelement <4 x i32> %conv2, i32 %d, i32 2 - %conv4 = insertelement <4 x i32> %conv3, i32 %d, i32 3 - %tmp6 = add nsw <4 x i32> %conv4, <i32 0, i32 -1, i32 -2, i32 -3> - %cmp = icmp eq <4 x i32> %tmp6, zeroinitializer - %cmp.ext = sext <4 x i1> %cmp to <4 x i32> - %tmp8 = extractelement <4 x i32> %cmp.ext, i32 0 - %tobool = icmp eq i32 %tmp8, 0 - br i1 %tobool, label %cond.else, label %cond.then - -return: ; preds = %cond.end28 - ret i32 %cond32 - -cond.then: ; preds = %entry - %tmp10 = extractelement <4 x i32> %v, i32 0 - br label %cond.end - -cond.else: ; preds = %entry - %tmp12 = extractelement <4 x i32> %v, i32 3 - br label %cond.end - -cond.end: ; preds = %cond.else, %cond.then - %cond = phi i32 [ %tmp10, %cond.then ], [ %tmp12, %cond.else ] - %tmp14 = extractelement <4 x i32> %cmp.ext, i32 1 - %tobool15 = icmp eq i32 %tmp14, 0 - br i1 %tobool15, label %cond.else17, label %cond.then16 - -cond.then16: ; preds = %cond.end - %tmp20 = extractelement <4 x i32> %v, i32 1 - br label %cond.end18 - -cond.else17: ; preds = %cond.end - br label %cond.end18 - -cond.end18: ; preds = %cond.else17, %cond.then16 - %cond22 = phi i32 [ %tmp20, %cond.then16 ], [ %cond, %cond.else17 ] - %tmp24 = extractelement <4 x i32> %cmp.ext, i32 2 - %tobool25 = icmp eq i32 %tmp24, 0 - br i1 %tobool25, label %cond.else27, label %cond.then26 - -cond.then26: ; preds = %cond.end18 - %tmp30 = extractelement <4 x i32> %v, i32 2 - br label %cond.end28 - -cond.else27: ; preds = %cond.end18 - br label %cond.end28 - -cond.end28: ; preds = %cond.else27, %cond.then26 - %cond32 = phi i32 [ %tmp30, %cond.then26 ], [ %cond22, %cond.else27 ] - br label %return -} - -attributes #0 = { nounwind } diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-with-offset.ll b/llvm/test/Transforms/SimplifyCFG/speculate-with-offset.ll deleted file mode 100644 index 65ebb5c2c3f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/speculate-with-offset.ll +++ /dev/null @@ -1,94 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s - -; This load is safe to speculate, as it's from a safe offset -; within an alloca. - -; CHECK-LABEL: @yes( -; CHECK-NOT: br - -define void @yes(i1 %c) nounwind { -entry: - %a = alloca [4 x i64*], align 8 - %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 3 - call void @frob(i64** %__a.addr) - br i1 %c, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - %tmp5 = load i64*, i64** %__a.addr, align 8 - br label %return - -return: ; preds = %if.end, %if.then - %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ] - ret void -} - -; CHECK-LABEL: @no0( -; CHECK: br i1 %c - -define void @no0(i1 %c) nounwind { -entry: - %a = alloca [4 x i64*], align 8 - %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 4 - call void @frob(i64** %__a.addr) - br i1 %c, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - %tmp5 = load i64*, i64** %__a.addr, align 8 - br label %return - -return: ; preds = %if.end, %if.then - %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ] - ret void -} - -; CHECK-LABEL: @no1( -; CHECK: br i1 %c - -define void @no1(i1 %c, i64 %n) nounwind { -entry: - %a = alloca [4 x i64*], align 8 - %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 %n - call void @frob(i64** %__a.addr) - br i1 %c, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - %tmp5 = load i64*, i64** %__a.addr, align 8 - br label %return - -return: ; preds = %if.end, %if.then - %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ] - ret void -} - -; CHECK-LABEL: @no2( -; CHECK: br i1 %c - -define void @no2(i1 %c, i64 %n) nounwind { -entry: - %a = alloca [4 x i64*], align 8 - %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 1, i64 0 - call void @frob(i64** %__a.addr) - br i1 %c, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - %tmp5 = load i64*, i64** %__a.addr, align 8 - br label %return - -return: ; preds = %if.end, %if.then - %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ] - ret void -} - -declare void @frob(i64** nocapture %p) diff --git a/llvm/test/Transforms/SimplifyCFG/statepoint-invoke-unwind.ll b/llvm/test/Transforms/SimplifyCFG/statepoint-invoke-unwind.ll deleted file mode 100644 index 53daa8292da..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/statepoint-invoke-unwind.ll +++ /dev/null @@ -1,24 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; Test that statepoint intrinsic is marked with Throwable attribute and it is -; not optimized into call - -declare i64 addrspace(1)* @gc_call() -declare token @llvm.experimental.gc.statepoint.p0f_p1i64f(i64, i32, i64 addrspace(1)* ()*, i32, i32, ...) -declare i32* @fake_personality_function() - -define i32 @test() gc "statepoint-example" personality i32* ()* @fake_personality_function { -; CHECK-LABEL: test -entry: - ; CHECK-LABEL: entry: - ; CHECK-NEXT: %sp = invoke token (i64, i32, i64 addrspace(1)* ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i64f - %sp = invoke token (i64, i32, i64 addrspace(1)* ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i64f(i64 0, i32 0, i64 addrspace(1)* ()* @gc_call, i32 0, i32 0, i32 0, i32 0) - to label %normal unwind label %exception - -exception: - %lpad = landingpad { i8*, i32 } - cleanup - ret i32 0 - -normal: - ret i32 1 -} diff --git a/llvm/test/Transforms/SimplifyCFG/suppress-zero-branch-weights.ll b/llvm/test/Transforms/SimplifyCFG/suppress-zero-branch-weights.ll deleted file mode 100644 index b4f546ede7e..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/suppress-zero-branch-weights.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -; We're sign extending an 8-bit value. -; The switch condition must be in the range [-128, 127], so any cases outside of that range must be dead. -; Only the first case has a non-zero weight, but that gets eliminated. Note -; that this shouldn't have been the case in the first place, but the test here -; ensures that all-zero branch weights are not attached causing problems downstream. - -define i1 @repeated_signbits(i8 %condition) { -; CHECK-LABEL: @repeated_signbits( -; CHECK: switch i32 -; CHECK-DAG: i32 -128, label %a -; CHECK-DAG: i32 -1, label %a -; CHECK-DAG: i32 0, label %a -; CHECK-DAG: i32 127, label %a -; CHECK-NEXT: ] -; CHECK-NOT: , !prof -; -entry: - %sext = sext i8 %condition to i32 - switch i32 %sext, label %default [ - i32 -2147483648, label %a - i32 -129, label %a - i32 -128, label %a - i32 -1, label %a - i32 0, label %a - i32 127, label %a - i32 128, label %a - i32 2147483647, label %a - ], !prof !1 - -a: - ret i1 1 - -default: - ret i1 0 -} - -!1 = !{!"branch_weights", i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll b/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll deleted file mode 100644 index e5c2ef65b31..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll +++ /dev/null @@ -1,179 +0,0 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s -declare void @foo(i32) - -define void @test(i1 %a) { -; CHECK-LABEL: @test -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false - switch i1 %a, label %default [i1 1, label %true - i1 0, label %false] -true: - call void @foo(i32 1) - ret void -false: - call void @foo(i32 3) - ret void -default: - call void @foo(i32 2) - ret void -} - -define void @test2(i2 %a) { -; CHECK-LABEL: @test2 - switch i2 %a, label %default [i2 0, label %case0 - i2 1, label %case1 - i2 2, label %case2 - i2 3, label %case3] -case0: - call void @foo(i32 0) - ret void -case1: - call void @foo(i32 1) - ret void -case2: - call void @foo(i32 2) - ret void -case3: - call void @foo(i32 3) - ret void -default: -; CHECK-LABEL: default1: -; CHECK-NEXT: unreachable - call void @foo(i32 4) - ret void -} - -; This one is a negative test - we know the value of the default, -; but that's about it -define void @test3(i2 %a) { -; CHECK-LABEL: @test3 - switch i2 %a, label %default [i2 0, label %case0 - i2 1, label %case1 - i2 2, label %case2] - -case0: - call void @foo(i32 0) - ret void -case1: - call void @foo(i32 1) - ret void -case2: - call void @foo(i32 2) - ret void -default: -; CHECK-LABEL: default: -; CHECK-NEXT: call void @foo - call void @foo(i32 0) - ret void -} - -; Negative test - check for possible overflow when computing -; number of possible cases. -define void @test4(i128 %a) { -; CHECK-LABEL: @test4 - switch i128 %a, label %default [i128 0, label %case0 - i128 1, label %case1] - -case0: - call void @foo(i32 0) - ret void -case1: - call void @foo(i32 1) - ret void -default: -; CHECK-LABEL: default: -; CHECK-NEXT: call void @foo - call void @foo(i32 0) - ret void -} - -; All but one bit known zero -define void @test5(i8 %a) { -; CHECK-LABEL: @test5 -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false - %cmp = icmp ult i8 %a, 2 - call void @llvm.assume(i1 %cmp) - switch i8 %a, label %default [i8 1, label %true - i8 0, label %false] -true: - call void @foo(i32 1) - ret void -false: - call void @foo(i32 3) - ret void -default: - call void @foo(i32 2) - ret void -} - -;; All but one bit known one -define void @test6(i8 %a) { -; CHECK-LABEL: @test6 -; CHECK: @llvm.assume -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false - %and = and i8 %a, 254 - %cmp = icmp eq i8 %and, 254 - call void @llvm.assume(i1 %cmp) - switch i8 %a, label %default [i8 255, label %true - i8 254, label %false] -true: - call void @foo(i32 1) - ret void -false: - call void @foo(i32 3) - ret void -default: - call void @foo(i32 2) - ret void -} - -; Check that we can eliminate both dead cases and dead defaults -; within a single run of simplify-cfg -define void @test7(i8 %a) { -; CHECK-LABEL: @test7 -; CHECK: @llvm.assume -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false - %and = and i8 %a, 254 - %cmp = icmp eq i8 %and, 254 - call void @llvm.assume(i1 %cmp) - switch i8 %a, label %default [i8 255, label %true - i8 254, label %false - i8 0, label %also_dead] -true: - call void @foo(i32 1) - ret void -false: - call void @foo(i32 3) - ret void -also_dead: - call void @foo(i32 5) - ret void -default: - call void @foo(i32 2) - ret void -} - -;; All but one bit known undef -;; Note: This is currently testing an optimization which doesn't trigger. The -;; case this is protecting against is that a bit could be assumed both zero -;; *or* one given we know it's undef. ValueTracking doesn't do this today, -;; but it doesn't hurt to confirm. -define void @test8(i8 %a) { -; CHECK-LABEL: @test8( -; CHECK: switch i8 - %and = and i8 %a, 254 - %cmp = icmp eq i8 %and, undef - call void @llvm.assume(i1 %cmp) - switch i8 %a, label %default [i8 255, label %true - i8 254, label %false] -true: - call void @foo(i32 1) - ret void -false: - call void @foo(i32 3) - ret void -default: - call void @foo(i32 2) - ret void -} - -declare void @llvm.assume(i1) diff --git a/llvm/test/Transforms/SimplifyCFG/switch-masked-bits.ll b/llvm/test/Transforms/SimplifyCFG/switch-masked-bits.ll deleted file mode 100644 index 2d46aac23f6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-masked-bits.ll +++ /dev/null @@ -1,77 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -define i32 @test1(i32 %x) nounwind { -; CHECK-LABEL: @test1( -; CHECK-NEXT: a: -; CHECK-NEXT: [[I:%.*]] = shl i32 %x, 1 -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I]], 24 -; CHECK-NEXT: [[DOT:%.*]] = select i1 [[COND]], i32 5, i32 0 -; CHECK-NEXT: ret i32 [[DOT]] -; - %i = shl i32 %x, 1 - switch i32 %i, label %a [ - i32 21, label %b - i32 24, label %c - ] - -a: - ret i32 0 -b: - ret i32 3 -c: - ret i32 5 -} - - -define i32 @test2(i32 %x) nounwind { -; CHECK-LABEL: @test2( -; CHECK-NEXT: a: -; CHECK-NEXT: ret i32 0 -; - %i = shl i32 %x, 1 - switch i32 %i, label %a [ - i32 21, label %b - i32 23, label %c - ] - -a: - ret i32 0 -b: - ret i32 3 -c: - ret i32 5 -} - -; We're sign extending an 8-bit value. -; The switch condition must be in the range [-128, 127], so any cases outside of that range must be dead. - -define i1 @repeated_signbits(i8 %condition) { -; CHECK-LABEL: @repeated_signbits( -; CHECK: switch i32 -; CHECK-DAG: i32 -128, label %a -; CHECK-DAG: i32 -1, label %a -; CHECK-DAG: i32 0, label %a -; CHECK-DAG: i32 127, label %a -; CHECK-NEXT: ] -; -entry: - %sext = sext i8 %condition to i32 - switch i32 %sext, label %default [ - i32 -2147483648, label %a - i32 -129, label %a - i32 -128, label %a - i32 -1, label %a - i32 0, label %a - i32 127, label %a - i32 128, label %a - i32 2147483647, label %a - ] - -a: - ret i1 1 - -default: - ret i1 0 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll b/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll deleted file mode 100644 index 165e5b264ae..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll +++ /dev/null @@ -1,141 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck -enable-var-scope %s - -; Test basic folding to a conditional branch. -define i32 @foo(i64 %x, i64 %y) nounwind { -; CHECK-LABEL: @foo( -entry: - %eq = icmp eq i64 %x, %y - br i1 %eq, label %b, label %switch -switch: - %lt = icmp slt i64 %x, %y -; CHECK: br i1 %lt, label %a, label %b - %qux = select i1 %lt, i32 0, i32 2 - switch i32 %qux, label %bees [ - i32 0, label %a - i32 1, label %b - i32 2, label %b - ] -a: - tail call void @bees.a() nounwind - ret i32 1 -; CHECK: b: -; CHECK-NEXT: %retval = phi i32 [ 0, %switch ], [ 2, %entry ] -b: - %retval = phi i32 [0, %switch], [0, %switch], [2, %entry] - tail call void @bees.b() nounwind - ret i32 %retval -; CHECK-NOT: bees: -bees: - tail call void @llvm.trap() nounwind - unreachable -} - -; Test basic folding to an unconditional branch. -define i32 @bar(i64 %x, i64 %y) nounwind { -; CHECK-LABEL: @bar( -entry: -; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.a() [[$NUW:#[0-9]+]] -; CHECK-NEXT: ret i32 0 - %lt = icmp slt i64 %x, %y - %qux = select i1 %lt, i32 0, i32 2 - switch i32 %qux, label %bees [ - i32 0, label %a - i32 1, label %b - i32 2, label %a - ] -a: - %retval = phi i32 [0, %entry], [0, %entry], [1, %b] - tail call void @bees.a() nounwind - ret i32 0 -b: - tail call void @bees.b() nounwind - br label %a -bees: - tail call void @llvm.trap() nounwind - unreachable -} - -; Test the edge case where both values from the select are the default case. -define void @bazz(i64 %x, i64 %y) nounwind { -; CHECK-LABEL: @bazz( -entry: -; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.b() [[$NUW]] -; CHECK-NEXT: ret void - %lt = icmp slt i64 %x, %y - %qux = select i1 %lt, i32 10, i32 12 - switch i32 %qux, label %b [ - i32 0, label %a - i32 1, label %bees - i32 2, label %bees - ] -a: - tail call void @bees.a() nounwind - ret void -b: - tail call void @bees.b() nounwind - ret void -bees: - tail call void @llvm.trap() - unreachable -} - -; Test the edge case where both values from the select are equal. -define void @quux(i64 %x, i64 %y) nounwind { -; CHECK-LABEL: @quux( -entry: -; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.a() [[$NUW]] -; CHECK-NEXT: ret void - %lt = icmp slt i64 %x, %y - %qux = select i1 %lt, i32 0, i32 0 - switch i32 %qux, label %b [ - i32 0, label %a - i32 1, label %bees - i32 2, label %bees - ] -a: - tail call void @bees.a() nounwind - ret void -b: - tail call void @bees.b() nounwind - ret void -bees: - tail call void @llvm.trap() - unreachable -} - -; A final test, for phi node munging. -define i32 @xyzzy(i64 %x, i64 %y) { -; CHECK-LABEL: @xyzzy( -entry: - %eq = icmp eq i64 %x, %y - br i1 %eq, label %r, label %cont -cont: -; CHECK: %lt = icmp slt i64 %x, %y - %lt = icmp slt i64 %x, %y -; CHECK-NEXT: select i1 %lt, i32 -1, i32 1 - %qux = select i1 %lt, i32 0, i32 2 - switch i32 %qux, label %bees [ - i32 0, label %a - i32 1, label %r - i32 2, label %r - ] -r: - %val = phi i32 [0, %entry], [1, %cont], [1, %cont] - ret i32 %val -a: - ret i32 -1 -; CHECK-NOT: bees: -bees: - tail call void @llvm.trap() - unreachable -} - -declare void @llvm.trap() nounwind noreturn -declare void @bees.a() nounwind -declare void @bees.b() nounwind - -; CHECK: attributes [[$NUW]] = { nounwind } -; CHECK: attributes #1 = { cold noreturn nounwind } diff --git a/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll b/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll deleted file mode 100644 index a109b317c73..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll +++ /dev/null @@ -1,77 +0,0 @@ -; RUN: opt %s -simplifycfg -S | FileCheck %s - -declare i32 @f(i32) - -define i32 @basic(i32 %x) { -; CHECK-LABEL: @basic -; CHECK: x.off = add i32 %x, -5 -; CHECK: %switch = icmp ult i32 %x.off, 3 -; CHECK: br i1 %switch, label %a, label %default - -entry: - switch i32 %x, label %default [ - i32 5, label %a - i32 6, label %a - i32 7, label %a - ] -default: - %0 = call i32 @f(i32 0) - ret i32 %0 -a: - %1 = call i32 @f(i32 1) - ret i32 %1 -} - - -define i32 @unreachable(i32 %x) { -; CHECK-LABEL: @unreachable -; CHECK: x.off = add i32 %x, -5 -; CHECK: %switch = icmp ult i32 %x.off, 3 -; CHECK: br i1 %switch, label %a, label %b - -entry: - switch i32 %x, label %unreachable [ - i32 5, label %a - i32 6, label %a - i32 7, label %a - i32 10, label %b - i32 20, label %b - i32 30, label %b - i32 40, label %b - ] -unreachable: - unreachable -a: - %0 = call i32 @f(i32 0) - ret i32 %0 -b: - %1 = call i32 @f(i32 1) - ret i32 %1 -} - - -define i32 @unreachable2(i32 %x) { -; CHECK-LABEL: @unreachable2 -; CHECK: x.off = add i32 %x, -5 -; CHECK: %switch = icmp ult i32 %x.off, 3 -; CHECK: br i1 %switch, label %a, label %b - -entry: - ; Note: folding the most popular case destination into the default - ; would prevent switch-to-icmp here. - switch i32 %x, label %unreachable [ - i32 5, label %a - i32 6, label %a - i32 7, label %a - i32 10, label %b - i32 20, label %b - ] -unreachable: - unreachable -a: - %0 = call i32 @f(i32 0) - ret i32 %0 -b: - %1 = call i32 @f(i32 1) - ret i32 %1 -} diff --git a/llvm/test/Transforms/SimplifyCFG/switch-simplify-crash.ll b/llvm/test/Transforms/SimplifyCFG/switch-simplify-crash.ll deleted file mode 100644 index bbc0bd78da7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-simplify-crash.ll +++ /dev/null @@ -1,108 +0,0 @@ -; RUN: opt < %s -simplifycfg -disable-output - -define void @NewExtractNames() { -entry: - br i1 false, label %endif.0, label %then.0 -then.0: ; preds = %entry - br i1 false, label %shortcirc_next.i, label %shortcirc_done.i -shortcirc_next.i: ; preds = %then.0 - br label %shortcirc_done.i -shortcirc_done.i: ; preds = %shortcirc_next.i, %then.0 - br i1 false, label %then.0.i, label %else.0.i -then.0.i: ; preds = %shortcirc_done.i - br label %NewBase.exit -else.0.i: ; preds = %shortcirc_done.i - br i1 false, label %endif.0.i, label %else.1.i -else.1.i: ; preds = %else.0.i - br i1 false, label %endif.0.i, label %else.2.i -else.2.i: ; preds = %else.1.i - br label %NewBase.exit -endif.0.i: ; preds = %else.1.i, %else.0.i - br label %NewBase.exit -NewBase.exit: ; preds = %endif.0.i, %else.2.i, %then.0.i - br label %endif.0 -endif.0: ; preds = %NewBase.exit, %entry - %tmp.32.mask = and i32 0, 31 ; <i32> [#uses=1] - switch i32 %tmp.32.mask, label %label.9 [ - i32 16, label %loopentry.2 - i32 15, label %loopentry.2 - i32 14, label %loopentry.2 - i32 13, label %loopentry.2 - i32 10, label %loopentry.2 - i32 20, label %loopentry.1 - i32 19, label %loopentry.1 - i32 2, label %loopentry.0 - i32 0, label %switchexit - ] -loopentry.0: ; preds = %endif.1, %endif.0 - br i1 false, label %no_exit.0, label %switchexit -no_exit.0: ; preds = %loopentry.0 - br i1 false, label %then.1, label %else.1 -then.1: ; preds = %no_exit.0 - br label %endif.1 -else.1: ; preds = %no_exit.0 - br i1 false, label %shortcirc_next.0, label %shortcirc_done.0 -shortcirc_next.0: ; preds = %else.1 - br label %shortcirc_done.0 -shortcirc_done.0: ; preds = %shortcirc_next.0, %else.1 - br i1 false, label %then.2, label %endif.2 -then.2: ; preds = %shortcirc_done.0 - br label %endif.2 -endif.2: ; preds = %then.2, %shortcirc_done.0 - br label %endif.1 -endif.1: ; preds = %endif.2, %then.1 - br label %loopentry.0 -loopentry.1: ; preds = %endif.3, %endif.0, %endif.0 - br i1 false, label %no_exit.1, label %switchexit -no_exit.1: ; preds = %loopentry.1 - br i1 false, label %then.3, label %else.2 -then.3: ; preds = %no_exit.1 - br label %endif.3 -else.2: ; preds = %no_exit.1 - br i1 false, label %shortcirc_next.1, label %shortcirc_done.1 -shortcirc_next.1: ; preds = %else.2 - br label %shortcirc_done.1 -shortcirc_done.1: ; preds = %shortcirc_next.1, %else.2 - br i1 false, label %then.4, label %endif.4 -then.4: ; preds = %shortcirc_done.1 - br label %endif.4 -endif.4: ; preds = %then.4, %shortcirc_done.1 - br label %endif.3 -endif.3: ; preds = %endif.4, %then.3 - br label %loopentry.1 -loopentry.2: ; preds = %endif.5, %endif.0, %endif.0, %endif.0, %endif.0, %endif.0 - %i.3 = phi i32 [ 0, %endif.5 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ] ; <i32> [#uses=1] - %tmp.158 = icmp slt i32 %i.3, 0 ; <i1> [#uses=1] - br i1 %tmp.158, label %no_exit.2, label %switchexit -no_exit.2: ; preds = %loopentry.2 - br i1 false, label %shortcirc_next.2, label %shortcirc_done.2 -shortcirc_next.2: ; preds = %no_exit.2 - br label %shortcirc_done.2 -shortcirc_done.2: ; preds = %shortcirc_next.2, %no_exit.2 - br i1 false, label %then.5, label %endif.5 -then.5: ; preds = %shortcirc_done.2 - br label %endif.5 -endif.5: ; preds = %then.5, %shortcirc_done.2 - br label %loopentry.2 -label.9: ; preds = %endif.0 - br i1 false, label %then.6, label %endif.6 -then.6: ; preds = %label.9 - br label %endif.6 -endif.6: ; preds = %then.6, %label.9 - store i32 0, i32* null - br label %switchexit -switchexit: ; preds = %endif.6, %loopentry.2, %loopentry.1, %loopentry.0, %endif.0 - br i1 false, label %endif.7, label %then.7 -then.7: ; preds = %switchexit - br i1 false, label %shortcirc_next.3, label %shortcirc_done.3 -shortcirc_next.3: ; preds = %then.7 - br label %shortcirc_done.3 -shortcirc_done.3: ; preds = %shortcirc_next.3, %then.7 - br i1 false, label %then.8, label %endif.8 -then.8: ; preds = %shortcirc_done.3 - br label %endif.8 -endif.8: ; preds = %then.8, %shortcirc_done.3 - br label %endif.7 -endif.7: ; preds = %endif.8, %switchexit - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/switch-to-br.ll b/llvm/test/Transforms/SimplifyCFG/switch-to-br.ll deleted file mode 100644 index 01484cda98b..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-to-br.ll +++ /dev/null @@ -1,64 +0,0 @@ -; RUN: opt %s -simplifycfg -S | FileCheck %s - -declare i32 @f(i32) - -define i32 @basic(i32 %x) { -; CHECK-LABEL: @basic -; CHECK-LABEL: entry: -; CHECK-NEXT: call i32 @f(i32 0) -; CHECK-NEXT: ret i32 %0 - -entry: - switch i32 %x, label %default [ - i32 5, label %default - i32 6, label %default - i32 7, label %default - ] -default: - %0 = call i32 @f(i32 0) - ret i32 %0 -} - - -define i32 @constant() { -; CHECK-LABEL: @constant -; CHECK-LABEL: entry: -; CHECK-NEXT: call i32 @f(i32 1) -; CHECK-NEXT: ret i32 %0 - -entry: - switch i32 42, label %default [ - i32 41, label %default - i32 42, label %a - i32 43, label %b - ] -default: - %0 = call i32 @f(i32 0) - ret i32 %0 -a: - %1 = call i32 @f(i32 1) - ret i32 %1 -b: - %2 = call i32 @f(i32 2) - ret i32 %2 -} - - -define i32 @unreachable(i32 %x) { -; CHECK-LABEL: @unreachable -; CHECK-LABEL: entry: -; CHECK-NEXT: call i32 @f(i32 0) -; CHECK-NEXT: ret i32 %0 - -entry: - switch i32 %x, label %unreachable [ - i32 5, label %a - i32 6, label %a - i32 7, label %a - ] -unreachable: - unreachable -a: - %0 = call i32 @f(i32 0) - ret i32 %0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/switch-to-icmp.ll b/llvm/test/Transforms/SimplifyCFG/switch-to-icmp.ll deleted file mode 100644 index bfacf25ca7f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-to-icmp.ll +++ /dev/null @@ -1,57 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -define zeroext i1 @test1(i32 %x) nounwind readnone ssp noredzone { -entry: - switch i32 %x, label %lor.rhs [ - i32 2, label %lor.end - i32 1, label %lor.end - i32 3, label %lor.end - ] - -lor.rhs: - br label %lor.end - -lor.end: - %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ], [ true, %entry ] - ret i1 %0 - -; CHECK-LABEL: @test1( -; CHECK: %x.off = add i32 %x, -1 -; CHECK: %switch = icmp ult i32 %x.off, 3 -} - -define zeroext i1 @test2(i32 %x) nounwind readnone ssp noredzone { -entry: - switch i32 %x, label %lor.rhs [ - i32 0, label %lor.end - i32 1, label %lor.end - ] - -lor.rhs: - br label %lor.end - -lor.end: - %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ] - ret i1 %0 - -; CHECK-LABEL: @test2( -; CHECK: %switch = icmp ult i32 %x, 2 -} - -define i32 @test3(i1 %flag) { -entry: - switch i1 %flag, label %bad [ - i1 true, label %good - i1 false, label %good - ] - -good: - ret i32 0 - -bad: - ret i32 1 - -; CHECK-LABEL: @test3( -; CHECK: entry: -; CHECK-NEXT: ret i32 0 -} diff --git a/llvm/test/Transforms/SimplifyCFG/switch-to-select-multiple-edge-per-block-phi.ll b/llvm/test/Transforms/SimplifyCFG/switch-to-select-multiple-edge-per-block-phi.ll deleted file mode 100644 index bdc7017f4c7..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-to-select-multiple-edge-per-block-phi.ll +++ /dev/null @@ -1,54 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; a, b; -; fn1() { -; if (b) -; if (a == 0 || a == 5) -; return a; -; return 0; -; } - -; Checking that we handle correctly the case when we have a switch -; branching multiple times to the same block - -@b = common global i32 0, align 4 -@a = common global i32 0, align 4 - -; Function Attrs: nounwind -define i32 @fn1() { -; CHECK-LABEL: @fn1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @b, align 4 -; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP0]], 0 -; CHECK-NEXT: br i1 [[TOBOOL]], label %return, label %if.then -; CHECK: if.then: -; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @a, align 4 -; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 [[TMP1]], 0 -; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP:%.*]], i32 0, i32 0 -; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 [[TMP1]], 5 -; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i32 5, i32 [[SWITCH_SELECT]] -; CHECK-NEXT: br label %return -; CHECK: return: -; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_SELECT2]], %if.then ], [ 0, %entry ] -; CHECK-NEXT: ret i32 [[RETVAL_0]] -; -entry: - %0 = load i32, i32* @b, align 4 - %tobool = icmp eq i32 %0, 0 - br i1 %tobool, label %if.end3, label %if.then - -if.then: - %1 = load i32, i32* @a, align 4 - switch i32 %1, label %if.end3 [ - i32 5, label %return - i32 0, label %return - ] - -if.end3: - br label %return - -return: - %retval.0 = phi i32 [ 0, %if.end3 ], [ %1, %if.then ], [ %1, %if.then ] - ret i32 %retval.0 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch-to-select-two-case.ll b/llvm/test/Transforms/SimplifyCFG/switch-to-select-two-case.ll deleted file mode 100644 index 31f5410bae4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch-to-select-two-case.ll +++ /dev/null @@ -1,41 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; int foo1_with_default(int a) { -; switch(a) { -; case 10: -; return 10; -; case 20: -; return 2; -; } -; return 4; -; } - -define i32 @foo1_with_default(i32 %a) { -; CHECK-LABEL: @foo1_with_default( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 %a, 20 -; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP:%.*]], i32 2, i32 4 -; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 %a, 10 -; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i32 10, i32 [[SWITCH_SELECT]] -; CHECK-NEXT: ret i32 [[SWITCH_SELECT2]] -; -entry: - switch i32 %a, label %sw.epilog [ - i32 10, label %sw.bb - i32 20, label %sw.bb1 - ] - -sw.bb: - br label %return - -sw.bb1: - br label %return - -sw.epilog: - br label %return - -return: - %retval.0 = phi i32 [ 4, %sw.epilog ], [ 2, %sw.bb1 ], [ 10, %sw.bb ] - ret i32 %retval.0 -} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll b/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll deleted file mode 100644 index 7dce54d75d6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll +++ /dev/null @@ -1,660 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -target datalayout="p:40:64:64:32" - -declare void @foo1() - -declare void @foo2() - -define void @test1(i32 %V) { - %C1 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - %C2 = icmp eq i32 %V, 17 ; <i1> [#uses=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( -; 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] - %CN = and 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: @test2( -; CHECK: switch i32 %V, label %T [ -; CHECK: i32 17, label %F -; CHECK: i32 4, label %F -; CHECK: ] -} - -define void @test3(i32 %V) { - %C1 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - br i1 %C1, label %T, label %N -N: ; preds = %0 - %C2 = icmp eq i32 %V, 17 ; <i1> [#uses=1] - br i1 %C2, label %T, label %F -T: ; preds = %N, %0 - call void @foo1( ) - ret void -F: ; preds = %N - call void @foo2( ) - ret void - -; CHECK-LABEL: @test3( -; CHECK: switch i32 %V, label %F [ -; CHECK: i32 4, label %T -; CHECK: i32 17, label %T -; CHECK: ] -} - - - -define i32 @test4(i8 zeroext %c) nounwind ssp noredzone { -entry: - %cmp = icmp eq i8 %c, 62 - br i1 %cmp, label %lor.end, label %lor.lhs.false - -lor.lhs.false: ; preds = %entry - %cmp4 = icmp eq i8 %c, 34 - br i1 %cmp4, label %lor.end, label %lor.rhs - -lor.rhs: ; preds = %lor.lhs.false - %cmp8 = icmp eq i8 %c, 92 - br label %lor.end - -lor.end: ; preds = %lor.rhs, %lor.lhs.false, %entry - %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp8, %lor.rhs ] - %lor.ext = zext i1 %0 to i32 - ret i32 %lor.ext - -; CHECK-LABEL: @test4( -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 62, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 92, label %lor.end -; CHECK: ] -} - -define i32 @test5(i8 zeroext %c) nounwind ssp noredzone { -entry: - switch i8 %c, label %lor.rhs [ - i8 62, label %lor.end - i8 34, label %lor.end - i8 92, label %lor.end - ] - -lor.rhs: ; preds = %entry - %V = icmp eq i8 %c, 92 - br label %lor.end - -lor.end: ; preds = %entry, %entry, %entry, %lor.rhs - %0 = phi i1 [ true, %entry ], [ %V, %lor.rhs ], [ true, %entry ], [ true, %entry ] - %lor.ext = zext i1 %0 to i32 - ret i32 %lor.ext -; CHECK-LABEL: @test5( -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 62, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 92, label %lor.end -; CHECK: ] -} - - -define i1 @test6({ i32, i32 }* %I) { -entry: - %tmp.1.i = getelementptr { i32, i32 }, { i32, i32 }* %I, i64 0, i32 1 ; <i32*> [#uses=1] - %tmp.2.i = load i32, i32* %tmp.1.i ; <i32> [#uses=6] - %tmp.2 = icmp eq i32 %tmp.2.i, 14 ; <i1> [#uses=1] - br i1 %tmp.2, label %shortcirc_done.4, label %shortcirc_next.0 -shortcirc_next.0: ; preds = %entry - %tmp.6 = icmp eq i32 %tmp.2.i, 15 ; <i1> [#uses=1] - br i1 %tmp.6, label %shortcirc_done.4, label %shortcirc_next.1 -shortcirc_next.1: ; preds = %shortcirc_next.0 - %tmp.11 = icmp eq i32 %tmp.2.i, 16 ; <i1> [#uses=1] - br i1 %tmp.11, label %shortcirc_done.4, label %shortcirc_next.2 -shortcirc_next.2: ; preds = %shortcirc_next.1 - %tmp.16 = icmp eq i32 %tmp.2.i, 17 ; <i1> [#uses=1] - br i1 %tmp.16, label %shortcirc_done.4, label %shortcirc_next.3 -shortcirc_next.3: ; preds = %shortcirc_next.2 - %tmp.21 = icmp eq i32 %tmp.2.i, 18 ; <i1> [#uses=1] - br i1 %tmp.21, label %shortcirc_done.4, label %shortcirc_next.4 -shortcirc_next.4: ; preds = %shortcirc_next.3 - %tmp.26 = icmp eq i32 %tmp.2.i, 19 ; <i1> [#uses=1] - br label %UnifiedReturnBlock -shortcirc_done.4: ; preds = %shortcirc_next.3, %shortcirc_next.2, %shortcirc_next.1, %shortcirc_next.0, %entry - br label %UnifiedReturnBlock -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-LABEL: @test6( -; CHECK: %tmp.2.i.off = add i32 %tmp.2.i, -14 -; CHECK: %switch = icmp ult i32 %tmp.2.i.off, 6 -} - -define void @test7(i8 zeroext %c, i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ult i32 %x, 32 - %cmp4 = icmp eq i8 %c, 97 - %or.cond = or i1 %cmp, %cmp4 - %cmp9 = icmp eq i8 %c, 99 - %or.cond11 = or i1 %or.cond, %cmp9 - br i1 %or.cond11, label %if.then, label %if.end - -if.then: ; preds = %entry - tail call void @foo1() nounwind noredzone - ret void - -if.end: ; preds = %entry - ret void - -; 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: -; CHECK: switch i8 %c, label %if.end [ -; CHECK: i8 99, label %if.then -; CHECK: i8 97, label %if.then -; CHECK: ] -} - -define i32 @test8(i8 zeroext %c, i32 %x, i1 %C) nounwind ssp noredzone { -entry: - br i1 %C, label %N, label %if.then -N: - %cmp = icmp ult i32 %x, 32 - %cmp4 = icmp eq i8 %c, 97 - %or.cond = or i1 %cmp, %cmp4 - %cmp9 = icmp eq i8 %c, 99 - %or.cond11 = or i1 %or.cond, %cmp9 - br i1 %or.cond11, label %if.then, label %if.end - -if.then: ; preds = %entry - %A = phi i32 [0, %entry], [42, %N] - tail call void @foo1() nounwind noredzone - ret i32 %A - -if.end: ; preds = %entry - ret i32 0 - -; CHECK-LABEL: @test8( -; CHECK: switch.early.test: -; CHECK: switch i8 %c, label %if.end [ -; CHECK: i8 99, label %if.then -; CHECK: i8 97, label %if.then -; CHECK: ] -; CHECK: %A = phi i32 [ 0, %entry ], [ 42, %switch.early.test ], [ 42, %N ], [ 42, %switch.early.test ] -} - -;; This is "Example 7" from http://blog.regehr.org/archives/320 -define i32 @test9(i8 zeroext %c) nounwind ssp noredzone { -entry: - %cmp = icmp ult i8 %c, 33 - br i1 %cmp, label %lor.end, label %lor.lhs.false - -lor.lhs.false: ; preds = %entry - %cmp4 = icmp eq i8 %c, 46 - br i1 %cmp4, label %lor.end, label %lor.lhs.false6 - -lor.lhs.false6: ; preds = %lor.lhs.false - %cmp9 = icmp eq i8 %c, 44 - br i1 %cmp9, label %lor.end, label %lor.lhs.false11 - -lor.lhs.false11: ; preds = %lor.lhs.false6 - %cmp14 = icmp eq i8 %c, 58 - br i1 %cmp14, label %lor.end, label %lor.lhs.false16 - -lor.lhs.false16: ; preds = %lor.lhs.false11 - %cmp19 = icmp eq i8 %c, 59 - br i1 %cmp19, label %lor.end, label %lor.lhs.false21 - -lor.lhs.false21: ; preds = %lor.lhs.false16 - %cmp24 = icmp eq i8 %c, 60 - br i1 %cmp24, label %lor.end, label %lor.lhs.false26 - -lor.lhs.false26: ; preds = %lor.lhs.false21 - %cmp29 = icmp eq i8 %c, 62 - br i1 %cmp29, label %lor.end, label %lor.lhs.false31 - -lor.lhs.false31: ; preds = %lor.lhs.false26 - %cmp34 = icmp eq i8 %c, 34 - br i1 %cmp34, label %lor.end, label %lor.lhs.false36 - -lor.lhs.false36: ; preds = %lor.lhs.false31 - %cmp39 = icmp eq i8 %c, 92 - br i1 %cmp39, label %lor.end, label %lor.rhs - -lor.rhs: ; preds = %lor.lhs.false36 - %cmp43 = icmp eq i8 %c, 39 - br label %lor.end - -lor.end: ; preds = %lor.rhs, %lor.lhs.false36, %lor.lhs.false31, %lor.lhs.false26, %lor.lhs.false21, %lor.lhs.false16, %lor.lhs.false11, %lor.lhs.false6, %lor.lhs.false, %entry - %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-LABEL: @test9( -; CHECK: %cmp = icmp ult i8 %c, 33 -; CHECK: br i1 %cmp, label %lor.end, label %switch.early.test - -; CHECK: switch.early.test: -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 92, label %lor.end -; CHECK: i8 62, label %lor.end -; CHECK: i8 60, label %lor.end -; CHECK: i8 59, label %lor.end -; CHECK: i8 58, label %lor.end -; CHECK: i8 46, label %lor.end -; CHECK: i8 44, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 39, label %lor.end -; CHECK: ] -} - -define i32 @test10(i32 %mode, i1 %Cond) { - %A = icmp ne i32 %mode, 0 - %B = icmp ne i32 %mode, 51 - %C = and i1 %A, %B - %D = and i1 %C, %Cond - br i1 %D, label %T, label %F -T: - ret i32 123 -F: - ret i32 324 - -; CHECK-LABEL: @test10( -; CHECK: br i1 %Cond, label %switch.early.test, label %F -; CHECK:switch.early.test: -; CHECK: switch i32 %mode, label %T [ -; CHECK: i32 51, label %F -; CHECK: i32 0, label %F -; CHECK: ] -} - -; PR8780 -define i32 @test11(i32 %bar) nounwind { -entry: - %cmp = icmp eq i32 %bar, 4 - %cmp2 = icmp eq i32 %bar, 35 - %or.cond = or i1 %cmp, %cmp2 - %cmp5 = icmp eq i32 %bar, 53 - %or.cond1 = or i1 %or.cond, %cmp5 - %cmp8 = icmp eq i32 %bar, 24 - %or.cond2 = or i1 %or.cond1, %cmp8 - %cmp11 = icmp eq i32 %bar, 23 - %or.cond3 = or i1 %or.cond2, %cmp11 - %cmp14 = icmp eq i32 %bar, 55 - %or.cond4 = or i1 %or.cond3, %cmp14 - %cmp17 = icmp eq i32 %bar, 12 - %or.cond5 = or i1 %or.cond4, %cmp17 - %cmp20 = icmp eq i32 %bar, 35 - %or.cond6 = or i1 %or.cond5, %cmp20 - br i1 %or.cond6, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - br label %return - -return: ; preds = %if.end, %if.then - %retval.0 = phi i32 [ 1, %if.then ], [ 0, %if.end ] - ret i32 %retval.0 - -; CHECK-LABEL: @test11( -; CHECK: switch i32 %bar, label %if.end [ -; CHECK: i32 55, label %return -; CHECK: i32 53, label %return -; CHECK: i32 35, label %return -; CHECK: i32 24, label %return -; CHECK: i32 23, label %return -; CHECK: i32 12, label %return -; CHECK: i32 4, label %return -; CHECK: ] -} - -define void @test12() nounwind { -entry: - br label %bb49.us.us - -bb49.us.us: - %A = icmp eq i32 undef, undef - br i1 %A, label %bb55.us.us, label %malformed - -bb48.us.us: - %B = icmp ugt i32 undef, undef - br i1 %B, label %bb55.us.us, label %bb49.us.us - -bb55.us.us: - br label %bb48.us.us - -malformed: - ret void -; CHECK-LABEL: @test12( - -} - -; test13 - handle switch formation with ult. -define void @test13(i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ult i32 %x, 2 - br i1 %cmp, label %if.then, label %lor.lhs.false3 - -lor.lhs.false3: ; preds = %lor.lhs.false - %cmp5 = icmp eq i32 %x, 3 - br i1 %cmp5, label %if.then, label %lor.lhs.false6 - -lor.lhs.false6: ; preds = %lor.lhs.false3 - %cmp8 = icmp eq i32 %x, 4 - br i1 %cmp8, label %if.then, label %lor.lhs.false9 - -lor.lhs.false9: ; preds = %lor.lhs.false6 - %cmp11 = icmp eq i32 %x, 6 - br i1 %cmp11, label %if.then, label %if.end - -if.then: ; preds = %lor.lhs.false9, %lor.lhs.false6, %lor.lhs.false3, %lor.lhs.false, %entry - call void @foo1() noredzone - br label %if.end - -if.end: ; preds = %if.then, %lor.lhs.false9 - ret void -; CHECK-LABEL: @test13( -; CHECK: switch i32 %x, label %if.end [ -; CHECK: i32 6, label %if.then -; CHECK: i32 4, label %if.then -; CHECK: i32 3, label %if.then -; CHECK: i32 1, label %if.then -; CHECK: i32 0, label %if.then -; CHECK: ] -} - -; test14 - handle switch formation with ult. -define void @test14(i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ugt i32 %x, 2 - br i1 %cmp, label %lor.lhs.false3, label %if.then - -lor.lhs.false3: ; preds = %lor.lhs.false - %cmp5 = icmp ne i32 %x, 3 - br i1 %cmp5, label %lor.lhs.false6, label %if.then - -lor.lhs.false6: ; preds = %lor.lhs.false3 - %cmp8 = icmp ne i32 %x, 4 - br i1 %cmp8, label %lor.lhs.false9, label %if.then - -lor.lhs.false9: ; preds = %lor.lhs.false6 - %cmp11 = icmp ne i32 %x, 6 - br i1 %cmp11, label %if.end, label %if.then - -if.then: ; preds = %lor.lhs.false9, %lor.lhs.false6, %lor.lhs.false3, %lor.lhs.false, %entry - call void @foo1() noredzone - br label %if.end - -if.end: ; preds = %if.then, %lor.lhs.false9 - ret void -; CHECK-LABEL: @test14( -; CHECK: switch i32 %x, label %if.end [ -; CHECK: i32 6, label %if.then -; CHECK: i32 4, label %if.then -; CHECK: i32 3, label %if.then -; CHECK: i32 1, label %if.then -; CHECK: i32 0, label %if.then -; CHECK: ] -} - -; Don't crash on ginormous ranges. -define void @test15(i128 %x) nounwind { - %cmp = icmp ugt i128 %x, 2 - br i1 %cmp, label %if.end, label %lor.false - -lor.false: - %cmp2 = icmp ne i128 %x, 100000000000000000000 - br i1 %cmp2, label %if.end, label %if.then - -if.then: - call void @foo1() noredzone - br label %if.end - -if.end: - ret void - -; CHECK-LABEL: @test15( -; CHECK-NOT: switch -; CHECK: ret void -} - -; PR8675 -; rdar://5134905 -define zeroext i1 @test16(i32 %x) nounwind { -entry: -; 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 - br i1 %cmp.i, label %lor.end, label %lor.lhs.false - -lor.lhs.false: - %cmp.i2 = icmp eq i32 %x, 2 - br i1 %cmp.i2, label %lor.end, label %lor.rhs - -lor.rhs: - %cmp.i1 = icmp eq i32 %x, 3 - br label %lor.end - -lor.end: - %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp.i1, %lor.rhs ] - ret i1 %0 -} - -; Check that we don't turn an icmp into a switch where it's not useful. -define void @test17(i32 %x, i32 %y) { - %cmp = icmp ult i32 %x, 3 - %switch = icmp ult i32 %y, 2 - %or.cond775 = or i1 %cmp, %switch - br i1 %or.cond775, label %lor.lhs.false8, label %return - -lor.lhs.false8: - tail call void @foo1() - ret void - -return: - ret void - -; 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 -} - -define void @PR26323(i1 %tobool23, i32 %tmp3) { -entry: - %tobool5 = icmp ne i32 %tmp3, 0 - %neg14 = and i32 %tmp3, -2 - %cmp17 = icmp ne i32 %neg14, -1 - %or.cond = and i1 %tobool5, %tobool23 - %or.cond1 = and i1 %cmp17, %or.cond - br i1 %or.cond1, label %if.end29, label %if.then27 - -if.then27: ; preds = %entry - call void @foo1() - unreachable - -if.end29: ; preds = %entry - ret void -} - -; CHECK-LABEL: define void @PR26323( -; CHECK: %tobool5 = icmp ne i32 %tmp3, 0 -; CHECK: %neg14 = and i32 %tmp3, -2 -; CHECK: %cmp17 = icmp ne i32 %neg14, -1 -; CHECK: %or.cond = and i1 %tobool5, %tobool23 -; CHECK: %or.cond1 = and i1 %cmp17, %or.cond -; CHECK: br i1 %or.cond1, label %if.end29, label %if.then27 - -; Form a switch when and'ing a negated power of two -; CHECK-LABEL: define void @test19 -; CHECK: switch i32 %arg, label %else [ -; CHECK: i32 32, label %if -; CHECK: i32 13, label %if -; CHECK: i32 12, label %if -define void @test19(i32 %arg) { - %and = and i32 %arg, -2 - %cmp1 = icmp eq i32 %and, 12 - %cmp2 = icmp eq i32 %arg, 32 - %pred = or i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Since %cmp1 is always false, a switch is never formed -; CHECK-LABEL: define void @test20 -; CHECK-NOT: switch -; CHECK: ret void -define void @test20(i32 %arg) { - %and = and i32 %arg, -2 - %cmp1 = icmp eq i32 %and, 13 - %cmp2 = icmp eq i32 %arg, 32 - %pred = or i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Form a switch when or'ing a power of two -; CHECK-LABEL: define void @test21 -; CHECK: i32 32, label %else -; CHECK: i32 13, label %else -; CHECK: i32 12, label %else -define void @test21(i32 %arg) { - %and = or i32 %arg, 1 - %cmp1 = icmp ne i32 %and, 13 - %cmp2 = icmp ne i32 %arg, 32 - %pred = and i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Since %cmp1 is always false, a switch is never formed -; CHECK-LABEL: define void @test22 -; CHECK-NOT: switch -; CHECK: ret void -define void @test22(i32 %arg) { - %and = or i32 %arg, 1 - %cmp1 = icmp ne i32 %and, 12 - %cmp2 = icmp ne i32 %arg, 32 - %pred = and i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -}
\ No newline at end of file diff --git a/llvm/test/Transforms/SimplifyCFG/switch_create.ll b/llvm/test/Transforms/SimplifyCFG/switch_create.ll deleted file mode 100644 index c752636ae83..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch_create.ll +++ /dev/null @@ -1,660 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -; RUN: opt -S -data-layout="p:32:32-p1:16:16" -simplifycfg < %s | FileCheck -check-prefix=CHECK -check-prefix=DL %s - -declare void @foo1() - -declare void @foo2() - -define void @test1(i32 %V) { - %C1 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - %C2 = icmp eq i32 %V, 17 ; <i1> [#uses=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( -; 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] - %CN = and 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: @test2( -; CHECK: switch i32 %V, label %T [ -; CHECK: i32 17, label %F -; CHECK: i32 4, label %F -; CHECK: ] -} - -define void @test3(i32 %V) { - %C1 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - br i1 %C1, label %T, label %N -N: ; preds = %0 - %C2 = icmp eq i32 %V, 17 ; <i1> [#uses=1] - br i1 %C2, label %T, label %F -T: ; preds = %N, %0 - call void @foo1( ) - ret void -F: ; preds = %N - call void @foo2( ) - ret void - -; CHECK-LABEL: @test3( -; CHECK: switch i32 %V, label %F [ -; CHECK: i32 4, label %T -; CHECK: i32 17, label %T -; CHECK: ] -} - - - -define i32 @test4(i8 zeroext %c) nounwind ssp noredzone { -entry: - %cmp = icmp eq i8 %c, 62 - br i1 %cmp, label %lor.end, label %lor.lhs.false - -lor.lhs.false: ; preds = %entry - %cmp4 = icmp eq i8 %c, 34 - br i1 %cmp4, label %lor.end, label %lor.rhs - -lor.rhs: ; preds = %lor.lhs.false - %cmp8 = icmp eq i8 %c, 92 - br label %lor.end - -lor.end: ; preds = %lor.rhs, %lor.lhs.false, %entry - %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp8, %lor.rhs ] - %lor.ext = zext i1 %0 to i32 - ret i32 %lor.ext - -; CHECK-LABEL: @test4( -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 62, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 92, label %lor.end -; CHECK: ] -} - -define i32 @test5(i8 zeroext %c) nounwind ssp noredzone { -entry: - switch i8 %c, label %lor.rhs [ - i8 62, label %lor.end - i8 34, label %lor.end - i8 92, label %lor.end - ] - -lor.rhs: ; preds = %entry - %V = icmp eq i8 %c, 92 - br label %lor.end - -lor.end: ; preds = %entry, %entry, %entry, %lor.rhs - %0 = phi i1 [ true, %entry ], [ %V, %lor.rhs ], [ true, %entry ], [ true, %entry ] - %lor.ext = zext i1 %0 to i32 - ret i32 %lor.ext -; CHECK-LABEL: @test5( -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 62, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 92, label %lor.end -; CHECK: ] -} - - -define i1 @test6({ i32, i32 }* %I) { -entry: - %tmp.1.i = getelementptr { i32, i32 }, { i32, i32 }* %I, i64 0, i32 1 ; <i32*> [#uses=1] - %tmp.2.i = load i32, i32* %tmp.1.i ; <i32> [#uses=6] - %tmp.2 = icmp eq i32 %tmp.2.i, 14 ; <i1> [#uses=1] - br i1 %tmp.2, label %shortcirc_done.4, label %shortcirc_next.0 -shortcirc_next.0: ; preds = %entry - %tmp.6 = icmp eq i32 %tmp.2.i, 15 ; <i1> [#uses=1] - br i1 %tmp.6, label %shortcirc_done.4, label %shortcirc_next.1 -shortcirc_next.1: ; preds = %shortcirc_next.0 - %tmp.11 = icmp eq i32 %tmp.2.i, 16 ; <i1> [#uses=1] - br i1 %tmp.11, label %shortcirc_done.4, label %shortcirc_next.2 -shortcirc_next.2: ; preds = %shortcirc_next.1 - %tmp.16 = icmp eq i32 %tmp.2.i, 17 ; <i1> [#uses=1] - br i1 %tmp.16, label %shortcirc_done.4, label %shortcirc_next.3 -shortcirc_next.3: ; preds = %shortcirc_next.2 - %tmp.21 = icmp eq i32 %tmp.2.i, 18 ; <i1> [#uses=1] - br i1 %tmp.21, label %shortcirc_done.4, label %shortcirc_next.4 -shortcirc_next.4: ; preds = %shortcirc_next.3 - %tmp.26 = icmp eq i32 %tmp.2.i, 19 ; <i1> [#uses=1] - br label %UnifiedReturnBlock -shortcirc_done.4: ; preds = %shortcirc_next.3, %shortcirc_next.2, %shortcirc_next.1, %shortcirc_next.0, %entry - br label %UnifiedReturnBlock -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-LABEL: @test6( -; CHECK: %tmp.2.i.off = add i32 %tmp.2.i, -14 -; CHECK: %switch = icmp ult i32 %tmp.2.i.off, 6 -} - -define void @test7(i8 zeroext %c, i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ult i32 %x, 32 - %cmp4 = icmp eq i8 %c, 97 - %or.cond = or i1 %cmp, %cmp4 - %cmp9 = icmp eq i8 %c, 99 - %or.cond11 = or i1 %or.cond, %cmp9 - br i1 %or.cond11, label %if.then, label %if.end - -if.then: ; preds = %entry - tail call void @foo1() nounwind noredzone - ret void - -if.end: ; preds = %entry - ret void - -; 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: -; CHECK: switch i8 %c, label %if.end [ -; CHECK: i8 99, label %if.then -; CHECK: i8 97, label %if.then -; CHECK: ] -} - -define i32 @test8(i8 zeroext %c, i32 %x, i1 %C) nounwind ssp noredzone { -entry: - br i1 %C, label %N, label %if.then -N: - %cmp = icmp ult i32 %x, 32 - %cmp4 = icmp eq i8 %c, 97 - %or.cond = or i1 %cmp, %cmp4 - %cmp9 = icmp eq i8 %c, 99 - %or.cond11 = or i1 %or.cond, %cmp9 - br i1 %or.cond11, label %if.then, label %if.end - -if.then: ; preds = %entry - %A = phi i32 [0, %entry], [42, %N] - tail call void @foo1() nounwind noredzone - ret i32 %A - -if.end: ; preds = %entry - ret i32 0 - -; CHECK-LABEL: @test8( -; CHECK: switch.early.test: -; CHECK: switch i8 %c, label %if.end [ -; CHECK: i8 99, label %if.then -; CHECK: i8 97, label %if.then -; CHECK: ] -; CHECK: %A = phi i32 [ 0, %entry ], [ 42, %switch.early.test ], [ 42, %N ], [ 42, %switch.early.test ] -} - -;; This is "Example 7" from http://blog.regehr.org/archives/320 -define i32 @test9(i8 zeroext %c) nounwind ssp noredzone { -entry: - %cmp = icmp ult i8 %c, 33 - br i1 %cmp, label %lor.end, label %lor.lhs.false - -lor.lhs.false: ; preds = %entry - %cmp4 = icmp eq i8 %c, 46 - br i1 %cmp4, label %lor.end, label %lor.lhs.false6 - -lor.lhs.false6: ; preds = %lor.lhs.false - %cmp9 = icmp eq i8 %c, 44 - br i1 %cmp9, label %lor.end, label %lor.lhs.false11 - -lor.lhs.false11: ; preds = %lor.lhs.false6 - %cmp14 = icmp eq i8 %c, 58 - br i1 %cmp14, label %lor.end, label %lor.lhs.false16 - -lor.lhs.false16: ; preds = %lor.lhs.false11 - %cmp19 = icmp eq i8 %c, 59 - br i1 %cmp19, label %lor.end, label %lor.lhs.false21 - -lor.lhs.false21: ; preds = %lor.lhs.false16 - %cmp24 = icmp eq i8 %c, 60 - br i1 %cmp24, label %lor.end, label %lor.lhs.false26 - -lor.lhs.false26: ; preds = %lor.lhs.false21 - %cmp29 = icmp eq i8 %c, 62 - br i1 %cmp29, label %lor.end, label %lor.lhs.false31 - -lor.lhs.false31: ; preds = %lor.lhs.false26 - %cmp34 = icmp eq i8 %c, 34 - br i1 %cmp34, label %lor.end, label %lor.lhs.false36 - -lor.lhs.false36: ; preds = %lor.lhs.false31 - %cmp39 = icmp eq i8 %c, 92 - br i1 %cmp39, label %lor.end, label %lor.rhs - -lor.rhs: ; preds = %lor.lhs.false36 - %cmp43 = icmp eq i8 %c, 39 - br label %lor.end - -lor.end: ; preds = %lor.rhs, %lor.lhs.false36, %lor.lhs.false31, %lor.lhs.false26, %lor.lhs.false21, %lor.lhs.false16, %lor.lhs.false11, %lor.lhs.false6, %lor.lhs.false, %entry - %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-LABEL: @test9( -; CHECK: %cmp = icmp ult i8 %c, 33 -; CHECK: br i1 %cmp, label %lor.end, label %switch.early.test - -; CHECK: switch.early.test: -; CHECK: switch i8 %c, label %lor.rhs [ -; CHECK: i8 92, label %lor.end -; CHECK: i8 62, label %lor.end -; CHECK: i8 60, label %lor.end -; CHECK: i8 59, label %lor.end -; CHECK: i8 58, label %lor.end -; CHECK: i8 46, label %lor.end -; CHECK: i8 44, label %lor.end -; CHECK: i8 34, label %lor.end -; CHECK: i8 39, label %lor.end -; CHECK: ] -} - -define i32 @test10(i32 %mode, i1 %Cond) { - %A = icmp ne i32 %mode, 0 - %B = icmp ne i32 %mode, 51 - %C = and i1 %A, %B - %D = and i1 %C, %Cond - br i1 %D, label %T, label %F -T: - ret i32 123 -F: - ret i32 324 - -; CHECK-LABEL: @test10( -; CHECK: br i1 %Cond, label %switch.early.test, label %F -; CHECK:switch.early.test: -; CHECK: switch i32 %mode, label %T [ -; CHECK: i32 51, label %F -; CHECK: i32 0, label %F -; CHECK: ] -} - -; PR8780 -define i32 @test11(i32 %bar) nounwind { -entry: - %cmp = icmp eq i32 %bar, 4 - %cmp2 = icmp eq i32 %bar, 35 - %or.cond = or i1 %cmp, %cmp2 - %cmp5 = icmp eq i32 %bar, 53 - %or.cond1 = or i1 %or.cond, %cmp5 - %cmp8 = icmp eq i32 %bar, 24 - %or.cond2 = or i1 %or.cond1, %cmp8 - %cmp11 = icmp eq i32 %bar, 23 - %or.cond3 = or i1 %or.cond2, %cmp11 - %cmp14 = icmp eq i32 %bar, 55 - %or.cond4 = or i1 %or.cond3, %cmp14 - %cmp17 = icmp eq i32 %bar, 12 - %or.cond5 = or i1 %or.cond4, %cmp17 - %cmp20 = icmp eq i32 %bar, 35 - %or.cond6 = or i1 %or.cond5, %cmp20 - br i1 %or.cond6, label %if.then, label %if.end - -if.then: ; preds = %entry - br label %return - -if.end: ; preds = %entry - br label %return - -return: ; preds = %if.end, %if.then - %retval.0 = phi i32 [ 1, %if.then ], [ 0, %if.end ] - ret i32 %retval.0 - -; CHECK-LABEL: @test11( -; CHECK: switch i32 %bar, label %if.end [ -; CHECK: i32 55, label %return -; CHECK: i32 53, label %return -; CHECK: i32 35, label %return -; CHECK: i32 24, label %return -; CHECK: i32 23, label %return -; CHECK: i32 12, label %return -; CHECK: i32 4, label %return -; CHECK: ] -} - -define void @test12() nounwind { -entry: - br label %bb49.us.us - -bb49.us.us: - %A = icmp eq i32 undef, undef - br i1 %A, label %bb55.us.us, label %malformed - -bb48.us.us: - %B = icmp ugt i32 undef, undef - br i1 %B, label %bb55.us.us, label %bb49.us.us - -bb55.us.us: - br label %bb48.us.us - -malformed: - ret void -; CHECK-LABEL: @test12( - -} - -; test13 - handle switch formation with ult. -define void @test13(i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ult i32 %x, 2 - br i1 %cmp, label %if.then, label %lor.lhs.false3 - -lor.lhs.false3: ; preds = %lor.lhs.false - %cmp5 = icmp eq i32 %x, 3 - br i1 %cmp5, label %if.then, label %lor.lhs.false6 - -lor.lhs.false6: ; preds = %lor.lhs.false3 - %cmp8 = icmp eq i32 %x, 4 - br i1 %cmp8, label %if.then, label %lor.lhs.false9 - -lor.lhs.false9: ; preds = %lor.lhs.false6 - %cmp11 = icmp eq i32 %x, 6 - br i1 %cmp11, label %if.then, label %if.end - -if.then: ; preds = %lor.lhs.false9, %lor.lhs.false6, %lor.lhs.false3, %lor.lhs.false, %entry - call void @foo1() noredzone - br label %if.end - -if.end: ; preds = %if.then, %lor.lhs.false9 - ret void -; CHECK-LABEL: @test13( -; CHECK: switch i32 %x, label %if.end [ -; CHECK: i32 6, label %if.then -; CHECK: i32 4, label %if.then -; CHECK: i32 3, label %if.then -; CHECK: i32 1, label %if.then -; CHECK: i32 0, label %if.then -; CHECK: ] -} - -; test14 - handle switch formation with ult. -define void @test14(i32 %x) nounwind ssp noredzone { -entry: - %cmp = icmp ugt i32 %x, 2 - br i1 %cmp, label %lor.lhs.false3, label %if.then - -lor.lhs.false3: ; preds = %lor.lhs.false - %cmp5 = icmp ne i32 %x, 3 - br i1 %cmp5, label %lor.lhs.false6, label %if.then - -lor.lhs.false6: ; preds = %lor.lhs.false3 - %cmp8 = icmp ne i32 %x, 4 - br i1 %cmp8, label %lor.lhs.false9, label %if.then - -lor.lhs.false9: ; preds = %lor.lhs.false6 - %cmp11 = icmp ne i32 %x, 6 - br i1 %cmp11, label %if.end, label %if.then - -if.then: ; preds = %lor.lhs.false9, %lor.lhs.false6, %lor.lhs.false3, %lor.lhs.false, %entry - call void @foo1() noredzone - br label %if.end - -if.end: ; preds = %if.then, %lor.lhs.false9 - ret void -; CHECK-LABEL: @test14( -; CHECK: switch i32 %x, label %if.end [ -; CHECK: i32 6, label %if.then -; CHECK: i32 4, label %if.then -; CHECK: i32 3, label %if.then -; CHECK: i32 1, label %if.then -; CHECK: i32 0, label %if.then -; CHECK: ] -} - -; Don't crash on ginormous ranges. -define void @test15(i128 %x) nounwind { - %cmp = icmp ugt i128 %x, 2 - br i1 %cmp, label %if.end, label %lor.false - -lor.false: - %cmp2 = icmp ne i128 %x, 100000000000000000000 - br i1 %cmp2, label %if.end, label %if.then - -if.then: - call void @foo1() noredzone - br label %if.end - -if.end: - ret void - -; CHECK-LABEL: @test15( -; CHECK-NOT: switch -; CHECK: ret void -} - -; PR8675 -; rdar://5134905 -define zeroext i1 @test16(i32 %x) nounwind { -entry: -; 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 - br i1 %cmp.i, label %lor.end, label %lor.lhs.false - -lor.lhs.false: - %cmp.i2 = icmp eq i32 %x, 2 - br i1 %cmp.i2, label %lor.end, label %lor.rhs - -lor.rhs: - %cmp.i1 = icmp eq i32 %x, 3 - br label %lor.end - -lor.end: - %0 = phi i1 [ true, %lor.lhs.false ], [ true, %entry ], [ %cmp.i1, %lor.rhs ] - ret i1 %0 -} - -; Check that we don't turn an icmp into a switch where it's not useful. -define void @test17(i32 %x, i32 %y) { - %cmp = icmp ult i32 %x, 3 - %switch = icmp ult i32 %y, 2 - %or.cond775 = or i1 %cmp, %switch - br i1 %or.cond775, label %lor.lhs.false8, label %return - -lor.lhs.false8: - tail call void @foo1() - ret void - -return: - ret void - -; 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 -} - -define void @PR26323(i1 %tobool23, i32 %tmp3) { -entry: - %tobool5 = icmp ne i32 %tmp3, 0 - %neg14 = and i32 %tmp3, -2 - %cmp17 = icmp ne i32 %neg14, -1 - %or.cond = and i1 %tobool5, %tobool23 - %or.cond1 = and i1 %cmp17, %or.cond - br i1 %or.cond1, label %if.end29, label %if.then27 - -if.then27: ; preds = %entry - call void @foo1() - unreachable - -if.end29: ; preds = %entry - ret void -} - -; CHECK-LABEL: define void @PR26323( -; CHECK: %tobool5 = icmp ne i32 %tmp3, 0 -; CHECK: %neg14 = and i32 %tmp3, -2 -; CHECK: %cmp17 = icmp ne i32 %neg14, -1 -; CHECK: %or.cond = and i1 %tobool5, %tobool23 -; CHECK: %or.cond1 = and i1 %cmp17, %or.cond -; CHECK: br i1 %or.cond1, label %if.end29, label %if.then27 - -; Form a switch when and'ing a negated power of two -; CHECK-LABEL: define void @test19 -; CHECK: switch i32 %arg, label %else [ -; CHECK: i32 32, label %if -; CHECK: i32 13, label %if -; CHECK: i32 12, label %if -define void @test19(i32 %arg) { - %and = and i32 %arg, -2 - %cmp1 = icmp eq i32 %and, 12 - %cmp2 = icmp eq i32 %arg, 32 - %pred = or i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Since %cmp1 is always false, a switch is never formed -; CHECK-LABEL: define void @test20 -; CHECK-NOT: switch -; CHECK: ret void -define void @test20(i32 %arg) { - %and = and i32 %arg, -2 - %cmp1 = icmp eq i32 %and, 13 - %cmp2 = icmp eq i32 %arg, 32 - %pred = or i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Form a switch when or'ing a power of two -; CHECK-LABEL: define void @test21 -; CHECK: i32 32, label %else -; CHECK: i32 13, label %else -; CHECK: i32 12, label %else -define void @test21(i32 %arg) { - %and = or i32 %arg, 1 - %cmp1 = icmp ne i32 %and, 13 - %cmp2 = icmp ne i32 %arg, 32 - %pred = and i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -} - -; Since %cmp1 is always false, a switch is never formed -; CHECK-LABEL: define void @test22 -; CHECK-NOT: switch -; CHECK: ret void -define void @test22(i32 %arg) { - %and = or i32 %arg, 1 - %cmp1 = icmp ne i32 %and, 12 - %cmp2 = icmp ne i32 %arg, 32 - %pred = and i1 %cmp1, %cmp2 - br i1 %pred, label %if, label %else - -if: - call void @foo1() - ret void - -else: - ret void -}
\ No newline at end of file diff --git a/llvm/test/Transforms/SimplifyCFG/switch_switch_fold.ll b/llvm/test/Transforms/SimplifyCFG/switch_switch_fold.ll deleted file mode 100644 index 7f6f1c94bd4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch_switch_fold.ll +++ /dev/null @@ -1,65 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Test that a switch going to a switch on the same value can be merged. -; All three switches in this example can be merged into one big one. - -declare void @foo1() - -declare void @foo2() - -declare void @foo3() - -declare void @foo4() - -define void @test1(i32 %V) { - switch i32 %V, label %F [ - i32 4, label %T - i32 17, label %T - i32 5, label %T - i32 1234, label %F - ] -T: ; preds = %0, %0, %0 - switch i32 %V, label %F [ - i32 4, label %A - i32 17, label %B - i32 42, label %C - ] -A: ; preds = %T - call void @foo1( ) - ret void -B: ; preds = %F, %F, %T - call void @foo2( ) - ret void -C: ; preds = %T - call void @foo3( ) - ret void -F: ; preds = %F, %T, %0, %0 - switch i32 %V, label %F [ - i32 4, label %B - i32 18, label %B - i32 42, label %D - ] -D: ; preds = %F - call void @foo4( ) - ret void - -; CHECK-LABEL: @test1( -; CHECK-NEXT: switch i32 %V, label %infloop [ -; CHECK-NEXT: i32 4, label %A -; CHECK-NEXT: i32 17, label %B -; CHECK-NEXT: i32 18, label %B -; CHECK-NEXT: i32 42, label %D -; CHECK-NEXT: ] -; CHECK: A: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: ret void -; CHECK: B: -; CHECK-NEXT: call void @foo2() -; CHECK-NEXT: ret void -; CHECK: D: -; CHECK-NEXT: call void @foo4() -; CHECK-NEXT: ret void -; CHECK: infloop: -; CHECK-NEXT: br label %infloop -} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch_thread.ll b/llvm/test/Transforms/SimplifyCFG/switch_thread.ll deleted file mode 100644 index 32e0325df7f..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch_thread.ll +++ /dev/null @@ -1,113 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -; Test that we can thread a simple known condition through switch statements. - -declare void @foo1() - -declare void @foo2() - -declare void @DEAD() - -define void @test1(i32 %V) { - switch i32 %V, label %A [ - i32 4, label %T - i32 17, label %Done - i32 1234, label %A - ] -;; V == 4 if we get here. -T: ; preds = %0 - call void @foo1( ) - ;; This switch is always statically determined. - switch i32 %V, label %A2 [ - i32 4, label %B - i32 17, label %C - i32 42, label %C - ] -A2: ; preds = %T - call void @DEAD( ) - call void @DEAD( ) - ;; always true - %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - br i1 %cond2, label %Done, label %C -A: ; preds = %0, %0 - call void @foo1( ) - ;; always true - %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1] - br i1 %cond, label %Done, label %C -Done: ; preds = %B, %A, %A2, %0 - ret void -B: ; preds = %T - call void @foo2( ) - ;; always true - %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1] - br i1 %cond3, label %Done, label %C -C: ; preds = %B, %A, %A2, %T, %T - call void @DEAD( ) - ret void - -; CHECK-LABEL: @test1( -; CHECK-NEXT: switch i32 %V, label %A [ -; CHECK-NEXT: i32 4, label %T -; CHECK-NEXT: i32 17, label %Done -; CHECK-NEXT: ] -; CHECK: T: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: call void @foo2() -; CHECK-NEXT: br label %Done -; CHECK: A: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: br label %Done -; CHECK: Done: -; CHECK-NEXT: ret void -} - -define void @test2(i32 %V) { - switch i32 %V, label %A [ - i32 4, label %T - i32 17, label %D - i32 1234, label %E - ] -;; V != 4, 17, 1234 here. -A: ; preds = %0 - call void @foo1( ) - ;; This switch is always statically determined. - switch i32 %V, label %E [ - i32 4, label %C - i32 17, label %C - i32 42, label %D - ] -;; unreacahble. -C: ; preds = %A, %A - call void @DEAD( ) - ret void -T: ; preds = %0 - call void @foo1( ) - call void @foo1( ) - ret void -D: ; preds = %A, %0 - call void @foo1( ) - ret void -E: ; preds = %A, %0 - ret void - -; CHECK-LABEL: @test2( -; CHECK-NEXT: switch i32 %V, label %A [ -; CHECK-NEXT: i32 4, label %T -; CHECK-NEXT: i32 17, label %D -; CHECK-NEXT: i32 1234, label %E -; CHECK-NEXT: ] -; CHECK: A: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 %V, 42 -; CHECK-NEXT: br i1 [[COND]], label %D, label %E -; CHECK: T: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: ret void -; CHECK: D: -; CHECK-NEXT: call void @foo1() -; CHECK-NEXT: ret void -; CHECK: E: -; CHECK-NEXT: ret void -} - diff --git a/llvm/test/Transforms/SimplifyCFG/switch_undef.ll b/llvm/test/Transforms/SimplifyCFG/switch_undef.ll deleted file mode 100644 index e5acf41644a..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/switch_undef.ll +++ /dev/null @@ -1,24 +0,0 @@ -; RUN: opt %s -keep-loops=false -switch-to-lookup=true -simplifycfg -S | FileCheck %s -; RUN: opt %s -passes='simplify-cfg<no-keep-loops;switch-to-lookup>' -S | FileCheck %s - -define void @f6() #0 { -; CHECK-LABEL: entry: - -entry: - br label %for.cond.i - -for.cond.i: ; preds = %f1.exit.i, %entry - switch i16 undef, label %f1.exit.i [ - i16 -1, label %cond.false.i3.i - i16 1, label %cond.false.i3.i - i16 0, label %cond.false.i3.i - ] - -cond.false.i3.i: ; preds = %for.cond.i, %for.cond.i, %for.cond.i - br label %f1.exit.i - -f1.exit.i: ; preds = %cond.false.i3.i, %for.cond.i - %cond.i4.i = phi i16 [ undef, %cond.false.i3.i ], [ 1, %for.cond.i ] - %tobool7.i = icmp ne i16 %cond.i4.i, 0 - br label %for.cond.i -} diff --git a/llvm/test/Transforms/SimplifyCFG/trap-debugloc.ll b/llvm/test/Transforms/SimplifyCFG/trap-debugloc.ll deleted file mode 100644 index a912dc561a4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/trap-debugloc.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -; Radar 9342286 -; Assign DebugLoc to trap instruction. -define void @foo() nounwind ssp !dbg !0 { -; CHECK: call void @llvm.trap(), !dbg - store i32 42, i32* null, !dbg !5 - ret void, !dbg !7 -} - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!10} - -!0 = distinct !DISubprogram(name: "foo", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, isOptimized: false, unit: !2, file: !8, scope: !1, type: !3) -!1 = !DIFile(filename: "foo.c", directory: "/private/tmp") -!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "Apple clang version 3.0 (tags/Apple/clang-206.1) (based on LLVM 3.0svn)", isOptimized: true, emissionKind: FullDebug, file: !8, enums: !{}, retainedTypes: !{}) -!3 = !DISubroutineType(types: !4) -!4 = !{null} -!5 = !DILocation(line: 4, column: 2, scope: !6) -!6 = distinct !DILexicalBlock(line: 3, column: 12, file: !8, scope: !0) -!7 = !DILocation(line: 5, column: 1, scope: !6) -!8 = !DIFile(filename: "foo.c", directory: "/private/tmp") -!10 = !{i32 1, !"Debug Info Version", i32 3} diff --git a/llvm/test/Transforms/SimplifyCFG/trap-no-null-opt-debugloc.ll b/llvm/test/Transforms/SimplifyCFG/trap-no-null-opt-debugloc.ll deleted file mode 100644 index b3c104d7ae5..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/trap-no-null-opt-debugloc.ll +++ /dev/null @@ -1,24 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s -define void @foo() nounwind ssp #0 !dbg !0 { -; CHECK: store i32 42, i32* null -; CHECK-NOT: call void @llvm.trap() -; CHECK: ret void - store i32 42, i32* null, !dbg !5 - ret void, !dbg !7 -} - -attributes #0 = { "null-pointer-is-valid"="true" } - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!10} - -!0 = distinct !DISubprogram(name: "foo", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, isOptimized: false, unit: !2, file: !8, scope: !1, type: !3) -!1 = !DIFile(filename: "foo.c", directory: "/private/tmp") -!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "Apple clang version 3.0 (tags/Apple/clang-206.1) (based on LLVM 3.0svn)", isOptimized: true, emissionKind: FullDebug, file: !8, enums: !{}, retainedTypes: !{}) -!3 = !DISubroutineType(types: !4) -!4 = !{null} -!5 = !DILocation(line: 4, column: 2, scope: !6) -!6 = distinct !DILexicalBlock(line: 3, column: 12, file: !8, scope: !0) -!7 = !DILocation(line: 5, column: 1, scope: !6) -!8 = !DIFile(filename: "foo.c", directory: "/private/tmp") -!10 = !{i32 1, !"Debug Info Version", i32 3} diff --git a/llvm/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll b/llvm/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll deleted file mode 100644 index b074393e453..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll +++ /dev/null @@ -1,125 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; PR2967 - -target datalayout = -"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32" -target triple = "i386-pc-linux-gnu" - -define void @test1(i32 %x) nounwind { -entry: - %0 = icmp eq i32 %x, 0 ; <i1> [#uses=1] - br i1 %0, label %bb, label %return - -bb: ; preds = %entry - %1 = load volatile i32, i32* null - unreachable - - br label %return -return: ; preds = %entry - ret void -; CHECK-LABEL: @test1( -; CHECK: load volatile -} - -define void @test1_no_null_opt(i32 %x) nounwind #0 { -entry: - %0 = icmp eq i32 %x, 0 ; <i1> [#uses=1] - br i1 %0, label %bb, label %return - -bb: ; preds = %entry - %1 = load volatile i32, i32* null - unreachable - - br label %return -return: ; preds = %entry - ret void -; CHECK-LABEL: @test1_no_null_opt( -; CHECK: load volatile -; CHECK: unreachable -} - -; rdar://7958343 -define void @test2() nounwind { -entry: - store i32 4,i32* null - ret void - -; CHECK-LABEL: @test2( -; CHECK: call void @llvm.trap -; CHECK: unreachable -} - -define void @test2_no_null_opt() nounwind #0 { -entry: - store i32 4,i32* null - ret void -; CHECK-LABEL: @test2_no_null_opt( -; CHECK: store i32 4, i32* null -; CHECK-NOT: call void @llvm.trap -; CHECK: ret -} - -; PR7369 -define void @test3() nounwind { -entry: - store volatile i32 4, i32* null - ret void - -; CHECK-LABEL: @test3( -; CHECK: store volatile i32 4, i32* null -; CHECK: ret -} - -define void @test3_no_null_opt() nounwind #0 { -entry: - store volatile i32 4, i32* null - ret void - -; CHECK-LABEL: @test3_no_null_opt( -; CHECK: store volatile i32 4, i32* null -; CHECK: ret -} - -; Check store before unreachable. -define void @test4(i1 %C, i32* %P) { -; CHECK-LABEL: @test4( -; CHECK: entry: -; CHECK-NEXT: br i1 %C -entry: - br i1 %C, label %T, label %F -T: - store volatile i32 0, i32* %P - unreachable -F: - ret void -} - -; Check cmpxchg before unreachable. -define void @test5(i1 %C, i32* %P) { -; CHECK-LABEL: @test5( -; CHECK: entry: -; CHECK-NEXT: br i1 %C -entry: - br i1 %C, label %T, label %F -T: - cmpxchg volatile i32* %P, i32 0, i32 1 seq_cst seq_cst - unreachable -F: - ret void -} - -; Check atomicrmw before unreachable. -define void @test6(i1 %C, i32* %P) { -; CHECK-LABEL: @test6( -; CHECK: entry: -; CHECK-NEXT: br i1 %C -entry: - br i1 %C, label %T, label %F -T: - atomicrmw volatile xchg i32* %P, i32 0 seq_cst - unreachable -F: - ret void -} - -attributes #0 = { "null-pointer-is-valid"="true" } diff --git a/llvm/test/Transforms/SimplifyCFG/two-entry-phi-return.ll b/llvm/test/Transforms/SimplifyCFG/two-entry-phi-return.ll deleted file mode 100644 index 1e9aa6b48f6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/two-entry-phi-return.ll +++ /dev/null @@ -1,26 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -simplifycfg -S | FileCheck %s - -define i1 @qux(i8* %m, i8* %n, i8* %o, i8* %p) nounwind { -; CHECK-LABEL: @qux( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8* %m, %n -; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i8* %o, %p -; CHECK-NEXT: [[TMP15_:%.*]] = select i1 [[TMP7]], i1 [[TMP15]], i1 false, !prof !0 -; CHECK-NEXT: ret i1 [[TMP15_]] -; -entry: - %tmp7 = icmp eq i8* %m, %n - br i1 %tmp7, label %bb, label %UnifiedReturnBlock, !prof !0 - -bb: - %tmp15 = icmp eq i8* %o, %p - br label %UnifiedReturnBlock - -UnifiedReturnBlock: - %result = phi i1 [ 0, %entry ], [ %tmp15, %bb ] - ret i1 %result - -} - -!0 = !{!"branch_weights", i32 4, i32 64} diff --git a/llvm/test/Transforms/SimplifyCFG/unreachable-blocks.ll b/llvm/test/Transforms/SimplifyCFG/unreachable-blocks.ll deleted file mode 100644 index 87a64ad47c6..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/unreachable-blocks.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: opt -simplifycfg < %s -disable-output - -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 triple = "x86_64-pc-linux-gnu" - -; PR11825 -define void @test1() { -entry: - br label %return - -while_block: ; preds = %and_if_cont2, %and_if_cont - %newlen = sub i32 %newlen, 1 - %newptr = getelementptr i8, i8* %newptr, i64 1 - %test = icmp sgt i32 %newlen, 0 - br i1 %test, label %and_if1, label %and_if_cont2 - -and_if1: ; preds = %while_block - %char = load i8, i8* %newptr - %test2 = icmp ule i8 %char, 32 - br label %and_if_cont2 - -and_if_cont2: ; preds = %and_if1, %while_block - %a18 = phi i1 [ %test, %while_block ], [ %test2, %and_if1 ] - br i1 %a18, label %while_block, label %return - -return: ; preds = %and_if_cont2, %and_if_cont - ret void -} diff --git a/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll b/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll deleted file mode 100644 index 9198b2a6ea4..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt -simplifycfg -S < %s | FileCheck %s -target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" -target triple = "i686-pc-win32" - -declare i32 @__CxxFrameHandler3(...) - -declare void @fn_2() - -define void @fn_1(i1 %B) personality i32 (...)* @__CxxFrameHandler3 { -entry: - br i1 %B, label %__Ea.exit, label %lor.lhs.false.i.i - -lor.lhs.false.i.i: - br i1 %B, label %if.end.i.i, label %__Ea.exit - -if.end.i.i: - invoke void @fn_2() - to label %__Ea.exit unwind label %ehcleanup.i - -ehcleanup.i: - %t4 = cleanuppad within none [] - br label %arraydestroy.body.i - -arraydestroy.body.i: - %gep = getelementptr i8, i8* null, i32 -1 - br label %dtor.exit.i - -dtor.exit.i: - br i1 %B, label %arraydestroy.done3.i, label %arraydestroy.body.i - -arraydestroy.done3.i: - cleanupret from %t4 unwind to caller - -__Ea.exit: - ret void -} - -; CHECK-LABEL: define void @fn_1( -; CHECK-NEXT: entry: -; CHECK-NEXT: ret void diff --git a/llvm/test/Transforms/SimplifyCFG/volatile-phioper.ll b/llvm/test/Transforms/SimplifyCFG/volatile-phioper.ll deleted file mode 100644 index c366d059d33..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/volatile-phioper.ll +++ /dev/null @@ -1,48 +0,0 @@ -; RUN: opt < %s -simplifycfg -S | FileCheck %s -; -; rdar:13349374 -; -; SimplifyCFG should not eliminate blocks with volatile stores. -; Essentially, volatile needs to be backdoor that tells the optimizer -; it can no longer use language standard as an excuse. The compiler -; needs to expose the volatile access to the platform. -; -; CHECK-LABEL: @test( -; CHECK: entry: -; CHECK: @Trace -; CHECK: while.body: -; CHECK: store volatile -; CHECK: end: -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-S128" - -define void @test(i8** nocapture %PeiServices) #0 { -entry: - %call = tail call i32 (...) @Trace() #2 - %tobool = icmp eq i32 %call, 0 - br i1 %tobool, label %while.body, label %if.then - -if.then: ; preds = %entry - %call1 = tail call i32 (...) @Trace() #2 - br label %while.body - -while.body: ; preds = %entry, %if.then, %while.body - %Addr.017 = phi i8* [ %incdec.ptr, %while.body ], [ null, %if.then ], [ null, %entry ] - %x.016 = phi i8 [ %inc, %while.body ], [ 0, %if.then ], [ 0, %entry ] - %inc = add i8 %x.016, 1 - %incdec.ptr = getelementptr inbounds i8, i8* %Addr.017, i64 1 - store volatile i8 %x.016, i8* %Addr.017, align 1 - %0 = ptrtoint i8* %incdec.ptr to i64 - %1 = trunc i64 %0 to i32 - %cmp = icmp ult i32 %1, 4096 - br i1 %cmp, label %while.body, label %end - -end: - ret void -} -declare i32 @Trace(...) #1 - -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 = !{i32 1039} diff --git a/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll b/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll deleted file mode 100644 index c5d6490ba5d..00000000000 --- a/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll +++ /dev/null @@ -1,167 +0,0 @@ -; RUN: opt -S -simplifycfg < %s | FileCheck %s - -declare void @Personality() -declare void @f() - -; CHECK-LABEL: define void @test1() -define void @test1() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - ; CHECK: call void @f() - invoke void @f() - to label %exit unwind label %unreachable.unwind -exit: - ret void -unreachable.unwind: - cleanuppad within none [] - unreachable -} - -; CHECK-LABEL: define void @test2() -define void @test2() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad -catch.pad: - %cs1 = catchswitch within none [label %catch.body] unwind label %unreachable.unwind - ; CHECK: catch.pad: - ; CHECK-NEXT: catchswitch within none [label %catch.body] unwind to caller -catch.body: - ; CHECK: catch.body: - ; CHECK-NEXT: catchpad within %cs1 - ; CHECK-NEXT: call void @f() - ; CHECK-NEXT: unreachable - %catch = catchpad within %cs1 [] - call void @f() - catchret from %catch to label %unreachable -exit: - ret void -unreachable.unwind: - cleanuppad within none [] - unreachable -unreachable: - unreachable -} - -; CHECK-LABEL: define void @test3() -define void @test3() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %cleanup.pad -cleanup.pad: - ; CHECK: %cleanup = cleanuppad within none [] - ; CHECK-NEXT: call void @f() - ; CHECK-NEXT: unreachable - %cleanup = cleanuppad within none [] - invoke void @f() - to label %cleanup.ret unwind label %unreachable.unwind -cleanup.ret: - ; This cleanupret should be rewritten to unreachable, - ; and merged into the pred block. - cleanupret from %cleanup unwind label %unreachable.unwind -exit: - ret void -unreachable.unwind: - cleanuppad within none [] - unreachable -} - -; CHECK-LABEL: define void @test5() -define void @test5() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad - -catch.pad: - %cs1 = catchswitch within none [label %catch.body] unwind to caller - -catch.body: - %catch = catchpad within %cs1 [] - catchret from %catch to label %exit - -exit: - unreachable -} - -; CHECK-LABEL: define void @test6() -define void @test6() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad - -catch.pad: - %cs1 = catchswitch within none [label %catch.body, label %catch.body] unwind to caller - ; CHECK: catchswitch within none [label %catch.body] unwind to caller - -catch.body: - %catch = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch to label %exit - -exit: - ret void -} - -; CHECK-LABEL: define void @test7() -define void @test7() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad - -catch.pad: - %cs1 = catchswitch within none [label %catch.body, label %catch.body2] unwind to caller - ; CHECK: catchswitch within none [label %catch.body] unwind to caller - -catch.body: - %catch = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch to label %exit - -catch.body2: - %catch2 = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch2 to label %exit - -exit: - ret void -} - -; CHECK-LABEL: define void @test8() -define void @test8() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad - -catch.pad: - %cs1 = catchswitch within none [label %catch.body, label %catch.body2] unwind to caller - ; CHECK: catchswitch within none [label %catch.body] unwind to caller - -catch.body2: - %catch2 = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch2 to label %exit - -catch.body: - %catch = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch to label %exit - -exit: - ret void -} - -; CHECK-LABEL: define void @test9() -define void @test9() personality i8* bitcast (void ()* @Personality to i8*) { -entry: - invoke void @f() - to label %exit unwind label %catch.pad - -catch.pad: - %cs1 = catchswitch within none [label %catch.body, label %catch.body2] unwind to caller - ; CHECK: catchswitch within none [label %catch.body, label %catch.body2] unwind to caller - -catch.body: - %catch = catchpad within %cs1 [i8* null, i32 0, i8* null] - catchret from %catch to label %exit - -catch.body2: - %catch2 = catchpad within %cs1 [i8* null, i32 64, i8* null] - catchret from %catch2 to label %exit - -exit: - ret void -} |