summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopSimplify
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-11-05 21:14:46 +0000
committerDan Gohman <gohman@apple.com>2009-11-05 21:14:46 +0000
commit1ef784db677802b24bfcf9a0c00fa69e69853468 (patch)
tree5cf175bb92c54982c692cd87aa51b21674d807cb /llvm/test/Transforms/LoopSimplify
parenta83ac2d9e7b990df6978598d9dec860b5ef13a9a (diff)
downloadbcm5719-llvm-1ef784db677802b24bfcf9a0c00fa69e69853468.tar.gz
bcm5719-llvm-1ef784db677802b24bfcf9a0c00fa69e69853468.zip
The introduction of indirectbr meant the introduction of
unsplittable critical edges, which means the introduction of loops which cannot be transformed to LoopSimplify form. Fix LoopSimplify to avoid transforming such loops into invalid code. llvm-svn: 86176
Diffstat (limited to 'llvm/test/Transforms/LoopSimplify')
-rw-r--r--llvm/test/Transforms/LoopSimplify/indirectbr.ll83
1 files changed, 83 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopSimplify/indirectbr.ll b/llvm/test/Transforms/LoopSimplify/indirectbr.ll
new file mode 100644
index 00000000000..b0238473b68
--- /dev/null
+++ b/llvm/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
+}
OpenPOWER on IntegriCloud