diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index e41a02d5f12..d387b56689a 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -597,8 +597,13 @@ void LICM::sink(Instruction &I) { // PHI nodes in exit blocks due to LCSSA form. Just RAUW them with clones of // the instruction. while (!I.use_empty()) { + Instruction *User = I.user_back(); + if (!DT->isReachableFromEntry(User->getParent())) { + User->replaceUsesOfWith(&I, UndefValue::get(I.getType())); + continue; + } // The user must be a PHI node. - PHINode *PN = cast(I.user_back()); + PHINode *PN = cast(User); BasicBlock *ExitBlock = PN->getParent(); assert(ExitBlockSet.count(ExitBlock) && diff --git a/test/Transforms/LICM/PR19798.ll b/test/Transforms/LICM/PR19798.ll new file mode 100644 index 00000000000..82befb09666 --- /dev/null +++ b/test/Transforms/LICM/PR19798.ll @@ -0,0 +1,22 @@ +; RUN: opt -licm -S < %s | FileCheck %s + +define void @f() { +; CHECK-LABEL: @f( +entry: + br label %bb0 + +bb0: + %tobool7 = icmp eq i1 undef, undef + br label %bb1 + +bb1: + br i1 undef, label %bb0, label %bb0 + +unreachable: +; CHECK-LABEL: unreachable: +; CHECK: br i1 undef, label %unreachable, label %unreachable + br i1 %tobool7, label %unreachable, label %unreachable + +bb3: + unreachable +}