diff options
-rw-r--r-- | llvm/lib/Transforms/Utils/SSAUpdaterBulk.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/SSAUpdaterBulk.cpp b/llvm/lib/Transforms/Utils/SSAUpdaterBulk.cpp index 8f106c57b43..9f358e1d60a 100644 --- a/llvm/lib/Transforms/Utils/SSAUpdaterBulk.cpp +++ b/llvm/lib/Transforms/Utils/SSAUpdaterBulk.cpp @@ -57,7 +57,7 @@ bool SSAUpdaterBulk::HasValueForBlock(unsigned Var, BasicBlock *BB) { Value *SSAUpdaterBulk::computeValueAt(BasicBlock *BB, RewriteInfo &R, DominatorTree *DT) { if (!R.Defines.count(BB)) { - if (PredCache.get(BB).size()) { + if (DT->isReachableFromEntry(BB) && PredCache.get(BB).size()) { BasicBlock *IDom = DT->getNode(BB)->getIDom()->getBlock(); R.Defines[BB] = computeValueAt(IDom, R, DT); } else diff --git a/llvm/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll b/llvm/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll new file mode 100644 index 00000000000..5900350f540 --- /dev/null +++ b/llvm/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll @@ -0,0 +1,26 @@ +; RUN: opt -S < %s -jump-threading | FileCheck %s +; CHECK-LABEL: @foo +; CHECK-NEXT: exit2: +; CHECK-NEXT: ret void +define void @foo() { +entry: + br label %bb1 + +entry2: + br label %bb1 + +bb1: + %a0 = phi i32 [ undef, %entry2 ], [ 0, %entry ] + %b = icmp ne i32 %a0, 0 + br i1 %b, label %bb2, label %exit2 + +bb2: + br label %exit1 + +exit1: + %a1 = phi i32 [ %a0, %bb2 ] + ret void + +exit2: + ret void +} |