From 9e1f653e2faeae682c3107e146b73d05bf61081d Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 2 Sep 2014 16:22:00 +0000 Subject: [PATCH] LICM: Don't crash when an instruction is used by an unreachable BB Summary: BBs might contain non-LCSSA'd values after the LCSSA pass is run if they are unreachable from the entry block. Normally, the users of the instruction would be PHIs but the unreachable BBs have normal users; rewrite their uses to be undef values. An alternative fix could involve fixing this at LCSSA but that would require this invariant to hold after subsequent transforms. If a BB created an unreachable block, they would be in violation of this. This fixes PR19798. Differential Revision: http://reviews.llvm.org/D5146 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216911 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LICM.cpp | 7 ++++++- test/Transforms/LICM/PR19798.ll | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/LICM/PR19798.ll 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 +}