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
This commit is contained in:
David Majnemer 2014-09-02 16:22:00 +00:00
parent 4648487925
commit 9e1f653e2f
2 changed files with 28 additions and 1 deletions

View File

@ -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<PHINode>(I.user_back());
PHINode *PN = cast<PHINode>(User);
BasicBlock *ExitBlock = PN->getParent();
assert(ExitBlockSet.count(ExitBlock) &&

View File

@ -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
}