summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/JumpThreading
diff options
context:
space:
mode:
authorWei Mi <wmi@google.com>2019-07-26 20:59:22 +0000
committerWei Mi <wmi@google.com>2019-07-26 20:59:22 +0000
commit55a68a24003a08f37e0d4704c8d89cd2c3f9f095 (patch)
treeff5f8b227d9ea3b76e2d749f3d4e73bb076f374b /llvm/test/Transforms/JumpThreading
parentfe4b12b4deacb9b8fe9ee9887e6a897a7e955ff9 (diff)
downloadbcm5719-llvm-55a68a24003a08f37e0d4704c8d89cd2c3f9f095.tar.gz
bcm5719-llvm-55a68a24003a08f37e0d4704c8d89cd2c3f9f095.zip
[JumpThreading] Stop searching predecessor when the current bb is in a
unreachable loop. updatePredecessorProfileMetadata in jumpthreading tries to find the first dominating predecessor block for a PHI value by searching upwards the predecessor block chain. But jumpthreading may see some temporary IR state which contains unreachable bb not being cleaned up. If an unreachable loop happens to be on the predecessor block chain, keeping chasing the predecessor block will run into an infinite loop. The patch fixes it. Differential Revision: https://reviews.llvm.org/D65310 llvm-svn: 367154
Diffstat (limited to 'llvm/test/Transforms/JumpThreading')
-rw-r--r--llvm/test/Transforms/JumpThreading/unreachable-loops.ll63
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/test/Transforms/JumpThreading/unreachable-loops.ll b/llvm/test/Transforms/JumpThreading/unreachable-loops.ll
new file mode 100644
index 00000000000..3f75aeae906
--- /dev/null
+++ b/llvm/test/Transforms/JumpThreading/unreachable-loops.ll
@@ -0,0 +1,63 @@
+; RUN: opt -jump-threading -S < %s | FileCheck %s
+; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
+; Check the unreachable loop won't cause infinite loop
+; in jump-threading when it tries to update the predecessors'
+; profile metadata from a phi node.
+
+define void @unreachable_single_bb_loop() {
+; CHECK-LABEL: @unreachable_single_bb_loop()
+bb:
+ %tmp = call i32 @a()
+ %tmp1 = icmp eq i32 %tmp, 1
+ br i1 %tmp1, label %bb5, label %bb8
+
+; unreachable single bb loop.
+bb2: ; preds = %bb2
+ %tmp4 = icmp ne i32 %tmp, 1
+ switch i1 %tmp4, label %bb2 [
+ i1 0, label %bb5
+ i1 1, label %bb8
+ ]
+
+bb5: ; preds = %bb2, %bb
+ %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
+ br i1 %tmp6, label %bb8, label %bb7, !prof !0
+
+bb7: ; preds = %bb5
+ br label %bb8
+
+bb8: ; preds = %bb8, %bb7, %bb5, %bb2
+ ret void
+}
+
+define void @unreachable_multi_bbs_loop() {
+; CHECK-LABEL: @unreachable_multi_bbs_loop()
+bb:
+ %tmp = call i32 @a()
+ %tmp1 = icmp eq i32 %tmp, 1
+ br i1 %tmp1, label %bb5, label %bb8
+
+; unreachable two bbs loop.
+bb3: ; preds = %bb2
+ br label %bb2
+
+bb2: ; preds = %bb3
+ %tmp4 = icmp ne i32 %tmp, 1
+ switch i1 %tmp4, label %bb3 [
+ i1 0, label %bb5
+ i1 1, label %bb8
+ ]
+
+bb5: ; preds = %bb2, %bb
+ %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
+ br i1 %tmp6, label %bb8, label %bb7, !prof !0
+
+bb7: ; preds = %bb5
+ br label %bb8
+
+bb8: ; preds = %bb8, %bb7, %bb5, %bb2
+ ret void
+}
+declare i32 @a()
+
+!0 = !{!"branch_weights", i32 2146410443, i32 1073205}
OpenPOWER on IntegriCloud