diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/Sink.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/Sink.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/Sink.cpp b/llvm/lib/Transforms/Scalar/Sink.cpp index 8b99f73b850b..46bcfd6b41ce 100644 --- a/llvm/lib/Transforms/Scalar/Sink.cpp +++ b/llvm/lib/Transforms/Scalar/Sink.cpp @@ -67,9 +67,8 @@ static bool IsAcceptableTarget(Instruction *Inst, BasicBlock *SuccToSinkTo, assert(Inst && "Instruction to be sunk is null"); assert(SuccToSinkTo && "Candidate sink target is null"); - // It's never legal to sink an instruction into a block which terminates in an - // EH-pad. - if (SuccToSinkTo->getTerminator()->isExceptionalTerminator()) + // It's never legal to sink an instruction into an EH-pad block. + if (SuccToSinkTo->isEHPad()) return false; // If the block has multiple predecessors, this would introduce computation @@ -131,15 +130,16 @@ static bool SinkInstruction(Instruction *Inst, for (Use &U : Inst->uses()) { Instruction *UseInst = cast<Instruction>(U.getUser()); BasicBlock *UseBlock = UseInst->getParent(); - // Don't worry about dead users. - if (!DT.isReachableFromEntry(UseBlock)) - continue; if (PHINode *PN = dyn_cast<PHINode>(UseInst)) { // PHI nodes use the operand in the predecessor block, not the block with // the PHI. unsigned Num = PHINode::getIncomingValueNumForOperand(U.getOperandNo()); UseBlock = PN->getIncomingBlock(Num); } + // Don't worry about dead users. + if (!DT.isReachableFromEntry(UseBlock)) + continue; + if (SuccToSinkTo) SuccToSinkTo = DT.findNearestCommonDominator(SuccToSinkTo, UseBlock); else |
