summaryrefslogtreecommitdiffstats
path: root/llvm/test/Examples/IRTransforms
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Examples/IRTransforms')
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll23
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll90
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll109
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll70
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll40
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll122
-rw-r--r--llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll25
7 files changed, 479 insertions, 0 deletions
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll
new file mode 100644
index 00000000000..faf60f3acdb
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+
+define i8* @simp1(i32 %x) {
+; CHECK-LABEL: @simp1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 42
+; CHECK-NEXT: [[ADDR:%.*]] = select i1 [[CMP]], i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)
+; CHECK-NEXT: ret i8* [[ADDR]]
+;
+entry:
+ %cmp = icmp slt i32 %x, 42
+ %addr = select i1 %cmp, i8* blockaddress(@simp1, %bb1), i8* blockaddress(@simp1, %bb2)
+ ret i8* %addr
+
+bb1:
+ ret i8* null
+
+bb2:
+ ret i8* null
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll
new file mode 100644
index 00000000000..cb0f82e3757
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll
@@ -0,0 +1,90 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+
+define i32 @simp1() {
+; CHECK-LABEL: @simp1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 10
+;
+entry:
+ br i1 true, label %if.then, label %if.else
+
+if.then:
+ ret i32 10
+
+if.else:
+ ret i32 12
+}
+
+define i32 @simp2() {
+; CHECK-LABEL: @simp2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 200
+;
+entry:
+ br i1 false, label %if.then, label %if.else
+
+if.then:
+ ret i32 99
+
+if.else:
+ ret i32 200
+}
+
+declare void @foo(i64)
+
+define i64 @merge_into_predecessor(i64 %a, i64 %b) {
+; CHECK-LABEL: @merge_into_predecessor(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[R:%.*]] = add i64 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: call void @foo(i64 [[R]])
+; CHECK-NEXT: call void @foo(i64 [[A]])
+; CHECK-NEXT: ret i64 [[R]]
+;
+entry:
+ br label %bb.next
+
+bb.next:
+ %r = add i64 %a, %b
+ call void @foo(i64 %r)
+ call void @foo(i64 %a)
+ br label %bb.next.next
+
+bb.next.next:
+ ret i64 %r
+}
+
+define i64 @merge_into_predecessor_with_phi(i64 %a, i64 %b, i1 %c) {
+; CHECK-LABEL: @merge_into_predecessor_with_phi(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @foo(i64 [[B:%.*]])
+; CHECK-NEXT: [[R:%.*]] = add i64 [[A:%.*]], [[B]]
+; CHECK-NEXT: call void @foo(i64 [[R]])
+; CHECK-NEXT: call void @foo(i64 [[A]])
+; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_NEXT_NEXT:%.*]], label [[BB_EXIT:%.*]]
+; CHECK: bb.next.next:
+; CHECK-NEXT: br label [[BB_EXIT]]
+; CHECK: bb.exit:
+; CHECK-NEXT: [[RET:%.*]] = phi i64 [ [[R]], [[ENTRY:%.*]] ], [ 10, [[BB_NEXT_NEXT]] ]
+; CHECK-NEXT: ret i64 [[RET]]
+;
+entry:
+ call void @foo(i64 %b)
+ br label %bb.next
+
+bb.next:
+ %r = add i64 %a, %b
+ call void @foo(i64 %r)
+ call void @foo(i64 %a)
+ br i1 %c, label %bb.next.next, label %bb.exit
+
+bb.next.next:
+ br label %bb.exit
+
+bb.exit:
+ %ret = phi i64 [ %r, %bb.next], [ 10, %bb.next.next]
+ ret i64 %ret
+
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll
new file mode 100644
index 00000000000..11b70fa5267
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll
@@ -0,0 +1,109 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+
+define i32 @remove_dead_blocks() {
+; CHECK-LABEL: @remove_dead_blocks(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+;
+entry:
+ ret i32 1
+
+bb.1:
+ ret i32 2
+
+bb.2:
+ ret i32 3
+}
+
+define i32 @simp1() {
+; CHECK-LABEL: @simp1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+; CHECK: bb.1:
+; CHECK-NEXT: ret i32 2
+; CHECK-NEXT: }
+;
+entry:
+ ret i32 1
+
+bb.1:
+ ret i32 2
+
+bb.2:
+ br i1 undef, label %bb.1, label %bb.3
+
+bb.3:
+ ret i32 3
+}
+
+define i32 @remove_dead_block_with_phi() {
+; CHECK-LABEL: @remove_dead_block_with_phi(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[BB_2:%.*]]
+; CHECK: bb.2:
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+;
+entry:
+ br label %bb.2
+
+bb.1:
+ br label %bb.2
+
+bb.2:
+ %rv = phi i32 [ 1, %entry ], [ 2, %bb.1 ]
+ ret i32 %rv
+}
+
+define i32 @remove_dead_blocks_remaining_uses(i32 %a) {
+; CHECK-LABEL: @remove_dead_blocks_remaining_uses(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+;
+entry:
+ ret i32 1
+
+bb.2:
+ ret i32 %res
+
+bb.1:
+ %res = add i32 %a, 10
+ br label %bb.2
+}
+
+define i32 @remove_dead_blocks_remaining_uses2(i32 %a, i1 %cond) {
+; CHECK-LABEL: @remove_dead_blocks_remaining_uses2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+; CHECK: bb.2:
+; CHECK-NEXT: [[RES2:%.*]] = add i32 undef, 10
+; CHECK-NEXT: [[RES3:%.*]] = mul i32 [[RES2]], undef
+; CHECK-NEXT: ret i32 [[RES3]]
+; CHECK: bb.3:
+; CHECK-NEXT: ret i32 undef
+; CHECK-NEXT: }
+;
+entry:
+ ret i32 1
+
+bb.2:
+ %res2 = add i32 %res, 10
+ %res3 = mul i32 %res2, %res
+ ret i32 %res3
+
+bb.3:
+ br label %bb.4
+
+bb.4:
+ ret i32 %res
+
+bb.1:
+ %res = add i32 %a, 10
+ br i1 %cond, label %bb.2, label %bb.3
+ br label %bb.2
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll
new file mode 100644
index 00000000000..76db503faeb
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll
@@ -0,0 +1,70 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+
+define i32 @phi_cond_branch_eliminated() {
+; CHECK-LABEL: @phi_cond_branch_eliminated(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 20
+;
+entry:
+ br i1 true, label %bb.2, label %bb.3
+
+bb.2:
+ br label %bb.3
+
+bb.3:
+ %ret = phi i32 [ 10, %entry ], [ 20, %bb.2 ]
+ ret i32 %ret
+}
+
+define i32 @phi_removed() {
+; CHECK-LABEL: @phi_removed(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[BB_3:%.*]]
+; CHECK: bb.3:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ br i1 false, label %bb.2, label %bb.3
+
+bb.2:
+ %pv = phi i32 [ 10, %entry ]
+ br label %bb.3
+
+bb.3:
+ ret i32 0
+}
+
+define i32 @phi_in_dead_region() {
+; CHECK-LABEL: @phi_in_dead_region(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+;
+entry:
+ ret i32 1
+
+bb.1:
+ br i1 true, label %bb.2, label %bb.3
+
+bb.2:
+ br label %bb.3
+
+bb.3:
+ %ret = phi i32 [ 10, %bb.1 ], [ 20, %bb.2 ]
+ ret i32 %ret
+}
+
+define i32 @phi_in_mergable_blocks() {
+; CHECK-LABEL: @phi_in_mergable_blocks(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 10
+;
+entry:
+ br label %bb.1
+
+bb.1:
+ %pv = phi i32 [ 10, %entry ]
+ ret i32 %pv
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll
new file mode 100644
index 00000000000..82a0e0dac23
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
+
+; Check that we do not crash when we remove edges multiple times in
+; the DomTreeUpdater.
+define void @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i8 undef, label [[IF_THEN_EPIL:%.*]] [
+; CHECK-NEXT: i8 32, label [[FOR_INC_EPIL:%.*]]
+; CHECK-NEXT: i8 46, label [[FOR_INC_EPIL]]
+; CHECK-NEXT: i8 95, label [[FOR_INC_EPIL]]
+; CHECK-NEXT: i8 45, label [[FOR_INC_EPIL]]
+; CHECK-NEXT: i8 126, label [[FOR_INC_EPIL]]
+; CHECK-NEXT: ]
+; CHECK: if.then.epil:
+; CHECK-NEXT: unreachable
+; CHECK: for.inc.epil:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %for.body.epil
+
+for.body.epil: ; preds = %entry
+ switch i8 undef, label %if.then.epil [
+ i8 32, label %for.inc.epil
+ i8 46, label %for.inc.epil
+ i8 95, label %for.inc.epil
+ i8 45, label %for.inc.epil
+ i8 126, label %for.inc.epil
+ ]
+
+if.then.epil: ; preds = %for.body.epil
+ unreachable
+
+for.inc.epil: ; preds = %for.body.epil, %for.body.epil, %for.body.epil, %for.body.epil, %for.body.epil
+ ret void
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll
new file mode 100644
index 00000000000..b3edd1aa505
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll
@@ -0,0 +1,122 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 undef, label [[SW_DEFAULT23:%.*]] [
+; CHECK-NEXT: i32 129, label [[SW_BB:%.*]]
+; CHECK-NEXT: i32 215, label [[SW_BB1:%.*]]
+; CHECK-NEXT: i32 117, label [[SW_BB1]]
+; CHECK-NEXT: i32 207, label [[SW_BB1]]
+; CHECK-NEXT: i32 158, label [[SW_BB1]]
+; CHECK-NEXT: i32 94, label [[SW_BB1]]
+; CHECK-NEXT: i32 219, label [[SW_BB1]]
+; CHECK-NEXT: i32 88, label [[SW_BB1]]
+; CHECK-NEXT: i32 168, label [[SW_BB1]]
+; CHECK-NEXT: i32 295, label [[SW_BB1]]
+; CHECK-NEXT: i32 294, label [[SW_BB1]]
+; CHECK-NEXT: i32 296, label [[SW_BB1]]
+; CHECK-NEXT: i32 67, label [[SW_BB1]]
+; CHECK-NEXT: i32 293, label [[SW_BB1]]
+; CHECK-NEXT: i32 382, label [[SW_BB1]]
+; CHECK-NEXT: i32 335, label [[SW_BB1]]
+; CHECK-NEXT: i32 393, label [[SW_BB1]]
+; CHECK-NEXT: i32 415, label [[SW_BB1]]
+; CHECK-NEXT: i32 400, label [[SW_BB1]]
+; CHECK-NEXT: i32 383, label [[SW_BB1]]
+; CHECK-NEXT: i32 421, label [[SW_BB1]]
+; CHECK-NEXT: i32 422, label [[SW_BB1]]
+; CHECK-NEXT: i32 302, label [[SW_BB1]]
+; CHECK-NEXT: i32 303, label [[SW_BB1]]
+; CHECK-NEXT: i32 304, label [[SW_BB1]]
+; CHECK-NEXT: i32 420, label [[SW_BB1]]
+; CHECK-NEXT: i32 401, label [[SW_EPILOG24:%.*]]
+; CHECK-NEXT: i32 53, label [[SW_BB12:%.*]]
+; CHECK-NEXT: i32 44, label [[SW_BB12]]
+; CHECK-NEXT: ]
+; CHECK: sw.bb:
+; CHECK-NEXT: unreachable
+; CHECK: sw.bb1:
+; CHECK-NEXT: br label [[SW_EPILOG24]]
+; CHECK: sw.bb12:
+; CHECK-NEXT: switch i32 undef, label [[SW_DEFAULT:%.*]] [
+; CHECK-NEXT: i32 47, label [[SW_BB13:%.*]]
+; CHECK-NEXT: i32 8, label [[SW_BB13]]
+; CHECK-NEXT: ]
+; CHECK: sw.bb13:
+; CHECK-NEXT: unreachable
+; CHECK: sw.default:
+; CHECK-NEXT: unreachable
+; CHECK: sw.default23:
+; CHECK-NEXT: unreachable
+; CHECK: sw.epilog24:
+; CHECK-NEXT: [[PREVIOUS_3:%.*]] = phi i32 [ undef, [[SW_BB1]] ], [ 401, [[ENTRY:%.*]] ]
+; CHECK-NEXT: unreachable
+;
+entry:
+ br label %while.body
+
+while.body: ; preds = %entry
+ switch i32 undef, label %sw.default23 [
+ i32 129, label %sw.bb
+ i32 215, label %sw.bb1
+ i32 117, label %sw.bb1
+ i32 207, label %sw.bb1
+ i32 158, label %sw.bb1
+ i32 94, label %sw.bb1
+ i32 219, label %sw.bb1
+ i32 88, label %sw.bb1
+ i32 168, label %sw.bb1
+ i32 295, label %sw.bb1
+ i32 294, label %sw.bb1
+ i32 296, label %sw.bb1
+ i32 67, label %sw.bb1
+ i32 293, label %sw.bb1
+ i32 382, label %sw.bb1
+ i32 335, label %sw.bb1
+ i32 393, label %sw.bb1
+ i32 415, label %sw.bb1
+ i32 400, label %sw.bb1
+ i32 383, label %sw.bb1
+ i32 421, label %sw.bb1
+ i32 422, label %sw.bb1
+ i32 302, label %sw.bb1
+ i32 303, label %sw.bb1
+ i32 304, label %sw.bb1
+ i32 420, label %sw.bb1
+ i32 401, label %sw.epilog24
+ i32 53, label %sw.bb12
+ i32 44, label %sw.bb12
+ ]
+
+sw.bb: ; preds = %while.body
+ unreachable
+
+sw.bb1: ; preds = %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body, %while.body
+ br i1 false, label %land.lhs.true, label %sw.epilog24
+
+land.lhs.true: ; preds = %sw.bb1
+ br label %sw.epilog24
+
+sw.bb12: ; preds = %while.body, %while.body
+ switch i32 undef, label %sw.default [
+ i32 47, label %sw.bb13
+ i32 8, label %sw.bb13
+ ]
+
+sw.bb13: ; preds = %sw.bb12, %sw.bb12
+ unreachable
+
+sw.default: ; preds = %sw.bb12
+ unreachable
+
+sw.default23: ; preds = %while.body
+ unreachable
+
+sw.epilog24: ; preds = %land.lhs.true, %sw.bb1, %while.body
+ %Previous.3 = phi i32 [ undef, %land.lhs.true ], [ undef, %sw.bb1 ], [ 401, %while.body ]
+ unreachable
+}
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll
new file mode 100644
index 00000000000..f9705a6948b
--- /dev/null
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll
@@ -0,0 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
+; RUN: opt -tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+
+define i32 @simp1() {
+; CHECK-LABEL: @simp1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 1
+; CHECK: bb.1:
+; CHECK-NEXT: br label [[BB_1:%.*]]
+; CHECK: bb.2:
+; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[BB_2:%.*]] ]
+; CHECK-NEXT: br label [[BB_2]]
+;
+entry:
+ ret i32 1
+
+bb.1:
+ br label %bb.1
+
+bb.2:
+ %p = phi i32 [ 0, %bb.2]
+ br label %bb.2
+}
OpenPOWER on IntegriCloud