From df45bd3803ae0965a83cd1f30ee051b9f43e73dd Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 10 Dec 2003 20:43:29 +0000 Subject: [PATCH] Don't allow dead instructions to stop sinking early. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10386 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LICM.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index ab64ece96b2..55b4942bb9a 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -366,7 +366,12 @@ void LICM::sink(Instruction &I) { DEBUG(std::cerr << "LICM sinking instruction: " << I); const std::vector &ExitBlocks = CurLoop->getExitBlocks(); - + std::vector Operands(I.op_begin(), I.op_end()); + + if (isa(I)) ++NumMovedLoads; + ++NumSunk; + Changed = true; + // The case where there is only a single exit node of this loop is common // enough that we handle it as a special (more efficient) case. It is more // efficient to handle because there are no PHI nodes that need to be placed. @@ -386,7 +391,6 @@ void LICM::sink(Instruction &I) { } else if (ExitBlocks.size() == 0) { // The instruction is actually dead if there ARE NO exit blocks. I.getParent()->getInstList().erase(&I); - return; // Don't count this as a sunk instruction, don't check operands. } else { // Otherwise, if we have multiple exits, use the PromoteMem2Reg function to // do all of the hard work of inserting PHI nodes as necessary. We convert @@ -469,17 +473,12 @@ void LICM::sink(Instruction &I) { PromoteMemToReg(Allocas, *DT, *DF, AA->getTargetData()); } - if (isa(I)) ++NumMovedLoads; - ++NumSunk; - Changed = true; - // Since we just sunk an instruction, check to see if any other instructions // used by this instruction are now sinkable. If so, sink them too. - for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) - if (Instruction *OpI = dyn_cast(I.getOperand(i))) + for (unsigned i = 0, e = Operands.size(); i != e; ++i) + if (Instruction *OpI = dyn_cast(Operands[i])) if (CurLoop->contains(OpI->getParent()) && canSinkOrHoistInst(*OpI) && - isNotUsedInLoop(*OpI) && - isSafeToExecuteUnconditionally(*OpI)) + isNotUsedInLoop(*OpI) && isSafeToExecuteUnconditionally(*OpI)) sink(*OpI); }