summaryrefslogtreecommitdiff
path: root/test/Transforms/LoopSimplify
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms/LoopSimplify')
-rw-r--r--test/Transforms/LoopSimplify/indirectbr.ll83
1 files changed, 83 insertions, 0 deletions
diff --git a/test/Transforms/LoopSimplify/indirectbr.ll b/test/Transforms/LoopSimplify/indirectbr.ll
new file mode 100644
index 0000000000..b0238473b6
--- /dev/null
+++ b/test/Transforms/LoopSimplify/indirectbr.ll
@@ -0,0 +1,83 @@
+; RUN: opt < %s -loopsimplify -lcssa -verify-loop-info -verify-dom-info -S \
+; RUN: | grep -F {indirectbr i8* %x, \[label %L0, label %L1\]} \
+; RUN: | count 6
+
+; LoopSimplify should not try to transform loops when indirectbr is involved.
+
+define void @entry(i8* %x) {
+entry:
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+
+L0:
+ br label %L0
+
+L1:
+ ret void
+}
+
+define void @backedge(i8* %x) {
+entry:
+ br label %L0
+
+L0:
+ br label %L1
+
+L1:
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+}
+
+define i64 @exit(i8* %x) {
+entry:
+ br label %L2
+
+L2:
+ %z = bitcast i64 0 to i64
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+
+L0:
+ br label %L2
+
+L1:
+ ret i64 %z
+}
+
+define i64 @criticalexit(i8* %x, i1 %a) {
+entry:
+ br i1 %a, label %L1, label %L2
+
+L2:
+ %z = bitcast i64 0 to i64
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+
+L0:
+ br label %L2
+
+L1:
+ %y = phi i64 [ %z, %L2 ], [ 1, %entry ]
+ ret i64 %y
+}
+
+define i64 @exit_backedge(i8* %x) {
+entry:
+ br label %L0
+
+L0:
+ %z = bitcast i64 0 to i64
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+
+L1:
+ ret i64 %z
+}
+
+define i64 @criticalexit_backedge(i8* %x, i1 %a) {
+entry:
+ br i1 %a, label %L0, label %L1
+
+L0:
+ %z = bitcast i64 0 to i64
+ indirectbr i8* %x, [ label %L0, label %L1 ]
+
+L1:
+ %y = phi i64 [ %z, %L0 ], [ 1, %entry ]
+ ret i64 %y
+}