From b6909fe9ca1789db98c3481977468d33e9886182 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sun, 27 Nov 2022 11:42:45 -0500 Subject: [PATCH] JumpThreading: Modernize some test checking Stop using tests with grep, or no output checks at all. Just use FileCheck and generate checks. Also remove unnecessary requires asserts. --- .../JumpThreading/2008-11-27-EntryMunge.ll | 14 +- .../JumpThreading/2011-04-02-SimplifyDeadBlock.ll | 25 ++- .../Transforms/JumpThreading/2011-04-14-InfLoop.ll | 19 +- .../2012-07-19-NoSuccessorIndirectBr.ll | 7 +- llvm/test/Transforms/JumpThreading/PR37745.ll | 13 +- .../JumpThreading/aa-crash-phi-no-args.ll | 15 +- .../Transforms/JumpThreading/branch-no-const.ll | 20 +- llvm/test/Transforms/JumpThreading/compare.ll | 40 ++-- llvm/test/Transforms/JumpThreading/ddt-crash.ll | 227 ++++++++++++++++++--- llvm/test/Transforms/JumpThreading/ddt-crash2.ll | 25 ++- llvm/test/Transforms/JumpThreading/ddt-crash3.ll | 17 +- llvm/test/Transforms/JumpThreading/ddt-crash4.ll | 22 +- .../Transforms/JumpThreading/degenerate-phi.ll | 16 +- llvm/test/Transforms/JumpThreading/landing-pad.ll | 144 ++++++++++++- .../JumpThreading/no-irreducible-loops.ll | 39 ++-- llvm/test/Transforms/JumpThreading/pr9331.ll | 9 +- .../stale-loop-info-after-unfold-select.ll | 23 ++- 17 files changed, 596 insertions(+), 79 deletions(-) diff --git a/llvm/test/Transforms/JumpThreading/2008-11-27-EntryMunge.ll b/llvm/test/Transforms/JumpThreading/2008-11-27-EntryMunge.ll index 05ca087..f70caf3 100644 --- a/llvm/test/Transforms/JumpThreading/2008-11-27-EntryMunge.ll +++ b/llvm/test/Transforms/JumpThreading/2008-11-27-EntryMunge.ll @@ -1,13 +1,19 @@ -; RUN: opt < %s -passes=jump-threading -S | grep "ret i32 0" +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=jump-threading -S < %s | FileCheck %s ; PR3138 +; Check that there's a ret 0 define i32 @jt() { +; CHECK-LABEL: @jt( +; CHECK-NEXT: bb3: +; CHECK-NEXT: ret i32 0 +; entry: - br i1 true, label %bb3, label %bb + br i1 true, label %bb3, label %bb bb: ; preds = %entry - unreachable + unreachable bb3: ; preds = %entry - ret i32 0 + ret i32 0 } diff --git a/llvm/test/Transforms/JumpThreading/2011-04-02-SimplifyDeadBlock.ll b/llvm/test/Transforms/JumpThreading/2011-04-02-SimplifyDeadBlock.ll index 4203000..2ef21d0 100644 --- a/llvm/test/Transforms/JumpThreading/2011-04-02-SimplifyDeadBlock.ll +++ b/llvm/test/Transforms/JumpThreading/2011-04-02-SimplifyDeadBlock.ll @@ -1,8 +1,31 @@ -; RUN: opt -S -passes=jump-threading < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -jump-threading < %s | FileCheck %s ; PR9446 ; Just check that it doesn't crash define void @int327() nounwind { +; CHECK-LABEL: @int327( +; CHECK-NEXT: entry: +; CHECK-NEXT: unreachable +; CHECK: for.cond: +; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp eq i8 undef, 0 +; CHECK-NEXT: br i1 [[TOBOOL3]], label [[FOR_COND23:%.*]], label [[FOR_COND4:%.*]] +; CHECK: for.cond4: +; CHECK-NEXT: br label [[FOR_COND:%.*]] +; CHECK: for.cond23: +; CHECK-NEXT: [[CONV321:%.*]] = phi i32 [ [[CONV32:%.*]], [[FOR_BODY28:%.*]] ], [ 0, [[FOR_COND]] ], [ [[CONV321]], [[FOR_COND23]] ] +; CHECK-NEXT: [[L_266_0:%.*]] = phi i32 [ [[PHITMP:%.*]], [[FOR_BODY28]] ], [ 0, [[FOR_COND]] ], [ 0, [[FOR_COND23]] ] +; CHECK-NEXT: [[CMP26:%.*]] = icmp eq i32 [[L_266_0]], 0 +; CHECK-NEXT: br i1 [[CMP26]], label [[FOR_BODY28]], label [[FOR_COND23]] +; CHECK: for.body28: +; CHECK-NEXT: [[AND:%.*]] = and i32 [[CONV321]], 1 +; CHECK-NEXT: [[CONV32]] = zext i8 undef to i32 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[L_266_0]], 1 +; CHECK-NEXT: [[PHITMP]] = and i32 [[ADD]], 255 +; CHECK-NEXT: br label [[FOR_COND23]] +; CHECK: if.end43: +; CHECK-NEXT: ret void +; entry: unreachable diff --git a/llvm/test/Transforms/JumpThreading/2011-04-14-InfLoop.ll b/llvm/test/Transforms/JumpThreading/2011-04-14-InfLoop.ll index 393d499..7c3c00f 100644 --- a/llvm/test/Transforms/JumpThreading/2011-04-14-InfLoop.ll +++ b/llvm/test/Transforms/JumpThreading/2011-04-14-InfLoop.ll @@ -1,4 +1,5 @@ -; RUN: opt -passes=jump-threading < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s ; %0 = type <{ i64, i16, i64, i8, i8 }> @@ -6,6 +7,22 @@ @g_338 = external global %0, align 8 define void @func_1() nounwind ssp { +; CHECK-LABEL: @func_1( +; CHECK-NEXT: entry: +; CHECK-NEXT: ret void +; CHECK: for.cond1177: +; CHECK-NEXT: [[INC1187:%.*]] = add nsw i32 0, 1 +; CHECK-NEXT: [[CMP1179:%.*]] = icmp slt i32 [[INC1187]], 5 +; CHECK-NEXT: br i1 [[CMP1179]], label [[FOR_COND1177:%.*]], label [[LAND_RHS1320:%.*]] +; CHECK: land.rhs1320: +; CHECK-NEXT: [[TMP1324:%.*]] = load volatile i64, ptr getelementptr inbounds ([[TMP0:%.*]], ptr @g_338, i64 0, i32 2), align 1 +; CHECK-NEXT: br label [[IF_END_I:%.*]] +; CHECK: if.end.i: +; CHECK-NEXT: [[TOBOOL_PR_I:%.*]] = phi i1 [ false, [[IF_END_I]] ], [ false, [[LAND_RHS1320]] ] +; CHECK-NEXT: br i1 [[TOBOOL_PR_I]], label [[RETURN:%.*]], label [[IF_END_I]] +; CHECK: return: +; CHECK-NEXT: ret void +; entry: ret void diff --git a/llvm/test/Transforms/JumpThreading/2012-07-19-NoSuccessorIndirectBr.ll b/llvm/test/Transforms/JumpThreading/2012-07-19-NoSuccessorIndirectBr.ll index 2a4b4e3..a11735e 100644 --- a/llvm/test/Transforms/JumpThreading/2012-07-19-NoSuccessorIndirectBr.ll +++ b/llvm/test/Transforms/JumpThreading/2012-07-19-NoSuccessorIndirectBr.ll @@ -1,8 +1,13 @@ -; RUN: opt -S -passes=jump-threading < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s ; PR 13405 ; Just check that it doesn't crash / assert define i32 @f() nounwind { +; CHECK-LABEL: @f( +; CHECK-NEXT: entry: +; CHECK-NEXT: indirectbr ptr undef, [] +; entry: indirectbr ptr undef, [] } diff --git a/llvm/test/Transforms/JumpThreading/PR37745.ll b/llvm/test/Transforms/JumpThreading/PR37745.ll index 8c84636..f71aaab 100644 --- a/llvm/test/Transforms/JumpThreading/PR37745.ll +++ b/llvm/test/Transforms/JumpThreading/PR37745.ll @@ -1,6 +1,17 @@ -; RUN: opt -passes=jump-threading -verify-each -S -mtriple=x86_64-- -o - %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading -verify-each -mtriple=x86_64-- < %s | FileCheck %s define void @foo() { +; CHECK-LABEL: @foo( +; CHECK-NEXT: B: +; CHECK-NEXT: [[Z:%.*]] = add i32 undef, 1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[Z]], 0 +; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[B_THREAD:%.*]] +; CHECK: B.thread: +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; entry: br i1 false, label %A, label %B diff --git a/llvm/test/Transforms/JumpThreading/aa-crash-phi-no-args.ll b/llvm/test/Transforms/JumpThreading/aa-crash-phi-no-args.ll index 3287324..ba3fca8 100644 --- a/llvm/test/Transforms/JumpThreading/aa-crash-phi-no-args.ll +++ b/llvm/test/Transforms/JumpThreading/aa-crash-phi-no-args.ll @@ -1,7 +1,18 @@ -; REQUIRES: asserts -; RUN: opt -passes=jump-threading -aa-pipeline basic-aa -S -disable-output %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading -aa-pipeline basic-aa < %s | FileCheck %s define void @foo(ptr %arg1, ptr %arg2) { +; CHECK-LABEL: @foo( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label [[BB1:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[TMP:%.*]] = phi i1 [ false, [[BB24:%.*]] ], [ true, [[BB:%.*]] ] +; CHECK-NEXT: br i1 [[TMP]], label [[BB8:%.*]], label [[BB24]] +; CHECK: bb8: +; CHECK-NEXT: ret void +; CHECK: bb24: +; CHECK-NEXT: br label [[BB1]] +; bb: br label %bb1 diff --git a/llvm/test/Transforms/JumpThreading/branch-no-const.ll b/llvm/test/Transforms/JumpThreading/branch-no-const.ll index 97e71a8..a27ee72 100644 --- a/llvm/test/Transforms/JumpThreading/branch-no-const.ll +++ b/llvm/test/Transforms/JumpThreading/branch-no-const.ll @@ -1,8 +1,22 @@ -; RUN: opt < %s -passes=jump-threading -S | not grep phi +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s declare i8 @mcguffin() +; Check there's no phi here. define i32 @test(i1 %foo, i8 %b) { +; CHECK-LABEL: @test( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[A:%.*]] = call i8 @mcguffin() +; CHECK-NEXT: br i1 [[FOO:%.*]], label [[RT:%.*]], label [[JT:%.*]] +; CHECK: jt: +; CHECK-NEXT: [[CMP_A:%.*]] = icmp eq i8 [[B:%.*]], [[A]] +; CHECK-NEXT: br i1 [[CMP_A]], label [[RT]], label [[RF:%.*]] +; CHECK: rt: +; CHECK-NEXT: ret i32 7 +; CHECK: rf: +; CHECK-NEXT: ret i32 8 +; entry: %a = call i8 @mcguffin() br i1 %foo, label %bb1, label %bb2 @@ -12,8 +26,8 @@ bb2: br label %jt jt: %x = phi i8 [%a, %bb1], [%b, %bb2] - %A = icmp eq i8 %x, %a - br i1 %A, label %rt, label %rf + %cmp.a = icmp eq i8 %x, %a + br i1 %cmp.a, label %rt, label %rf rt: ret i32 7 rf: diff --git a/llvm/test/Transforms/JumpThreading/compare.ll b/llvm/test/Transforms/JumpThreading/compare.ll index af39a54..7e1622b 100644 --- a/llvm/test/Transforms/JumpThreading/compare.ll +++ b/llvm/test/Transforms/JumpThreading/compare.ll @@ -1,30 +1,46 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; There should be no phi nodes left. -; RUN: opt < %s -passes=jump-threading -S | not grep "phi i32" +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s declare i32 @f1() declare i32 @f2() declare void @f3() define i32 @test(i1 %cond) { - br i1 %cond, label %T1, label %F1 +; CHECK-LABEL: @test( +; CHECK-NEXT: br i1 [[COND:%.*]], label [[MERGE:%.*]], label [[MERGE_THREAD:%.*]] +; CHECK: Merge.thread: +; CHECK-NEXT: [[V2:%.*]] = call i32 @f2() +; CHECK-NEXT: br label [[T2:%.*]] +; CHECK: Merge: +; CHECK-NEXT: [[V1:%.*]] = call i32 @f1() +; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[V1]], 42 +; CHECK-NEXT: br i1 [[A]], label [[T2]], label [[F2:%.*]] +; CHECK: T2: +; CHECK-NEXT: call void @f3() +; CHECK-NEXT: ret i32 1 +; CHECK: F2: +; CHECK-NEXT: ret i32 0 +; + br i1 %cond, label %T1, label %F1 T1: - %v1 = call i32 @f1() - br label %Merge + %v1 = call i32 @f1() + br label %Merge F1: - %v2 = call i32 @f2() - br label %Merge + %v2 = call i32 @f2() + br label %Merge Merge: - %B = phi i32 [%v1, %T1], [12, %F1] - %A = icmp ne i32 %B, 42 - br i1 %A, label %T2, label %F2 + %B = phi i32 [%v1, %T1], [12, %F1] + %A = icmp ne i32 %B, 42 + br i1 %A, label %T2, label %F2 T2: - call void @f3() - ret i32 1 + call void @f3() + ret i32 1 F2: - ret i32 0 + ret i32 0 } diff --git a/llvm/test/Transforms/JumpThreading/ddt-crash.ll b/llvm/test/Transforms/JumpThreading/ddt-crash.ll index 2491edb..e91b0b6 100644 --- a/llvm/test/Transforms/JumpThreading/ddt-crash.ll +++ b/llvm/test/Transforms/JumpThreading/ddt-crash.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -passes=jump-threading -disable-output +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s %struct.ham = type { i8, i8, i16, i32 } %struct.zot = type { ptr } @@ -11,6 +12,27 @@ declare i32 @wombat.2() define void @blam() { +; CHECK-LABEL: @blam( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr undef, align 4 +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP]], 0 +; CHECK-NEXT: br i1 [[TMP1]], label [[BB11:%.*]], label [[BB2:%.*]] +; CHECK: bb2: +; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @wombat.2() +; CHECK-NEXT: switch i32 [[TMP3]], label [[BB10:%.*]] [ +; CHECK-NEXT: i32 0, label [[BB7:%.*]] +; CHECK-NEXT: i32 1, label [[BB10]] +; CHECK-NEXT: i32 2, label [[BB10]] +; CHECK-NEXT: i32 3, label [[BB11]] +; CHECK-NEXT: ] +; CHECK: bb7: +; CHECK-NEXT: [[TMP6:%.*]] = tail call i32 @wombat.2() +; CHECK-NEXT: br label [[BB11]] +; CHECK: bb10: +; CHECK-NEXT: ret void +; CHECK: bb11: +; CHECK-NEXT: ret void +; bb: %tmp = load i32, ptr undef %tmp1 = icmp eq i32 %tmp, 0 @@ -45,6 +67,84 @@ bb11: } define void @spam(ptr %arg) { +; CHECK-LABEL: @spam( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP:%.*]] = load i8, ptr undef, align 8 +; CHECK-NEXT: switch i8 [[TMP]], label [[BB11:%.*]] [ +; CHECK-NEXT: i8 1, label [[BB11]] +; CHECK-NEXT: i8 2, label [[BB11]] +; CHECK-NEXT: i8 3, label [[BB1:%.*]] +; CHECK-NEXT: i8 4, label [[BB1]] +; CHECK-NEXT: ] +; CHECK: bb1: +; CHECK-NEXT: br label [[BB2:%.*]] +; CHECK: bb2: +; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[TMP3]], [[BB8:%.*]] ] +; CHECK-NEXT: br label [[BB4:%.*]] +; CHECK: bb4: +; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr undef, align 8 +; CHECK-NEXT: switch i8 [[TMP5]], label [[BB11]] [ +; CHECK-NEXT: i8 0, label [[BB11]] +; CHECK-NEXT: i8 1, label [[BB10:%.*]] +; CHECK-NEXT: i8 2, label [[BB10]] +; CHECK-NEXT: i8 3, label [[BB8]] +; CHECK-NEXT: i8 4, label [[BB8]] +; CHECK-NEXT: ] +; CHECK: bb8: +; CHECK-NEXT: [[TMP9:%.*]] = icmp eq ptr undef, [[ARG:%.*]] +; CHECK-NEXT: br i1 [[TMP9]], label [[BB10]], label [[BB2]] +; CHECK: bb10: +; CHECK-NEXT: switch i32 [[TMP3]], label [[BB4]] [ +; CHECK-NEXT: i32 0, label [[BB16:%.*]] +; CHECK-NEXT: i32 1, label [[BB11]] +; CHECK-NEXT: i32 2, label [[BB12:%.*]] +; CHECK-NEXT: ] +; CHECK: bb11: +; CHECK-NEXT: unreachable +; CHECK: bb12: +; CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: br label [[BB16]] +; CHECK: bb16: +; CHECK-NEXT: [[TMP15:%.*]] = phi ptr [ [[TMP13]], [[BB12]] ], [ null, [[BB10]] ] +; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr undef, align 8 +; CHECK-NEXT: switch i8 [[TMP17]], label [[BB11]] [ +; CHECK-NEXT: i8 0, label [[BB11]] +; CHECK-NEXT: i8 11, label [[BB23:%.*]] +; CHECK-NEXT: i8 12, label [[BB23]] +; CHECK-NEXT: ] +; CHECK: bb23: +; CHECK-NEXT: [[TMP21:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: [[TMP24:%.*]] = icmp eq ptr [[TMP21]], null +; CHECK-NEXT: br i1 [[TMP24]], label [[BB37:%.*]], label [[BB25:%.*]] +; CHECK: bb25: +; CHECK-NEXT: [[TMP26:%.*]] = icmp eq ptr [[TMP15]], null +; CHECK-NEXT: br i1 [[TMP26]], label [[BB41_THREAD:%.*]], label [[BB27:%.*]] +; CHECK: bb27: +; CHECK-NEXT: [[TMP28:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: [[TMP29:%.*]] = icmp eq ptr [[TMP28]], [[TMP21]] +; CHECK-NEXT: br i1 [[TMP29]], label [[BB41_THREAD]], label [[BB30:%.*]] +; CHECK: bb30: +; CHECK-NEXT: [[TMP32_PR:%.*]] = load i8, ptr undef, align 8 +; CHECK-NEXT: br label [[BB31:%.*]] +; CHECK: bb31: +; CHECK-NEXT: [[TMP32:%.*]] = phi i8 [ [[TMP32]], [[BB31]] ], [ [[TMP32_PR]], [[BB30]] ] +; CHECK-NEXT: [[TMP33:%.*]] = icmp eq i8 [[TMP32]], 0 +; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB37]] +; CHECK: bb37: +; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ], [ true, [[BB31]] ] +; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null +; CHECK-NEXT: br i1 [[TMP38]], label [[BB39:%.*]], label [[BB41:%.*]] +; CHECK: bb39: +; CHECK-NEXT: [[TMP364:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] +; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8 +; CHECK-NEXT: br i1 [[TMP364]], label [[BB41_THREAD]], label [[BB41_THREAD]] +; CHECK: bb41: +; CHECK-NEXT: [[TMP363:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] +; CHECK-NEXT: br i1 [[TMP363]], label [[BB41_THREAD]], label [[BB41_THREAD]] +; CHECK: bb41.thread: +; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB39]] ], [ undef, [[BB39]] ], [ undef, [[BB41]] ], [ undef, [[BB27]] ], [ undef, [[BB25]] ] +; CHECK-NEXT: ret void +; bb: %tmp = load i8, ptr undef, align 8 switch i8 %tmp, label %bb11 [ @@ -168,88 +268,165 @@ bb41: declare i32 @foo(...) define void @zot() align 2 personality ptr @foo { +; CHECK-LABEL: @zot( +; CHECK-NEXT: bb: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB1:%.*]] unwind label [[BB3:%.*]] +; CHECK: bb1: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB2:%.*]] unwind label [[BB4:%.*]] +; CHECK: bb2: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB17:%.*]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb4: +; CHECK-NEXT: [[TMP5:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb6: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB7:%.*]] unwind label [[BB19:%.*]] +; CHECK: bb7: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB10:%.*]] unwind label [[BB8:%.*]] +; CHECK: bb8: +; CHECK-NEXT: [[TMP9:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: cleanup +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb10: +; CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: [[TMP12:%.*]] = invoke i32 [[TMP11]](ptr nonnull undef) +; CHECK-NEXT: to label [[BB13:%.*]] unwind label [[BB21:%.*]] +; CHECK: bb13: +; CHECK-NEXT: invoke void @bar() +; CHECK-NEXT: to label [[BB14:%.*]] unwind label [[BB30:%.*]] +; CHECK: bb14: +; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: [[TMP16:%.*]] = invoke i32 [[TMP15]](ptr nonnull undef) +; CHECK-NEXT: to label [[BB26:%.*]] unwind label [[BB30_THREAD:%.*]] +; CHECK: bb17: +; CHECK-NEXT: [[TMP18:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb19: +; CHECK-NEXT: [[TMP20:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb21: +; CHECK-NEXT: [[TMP22:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; CHECK: bb26: +; CHECK-NEXT: [[TMP27:%.*]] = load ptr, ptr undef, align 8 +; CHECK-NEXT: [[TMP28:%.*]] = invoke i32 [[TMP27]](ptr nonnull undef) +; CHECK-NEXT: to label [[BB29:%.*]] unwind label [[BB30_THREAD]] +; CHECK: bb29: +; CHECK-NEXT: unreachable +; CHECK: bb30.thread: +; CHECK-NEXT: [[LPAD_THR_COMM:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: br label [[BB32:%.*]] +; CHECK: bb30: +; CHECK-NEXT: [[LPAD_THR_COMM_SPLIT_LP:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr @global.1 +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: br label [[BB32]] +; CHECK: bb32: +; CHECK-NEXT: unreachable +; bb: invoke void @bar() - to label %bb1 unwind label %bb3 + to label %bb1 unwind label %bb3 bb1: invoke void @bar() - to label %bb2 unwind label %bb4 + to label %bb2 unwind label %bb4 bb2: invoke void @bar() - to label %bb6 unwind label %bb17 + to label %bb6 unwind label %bb17 bb3: %tmp = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null unreachable bb4: %tmp5 = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null unreachable bb6: invoke void @bar() - to label %bb7 unwind label %bb19 + to label %bb7 unwind label %bb19 bb7: invoke void @bar() - to label %bb10 unwind label %bb8 + to label %bb10 unwind label %bb8 bb8: %tmp9 = landingpad { ptr, i32 } - cleanup - catch ptr @global.1 - catch ptr null + cleanup + catch ptr @global.1 + catch ptr null unreachable bb10: %tmp11 = load ptr, ptr undef, align 8 %tmp12 = invoke i32 %tmp11(ptr nonnull undef) - to label %bb13 unwind label %bb21 + to label %bb13 unwind label %bb21 bb13: invoke void @bar() - to label %bb14 unwind label %bb23 + to label %bb14 unwind label %bb23 bb14: %tmp15 = load ptr, ptr undef, align 8 %tmp16 = invoke i32 %tmp15(ptr nonnull undef) - to label %bb26 unwind label %bb23 + to label %bb26 unwind label %bb23 bb17: %tmp18 = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null unreachable bb19: %tmp20 = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null unreachable bb21: %tmp22 = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null unreachable bb23: %tmp24 = phi ptr [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ] %tmp25 = landingpad { ptr, i32 } - catch ptr @global.1 - catch ptr null + catch ptr @global.1 + catch ptr null br label %bb30 bb26: %tmp27 = load ptr, ptr undef, align 8 %tmp28 = invoke i32 %tmp27(ptr nonnull undef) - to label %bb29 unwind label %bb23 + to label %bb29 unwind label %bb23 bb29: unreachable diff --git a/llvm/test/Transforms/JumpThreading/ddt-crash2.ll b/llvm/test/Transforms/JumpThreading/ddt-crash2.ll index dfe8165..ae43b3c 100644 --- a/llvm/test/Transforms/JumpThreading/ddt-crash2.ll +++ b/llvm/test/Transforms/JumpThreading/ddt-crash2.ll @@ -1,8 +1,31 @@ -; RUN: opt < %s -passes=jump-threading -disable-output +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s %struct.aaa = type { i8 } define void @chrome(ptr noalias sret(%struct.aaa) %arg) local_unnamed_addr #0 align 2 personality ptr @chrome2 { +; CHECK-LABEL: @chrome( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr undef, align 4 +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP]], 0 +; CHECK-NEXT: br i1 [[TMP1]], label [[BB2:%.*]], label [[BB13:%.*]] +; CHECK: bb2: +; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[ARG:%.*]], align 1 +; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 0 +; CHECK-NEXT: br i1 [[TMP5]], label [[BB7:%.*]], label [[BB14:%.*]] +; CHECK: bb7: +; CHECK-NEXT: store i8 0, ptr [[ARG]], align 1 +; CHECK-NEXT: [[TMP9:%.*]] = icmp ne i8 0, 0 +; CHECK-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], i1 true, i1 false +; CHECK-NEXT: br i1 [[TMP10]], label [[BB12:%.*]], label [[BB12]] +; CHECK: bb12: +; CHECK-NEXT: [[TMP94:%.*]] = phi i1 [ [[TMP9]], [[BB7]] ], [ [[TMP9]], [[BB7]] ] +; CHECK-NEXT: br i1 [[TMP94]], label [[BB14]], label [[BB13]] +; CHECK: bb13: +; CHECK-NEXT: unreachable +; CHECK: bb14: +; CHECK-NEXT: ret void +; bb: %tmp = load i32, ptr undef, align 4 %tmp1 = icmp eq i32 %tmp, 0 diff --git a/llvm/test/Transforms/JumpThreading/ddt-crash3.ll b/llvm/test/Transforms/JumpThreading/ddt-crash3.ll index 0f99e6b..b37987b 100644 --- a/llvm/test/Transforms/JumpThreading/ddt-crash3.ll +++ b/llvm/test/Transforms/JumpThreading/ddt-crash3.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -passes=jump-threading -disable-output -verify-dom-info +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading -verify-dom-info < %s | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -9,6 +10,20 @@ target triple = "x86_64-unknown-linux-gnu" ; Function Attrs: norecurse noreturn nounwind uwtable define void @hoge() local_unnamed_addr #0 { +; CHECK-LABEL: @hoge( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label [[BB1:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[TMP:%.*]] = load i64, ptr @global, align 8, !tbaa [[TBAA1:![0-9]+]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP]], 0 +; CHECK-NEXT: br i1 [[TMP2]], label [[BB26:%.*]], label [[BB3:%.*]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @global.1, align 8, !tbaa [[TBAA1]] +; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 0 +; CHECK-NEXT: br i1 [[TMP5]], label [[BB26]], label [[BB26]] +; CHECK: bb26: +; CHECK-NEXT: br label [[BB1]] +; bb: br label %bb1 diff --git a/llvm/test/Transforms/JumpThreading/ddt-crash4.ll b/llvm/test/Transforms/JumpThreading/ddt-crash4.ll index e92412a..69eec7d 100644 --- a/llvm/test/Transforms/JumpThreading/ddt-crash4.ll +++ b/llvm/test/Transforms/JumpThreading/ddt-crash4.ll @@ -1,7 +1,27 @@ -; RUN: opt < %s -passes=jump-threading -disable-output -verify-dom-info +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading -verify-dom-info < %s | FileCheck %s + @global = external global i64, align 8 define void @f() { +; CHECK-LABEL: @f( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label [[BB1:%.*]] +; CHECK: bb1: +; CHECK-NEXT: [[TMP:%.*]] = load i64, ptr @global, align 8 +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP]], 0 +; CHECK-NEXT: br i1 [[TMP2]], label [[BB27:%.*]], label [[BB3:%.*]] +; CHECK: bb3: +; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @global, align 8 +; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 0 +; CHECK-NEXT: br i1 [[TMP5]], label [[BB23:%.*]], label [[BB23]] +; CHECK: bb23: +; CHECK-NEXT: br label [[BB26:%.*]] +; CHECK: bb26: +; CHECK-NEXT: br label [[BB1]] +; CHECK: bb27: +; CHECK-NEXT: br label [[BB26]] +; bb: br label %bb1 diff --git a/llvm/test/Transforms/JumpThreading/degenerate-phi.ll b/llvm/test/Transforms/JumpThreading/degenerate-phi.ll index 6e0c233..a8060a2 100644 --- a/llvm/test/Transforms/JumpThreading/degenerate-phi.ll +++ b/llvm/test/Transforms/JumpThreading/degenerate-phi.ll @@ -1,4 +1,5 @@ -; RUN: opt -passes=jump-threading -disable-output < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s ; PR9112 ; This is actually a test for value tracking. Jump threading produces @@ -6,6 +7,19 @@ ; The .ll parser won't let us write that directly since it's invalid code. define void @func() nounwind { +; CHECK-LABEL: @func( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BB:%.*]] +; CHECK: bb: +; CHECK-NEXT: br label [[BB]] +; CHECK: unreachable: +; CHECK-NEXT: [[PHI:%.*]] = phi i16 [ [[ADD:%.*]], [[UNREACHABLE:%.*]] ], [ 0, [[NEXT:%.*]] ] +; CHECK-NEXT: [[ADD]] = add i16 0, [[PHI]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[PHI]], 0 +; CHECK-NEXT: br i1 [[CMP]], label [[UNREACHABLE]], label [[NEXT]] +; CHECK: next: +; CHECK-NEXT: br label [[UNREACHABLE]] +; entry: br label %bb diff --git a/llvm/test/Transforms/JumpThreading/landing-pad.ll b/llvm/test/Transforms/JumpThreading/landing-pad.ll index c92ae71..29def94 100644 --- a/llvm/test/Transforms/JumpThreading/landing-pad.ll +++ b/llvm/test/Transforms/JumpThreading/landing-pad.ll @@ -1,4 +1,5 @@ -; RUN: opt -passes=jump-threading -disable-output < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s %class.E = type { ptr, %class.C } %class.C = type { %class.A } @@ -11,6 +12,13 @@ @_ZTI1D = external unnamed_addr constant { ptr, ptr, ptr } define void @_ZN15EditCommandImpl5applyEv(ptr %this) uwtable align 2 { +; CHECK-LABEL: @_ZN15EditCommandImpl5applyEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[VTABLE:%.*]] = load ptr, ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VTABLE]], align 8 +; CHECK-NEXT: call void [[TMP0]](ptr [[THIS]]) +; CHECK-NEXT: ret void +; entry: %vtable = load ptr, ptr %this, align 8 %0 = load ptr, ptr %vtable, align 8 @@ -19,6 +27,12 @@ entry: } define void @_ZN1DC1Ev(ptr nocapture %this) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1DC1Ev( +; CHECK-NEXT: entry: +; CHECK-NEXT: call void @_ZN24CompositeEditCommandImplC2Ev() +; CHECK-NEXT: store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: ret void +; entry: call void @_ZN24CompositeEditCommandImplC2Ev() store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %this, align 8 @@ -26,6 +40,12 @@ entry: } define void @_ZN1DC2Ev(ptr nocapture %this) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1DC2Ev( +; CHECK-NEXT: entry: +; CHECK-NEXT: call void @_ZN24CompositeEditCommandImplC2Ev() +; CHECK-NEXT: store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: ret void +; entry: call void @_ZN24CompositeEditCommandImplC2Ev() store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %this, align 8 @@ -35,15 +55,58 @@ entry: declare void @_ZN24CompositeEditCommandImplC2Ev() #1 define void @_ZN1D7doApplyEv(ptr nocapture %this) unnamed_addr nounwind readnone uwtable align 2 { +; CHECK-LABEL: @_ZN1D7doApplyEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: ret void +; entry: ret void } define void @_Z3fn1v() uwtable personality ptr @__gxx_personality_v0 { +; CHECK-LABEL: @_Z3fn1v( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CALL:%.*]] = call noalias ptr @_Znwm() +; CHECK-NEXT: invoke void @_ZN24CompositeEditCommandImplC2Ev() +; CHECK-NEXT: to label [[_ZN1DC1EV_EXIT:%.*]] unwind label [[LPAD:%.*]] +; CHECK: _ZN1DC1Ev.exit: +; CHECK-NEXT: store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[CALL]], align 8 +; CHECK-NEXT: [[_REF_I_I_I:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 8 +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[_REF_I_I_I]], align 4 +; CHECK-NEXT: [[INC_I_I_I:%.*]] = add nsw i32 [[TMP0]], 1 +; CHECK-NEXT: store i32 [[INC_I_I_I]], ptr [[_REF_I_I_I]], align 4 +; CHECK-NEXT: invoke void @_ZN1D7doApplyEv(ptr [[CALL]]) +; CHECK-NEXT: to label [[_ZN15EDITCOMMANDIMPL5APPLYEV_EXIT:%.*]] unwind label [[LPAD1:%.*]] +; CHECK: _ZN15EditCommandImpl5applyEv.exit: +; CHECK-NEXT: invoke void @_ZN1D16deleteKeyPressedEv() +; CHECK-NEXT: to label [[INVOKE_CONT7:%.*]] unwind label [[LPAD1]] +; CHECK: invoke.cont7: +; CHECK-NEXT: ret void +; CHECK: lpad: +; CHECK-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: cleanup +; CHECK-NEXT: call void @_ZdlPv() +; CHECK-NEXT: unreachable +; CHECK: lpad1: +; CHECK-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: cleanup +; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[_REF_I_I_I]], align 4 +; CHECK-NEXT: [[TOBOOL_I_I_I:%.*]] = icmp eq i32 [[TMP3]], 0 +; CHECK-NEXT: br i1 [[TOBOOL_I_I_I]], label [[_ZN1BI1DED1EV_EXIT:%.*]], label [[DELETE_NOTNULL_I_I_I:%.*]] +; CHECK: delete.notnull.i.i.i: +; CHECK-NEXT: call void @_ZdlPv() +; CHECK-NEXT: unreachable +; CHECK: _ZN1BI1DED1Ev.exit: +; CHECK-NEXT: resume { ptr, i32 } undef +; CHECK: terminate.lpad: +; CHECK-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } +; CHECK-NEXT: catch ptr null +; CHECK-NEXT: unreachable +; entry: %call = call noalias ptr @_Znwm() #8 invoke void @_ZN24CompositeEditCommandImplC2Ev() - to label %_ZN1DC1Ev.exit unwind label %lpad + to label %_ZN1DC1Ev.exit unwind label %lpad _ZN1DC1Ev.exit: ; preds = %entry store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %call, align 8 @@ -52,24 +115,24 @@ _ZN1DC1Ev.exit: ; preds = %entry %inc.i.i.i = add nsw i32 %0, 1 store i32 %inc.i.i.i, ptr %_ref.i.i.i, align 4 invoke void @_ZN1D7doApplyEv(ptr %call) - to label %_ZN15EditCommandImpl5applyEv.exit unwind label %lpad1 + to label %_ZN15EditCommandImpl5applyEv.exit unwind label %lpad1 _ZN15EditCommandImpl5applyEv.exit: ; preds = %_ZN1DC1Ev.exit invoke void @_ZN1D16deleteKeyPressedEv() - to label %invoke.cont7 unwind label %lpad1 + to label %invoke.cont7 unwind label %lpad1 invoke.cont7: ; preds = %_ZN15EditCommandImpl5applyEv.exit ret void lpad: ; preds = %entry %1 = landingpad { ptr, i32 } - cleanup + cleanup call void @_ZdlPv() #9 unreachable lpad1: ; preds = %_ZN1DC1Ev.exit, %_ZN15EditCommandImpl5applyEv.exit %2 = landingpad { ptr, i32 } - cleanup + cleanup %3 = load i32, ptr %_ref.i.i.i, align 4 %tobool.i.i.i = icmp eq i32 %3, 0 br i1 %tobool.i.i.i, label %_ZN1BI1DED1Ev.exit, label %if.then.i.i.i @@ -86,11 +149,20 @@ _ZN1BI1DED1Ev.exit: ; preds = %lpad1, %if.then.i.i terminate.lpad: ; No predecessors! %4 = landingpad { ptr, i32 } - catch ptr null + catch ptr null unreachable } define void @_ZN1BI1DEC1EPS0_(ptr nocapture %this, ptr %p1) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1BI1DEC1EPS0_( +; CHECK-NEXT: entry: +; CHECK-NEXT: store ptr [[P1:%.*]], ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: [[_REF_I_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[P1]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[_REF_I_I]], align 4 +; CHECK-NEXT: [[INC_I_I:%.*]] = add nsw i32 [[TMP0]], 1 +; CHECK-NEXT: store i32 [[INC_I_I]], ptr [[_REF_I_I]], align 4 +; CHECK-NEXT: ret void +; entry: store ptr %p1, ptr %this, align 8 %_ref.i.i = getelementptr inbounds %class.D, ptr %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 @@ -107,6 +179,11 @@ declare i32 @__gxx_personality_v0(...) declare void @_ZdlPv() define ptr @_ZN1BI1DEptEv(ptr nocapture readonly %this) nounwind readonly uwtable align 2 { +; CHECK-LABEL: @_ZN1BI1DEptEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: ret ptr [[TMP0]] +; entry: %0 = load ptr, ptr %this, align 8 ret ptr %0 @@ -115,6 +192,19 @@ entry: declare void @_ZN1D16deleteKeyPressedEv() define void @_ZN1BI1DED1Ev(ptr nocapture readonly %this) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1BI1DED1Ev( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: [[_REF_I_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[TMP0]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[_REF_I_I]], align 4 +; CHECK-NEXT: [[TOBOOL_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 +; CHECK-NEXT: br i1 [[TOBOOL_I_I]], label [[_ZN1BI1DED2EV_EXIT:%.*]], label [[DELETE_NOTNULL_I_I:%.*]] +; CHECK: delete.notnull.i.i: +; CHECK-NEXT: call void @_ZdlPv() +; CHECK-NEXT: unreachable +; CHECK: _ZN1BI1DED2Ev.exit: +; CHECK-NEXT: ret void +; entry: %0 = load ptr, ptr %this, align 8 %_ref.i.i = getelementptr inbounds %class.D, ptr %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 @@ -136,6 +226,19 @@ _ZN1BI1DED2Ev.exit: ; preds = %entry, %if.then.i.i declare hidden void @__clang_call_terminate() define void @_ZN1BI1DED2Ev(ptr nocapture readonly %this) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1BI1DED2Ev( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: [[_REF_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[TMP0]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[_REF_I]], align 4 +; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[TMP1]], 0 +; CHECK-NEXT: br i1 [[TOBOOL_I]], label [[_ZN1AI1CE5DEREFEV_EXIT:%.*]], label [[DELETE_NOTNULL_I:%.*]] +; CHECK: delete.notnull.i: +; CHECK-NEXT: call void @_ZdlPv() +; CHECK-NEXT: unreachable +; CHECK: _ZN1AI1CE5derefEv.exit: +; CHECK-NEXT: ret void +; entry: %0 = load ptr, ptr %this, align 8 %_ref.i = getelementptr inbounds %class.D, ptr %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 @@ -155,6 +258,17 @@ _ZN1AI1CE5derefEv.exit: ; preds = %entry, %if.then.i } define void @_ZN1AI1CE5derefEv(ptr nocapture readonly %this) nounwind uwtable align 2 { +; CHECK-LABEL: @_ZN1AI1CE5derefEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[THIS:%.*]], align 4 +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP0]], 0 +; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[DELETE_NOTNULL:%.*]] +; CHECK: delete.notnull: +; CHECK-NEXT: call void @_ZdlPv() +; CHECK-NEXT: unreachable +; CHECK: if.end: +; CHECK-NEXT: ret void +; entry: %0 = load i32, ptr %this, align 4 %tobool = icmp eq i32 %0, 0 @@ -172,6 +286,15 @@ if.end: ; preds = %entry, %if.then } define void @_ZN1BI1DEC2EPS0_(ptr nocapture %this, ptr %p1) unnamed_addr uwtable align 2 { +; CHECK-LABEL: @_ZN1BI1DEC2EPS0_( +; CHECK-NEXT: entry: +; CHECK-NEXT: store ptr [[P1:%.*]], ptr [[THIS:%.*]], align 8 +; CHECK-NEXT: [[_REF_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[P1]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[_REF_I]], align 4 +; CHECK-NEXT: [[INC_I:%.*]] = add nsw i32 [[TMP0]], 1 +; CHECK-NEXT: store i32 [[INC_I]], ptr [[_REF_I]], align 4 +; CHECK-NEXT: ret void +; entry: store ptr %p1, ptr %this, align 8 %_ref.i = getelementptr inbounds %class.D, ptr %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 @@ -182,6 +305,13 @@ entry: } define void @_ZN1AI1CE3refEv(ptr nocapture %this) nounwind uwtable align 2 { +; CHECK-LABEL: @_ZN1AI1CE3refEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[THIS:%.*]], align 4 +; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP0]], 1 +; CHECK-NEXT: store i32 [[INC]], ptr [[THIS]], align 4 +; CHECK-NEXT: ret void +; entry: %0 = load i32, ptr %this, align 4 %inc = add nsw i32 %0, 1 diff --git a/llvm/test/Transforms/JumpThreading/no-irreducible-loops.ll b/llvm/test/Transforms/JumpThreading/no-irreducible-loops.ll index 63d9a66..c2ceec3 100644 --- a/llvm/test/Transforms/JumpThreading/no-irreducible-loops.ll +++ b/llvm/test/Transforms/JumpThreading/no-irreducible-loops.ll @@ -1,38 +1,45 @@ -; RUN: opt -S < %s -passes=jump-threading,loop-rotate,instcombine,indvars,loop-unroll,simplifycfg -simplifycfg-require-and-preserve-domtree=1 -verify-dom-info -verify-loop-info > %t -; RUN: grep "store volatile" %t | count 3 -; RUN: not grep "br label" %t +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading,loop-rotate,instcombine,indvars,loop-unroll,simplifycfg -simplifycfg-require-and-preserve-domtree=1 -verify-dom-info -verify-loop-info < %s | FileCheck %s ; Jump threading should not prevent this loop from being unrolled. +; There should be 3 volatile stores and no branch 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-darwin9.6" @v1 = external global i32 ; [#uses=2] define i32 @unroll() nounwind { +; CHECK-LABEL: @unroll( +; CHECK-NEXT: entry: +; CHECK-NEXT: store volatile i32 1000, ptr @v1, align 4 +; CHECK-NEXT: store volatile i32 1001, ptr @v1, align 4 +; CHECK-NEXT: store volatile i32 1001, ptr @v1, align 4 +; CHECK-NEXT: ret i32 0 +; entry: - br label %bb4 + br label %bb4 bb: ; preds = %bb4 - %0 = icmp eq i32 %i.0, 0 ; [#uses=1] - br i1 %0, label %bb1, label %bb2 + %0 = icmp eq i32 %i.0, 0 ; [#uses=1] + br i1 %0, label %bb1, label %bb2 bb1: ; preds = %bb - store volatile i32 1000, ptr @v1, align 4 - br label %bb3 + store volatile i32 1000, ptr @v1, align 4 + br label %bb3 bb2: ; preds = %bb - store volatile i32 1001, ptr @v1, align 4 - br label %bb3 + store volatile i32 1001, ptr @v1, align 4 + br label %bb3 bb3: ; preds = %bb2, %bb1 - %1 = add i32 %i.0, 1 ; [#uses=1] - br label %bb4 + %1 = add i32 %i.0, 1 ; [#uses=1] + br label %bb4 bb4: ; preds = %bb3, %entry - %i.0 = phi i32 [ 0, %entry ], [ %1, %bb3 ] ; [#uses=3] - %2 = icmp sgt i32 %i.0, 2 ; [#uses=1] - br i1 %2, label %bb5, label %bb + %i.0 = phi i32 [ 0, %entry ], [ %1, %bb3 ] ; [#uses=3] + %2 = icmp sgt i32 %i.0, 2 ; [#uses=1] + br i1 %2, label %bb5, label %bb bb5: ; preds = %bb4 - ret i32 0 + ret i32 0 } diff --git a/llvm/test/Transforms/JumpThreading/pr9331.ll b/llvm/test/Transforms/JumpThreading/pr9331.ll index aa7a93e..572b1e5 100644 --- a/llvm/test/Transforms/JumpThreading/pr9331.ll +++ b/llvm/test/Transforms/JumpThreading/pr9331.ll @@ -1,6 +1,13 @@ -; RUN: opt -passes=jump-threading -S < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=jump-threading < %s | FileCheck %s define void @func(i8 zeroext %p_44) nounwind { +; CHECK-LABEL: @func( +; CHECK-NEXT: return: +; CHECK-NEXT: ret void +; CHECK: for.inc46: +; CHECK-NEXT: br label [[FOR_INC46:%.*]] +; entry: br i1 false, label %for.cond2, label %if.end50 diff --git a/llvm/test/Transforms/JumpThreading/stale-loop-info-after-unfold-select.ll b/llvm/test/Transforms/JumpThreading/stale-loop-info-after-unfold-select.ll index 333d808..ba40980 100644 --- a/llvm/test/Transforms/JumpThreading/stale-loop-info-after-unfold-select.ll +++ b/llvm/test/Transforms/JumpThreading/stale-loop-info-after-unfold-select.ll @@ -1,9 +1,30 @@ -; RUN: opt -passes='require,jump-threading,verify' -S < %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes='require,jump-threading,verify' < %s | FileCheck %s %"type1" = type { i8 } %"type2" = type opaque define dso_local ptr @func2(ptr %this, ptr) { +; CHECK-LABEL: @func2( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[WHILE_COND:%.*]] +; CHECK: select.unfold: +; CHECK-NEXT: br label [[WHILE_COND]] +; CHECK: while.cond: +; CHECK-NEXT: [[MONTH_0:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[CALL2:%.*]], [[FUNC1_EXIT:%.*]] ], [ [[ADD:%.*]], [[SELECT_UNFOLD:%.*]] ] +; CHECK-NEXT: switch i32 [[MONTH_0]], label [[IF_END_I:%.*]] [ +; CHECK-NEXT: i32 4, label [[FUNC1_EXIT]] +; CHECK-NEXT: i32 1, label [[FUNC1_EXIT]] +; CHECK-NEXT: ] +; CHECK: if.end.i: +; CHECK-NEXT: br label [[FUNC1_EXIT]] +; CHECK: func1.exit: +; CHECK-NEXT: [[RETVAL_0_I:%.*]] = phi i32 [ 9, [[IF_END_I]] ], [ 0, [[WHILE_COND]] ], [ 0, [[WHILE_COND]] ] +; CHECK-NEXT: [[CALL2]] = tail call signext i32 @func3(i32 signext [[RETVAL_0_I]], i32 signext 1, i32 signext 3) +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL2]], 1 +; CHECK-NEXT: [[ADD]] = add nsw i32 [[CALL2]], 2 +; CHECK-NEXT: br i1 [[CMP]], label [[SELECT_UNFOLD]], label [[WHILE_COND]] +; entry: br label %while.cond -- 2.7.4