From 0ed57bd81cc9d5c56b4b54474ba39b7d69a69ae1 Mon Sep 17 00:00:00 2001 From: Michael Zolotukhin Date: Tue, 10 Apr 2018 02:16:29 +0000 Subject: [PATCH] [SSAUpdaterBulk] Handle CFG with unreachable from entry blocks. llvm-svn: 329660 --- lib/Transforms/Utils/SSAUpdaterBulk.cpp | 2 +- .../bb-unreachable-from-entry.ll | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/JumpThreading/bb-unreachable-from-entry.ll diff --git a/lib/Transforms/Utils/SSAUpdaterBulk.cpp b/lib/Transforms/Utils/SSAUpdaterBulk.cpp index 8f106c57b43..9f358e1d60a 100644 --- a/lib/Transforms/Utils/SSAUpdaterBulk.cpp +++ b/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/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll b/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll new file mode 100644 index 00000000000..5900350f540 --- /dev/null +++ b/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 +}