aboutsummaryrefslogtreecommitdiffstats
path: root/test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll
diff options
context:
space:
mode:
authorStepan Dyatkovskiy <stpworld@narod.ru>2012-04-02 17:16:45 +0000
committerStepan Dyatkovskiy <stpworld@narod.ru>2012-04-02 17:16:45 +0000
commitaad9c3f17a73b3104f4a3673a2dc511a4878e20e (patch)
tree6c13b569bf511dd07b3943a063ea0488b11e49d8 /test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll
parent466958c2a04a74de99efd3d7e0d5bd81cdf1e1fe (diff)
downloadexternal_llvm-aad9c3f17a73b3104f4a3673a2dc511a4878e20e.zip
external_llvm-aad9c3f17a73b3104f4a3673a2dc511a4878e20e.tar.gz
external_llvm-aad9c3f17a73b3104f4a3673a2dc511a4878e20e.tar.bz2
Fast fix for PR12343:
http://llvm.org/bugs/show_bug.cgi?id=12343 We have not trivial way for splitting edges that are goes from indirect branch. We can do it with some tricks, but it should be additionally discussed. And it is still dangerous due to difficulty of indirect branches controlling. Fix forbids this case for unswitching. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153879 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll')
-rw-r--r--test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll b/test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll
new file mode 100644
index 0000000..c677bde
--- /dev/null
+++ b/test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll
@@ -0,0 +1,46 @@
+; RUN: opt -loop-unswitch -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s
+; RUN: opt -S -loop-unswitch -verify-loop-info -verify-dom-info %s | FileCheck %s
+
+; STATS: 1 loop-unswitch - Total number of instructions analyzed
+
+; CHECK: %0 = icmp eq i64 undef, 0
+; CHECK-NEXT: br i1 %0, label %"5", label %"4"
+
+; CHECK: "5": ; preds = %entry
+; CHECK-NEXT: br label %"5.split"
+
+; CHECK: "5.split": ; preds = %"5"
+; CHECK-NEXT: br label %"16"
+
+; CHECK: "16": ; preds = %"22", %"5.split"
+; CHECK-NEXT: indirectbr i8* undef, [label %"22", label %"33"]
+
+; CHECK: "22": ; preds = %"16"
+; CHECK-NEXT: br i1 %0, label %"16", label %"26"
+
+; CHECK: "26": ; preds = %"22"
+; CHECK-NEXT: unreachable
+
+define void @foo() {
+entry:
+ %0 = icmp eq i64 undef, 0
+ br i1 %0, label %"5", label %"4"
+
+"4": ; preds = %entry
+ unreachable
+
+"5": ; preds = %entry
+ br label %"16"
+
+"16": ; preds = %"22", %"5"
+ indirectbr i8* undef, [label %"22", label %"33"]
+
+"22": ; preds = %"16"
+ br i1 %0, label %"16", label %"26"
+
+"26": ; preds = %"22"
+ unreachable
+
+"33": ; preds = %"16"
+ unreachable
+}