diff --git a/llvm/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll b/llvm/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll index 90bc14710706..f17f8a2af370 100644 --- a/llvm/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll +++ b/llvm/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll @@ -1,12 +1,19 @@ -; RUN: opt < %s -passes=sccp -S | grep "ret i32 %X" +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=sccp -S | FileCheck %s ; This function definitely returns 1, even if we don't know the direction ; of the branch. define i32 @foo() { - br i1 undef, label %T, label %T -T: ; preds = %0, %0 - %X = add i32 0, 1 ; [#uses=1] - ret i32 %X +; CHECK-LABEL: @foo( +; CHECK-NEXT: br i1 false, label [[T:%.*]], label [[T]] +; CHECK: T: +; CHECK-NEXT: [[X:%.*]] = add i32 0, 1 +; CHECK-NEXT: ret i32 [[X]] +; + br i1 undef, label %T, label %T +T: + %X = add i32 0, 1 + ret i32 %X } diff --git a/llvm/test/Transforms/SCCP/2008-01-27-UndefCorrelate.ll b/llvm/test/Transforms/SCCP/2008-01-27-UndefCorrelate.ll index ed2dfb3fe6f5..5001c03a66bd 100644 --- a/llvm/test/Transforms/SCCP/2008-01-27-UndefCorrelate.ll +++ b/llvm/test/Transforms/SCCP/2008-01-27-UndefCorrelate.ll @@ -1,36 +1,60 @@ -; RUN: opt < %s -passes=sccp -S | grep undef | count 1 +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=sccp -S | FileCheck %s ; PR1938 define i32 @main() { +; CHECK-LABEL: @main( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BB:%.*]] +; CHECK: bb: +; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[K:%.*]], [[BB_BACKEDGE:%.*]] ] +; CHECK-NEXT: [[K]] = add i32 [[INDVAR]], 1 +; CHECK-NEXT: br i1 false, label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] +; CHECK: cond_true: +; CHECK-NEXT: br i1 undef, label [[BB_BACKEDGE]], label [[BB12:%.*]] +; CHECK: bb.backedge: +; CHECK-NEXT: br label [[BB]] +; CHECK: cond_false: +; CHECK-NEXT: [[TMP9:%.*]] = icmp slt i32 [[K]], 10 +; CHECK-NEXT: br i1 [[TMP9]], label [[BB_BACKEDGE]], label [[BB12]] +; CHECK: bb12: +; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[K]], 10 +; CHECK-NEXT: br i1 [[TMP14]], label [[COND_NEXT18:%.*]], label [[COND_TRUE17:%.*]] +; CHECK: cond_true17: +; CHECK-NEXT: tail call void @abort() +; CHECK-NEXT: unreachable +; CHECK: cond_next18: +; CHECK-NEXT: ret i32 0 +; entry: - br label %bb + br label %bb bb: - %indvar = phi i32 [ 0, %entry ], [ %k, %bb.backedge ] - %k = add i32 %indvar, 1 - br i1 undef, label %cond_true, label %cond_false + %indvar = phi i32 [ 0, %entry ], [ %k, %bb.backedge ] + %k = add i32 %indvar, 1 + br i1 undef, label %cond_true, label %cond_false cond_true: - %tmp97 = icmp slt i32 %k, 10 - br i1 %tmp97, label %bb.backedge, label %bb12 + %tmp97 = icmp slt i32 %k, 10 + br i1 %tmp97, label %bb.backedge, label %bb12 bb.backedge: - br label %bb + br label %bb cond_false: - %tmp9 = icmp slt i32 %k, 10 - br i1 %tmp9, label %bb.backedge, label %bb12 + %tmp9 = icmp slt i32 %k, 10 + br i1 %tmp9, label %bb.backedge, label %bb12 bb12: - %tmp14 = icmp eq i32 %k, 10 - br i1 %tmp14, label %cond_next18, label %cond_true17 + %tmp14 = icmp eq i32 %k, 10 + br i1 %tmp14, label %cond_next18, label %cond_true17 cond_true17: - tail call void @abort( ) - unreachable + tail call void @abort( ) + unreachable cond_next18: - ret i32 0 + ret i32 0 } declare void @abort() diff --git a/llvm/test/Transforms/SCCP/return-zapped.ll b/llvm/test/Transforms/SCCP/return-zapped.ll index 98376a5835d7..c186c0e67e5f 100644 --- a/llvm/test/Transforms/SCCP/return-zapped.ll +++ b/llvm/test/Transforms/SCCP/return-zapped.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature ; RUN: opt < %s -S -passes=ipsccp | FileCheck %s ; After the first round of Solver.Solve(), the return value of @testf still @@ -6,10 +7,16 @@ ; false branch to be feasible. We later discover that @testf actually ; returns true, so we end up with an unfolded "br i1 true". define void @test1() { -; CHECK-LABEL: @test1( -; CHECK-LABEL: if.then: -; CHECK: [[CALL:%.+]] = call i1 @testf() -; CHECK-NEXT: br i1 true, label %if.end, label %if.then +; CHECK-LABEL: define {{[^@]+}}@test1() { +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[IF_THEN:%.*]] +; CHECK: if.then: +; CHECK-NEXT: [[FOO:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[IF_THEN]] ] +; CHECK-NEXT: [[NEXT]] = add i32 [[FOO]], 1 +; CHECK-NEXT: [[CALL:%.*]] = call i1 @testf() +; CHECK-NEXT: br i1 true, label [[IF_END:%.*]], label [[IF_THEN]] +; CHECK: if.end: +; CHECK-NEXT: ret void ; entry: br label %if.then @@ -24,7 +31,7 @@ if.end: ; preds = %if.then, %entry } define internal i1 @testf() { -; CHECK-LABEL: define internal i1 @testf( +; CHECK-LABEL: define {{[^@]+}}@testf() { ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[IF_END3:%.*]] ; CHECK: if.end3: @@ -40,15 +47,15 @@ if.end3: ; preds = %if.then1, %entry ret i1 true } - ; Call sites in unreachable blocks should not be a problem. -; CHECK-LABEL: define i1 @test2() { -; CHECK-NEXT: entry: -; CHECK-NEXT: br label %if.end -; CHECK-LABEL: if.end: ; preds = %entry -; CHECK-NEXT: %call2 = call i1 @testf() -; CHECK-NEXT: ret i1 true define i1 @test2() { +; CHECK-LABEL: define {{[^@]+}}@test2() { +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[IF_END:%.*]] +; CHECK: if.end: +; CHECK-NEXT: [[CALL2:%.*]] = call i1 @testf() +; CHECK-NEXT: ret i1 true +; entry: br label %if.end