diff options
author | Chris Lattner <sabre@nondot.org> | 2003-12-19 08:18:16 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-12-19 08:18:16 +0000 |
commit | a3df8a964aa9d0d171fd4f6e491c7d1cf9dee500 (patch) | |
tree | 93355a413219d04053854b10c1b6e7621107b96d /lib/Transforms/Scalar | |
parent | 86f3dda18b7b36071c3f8753f868fb0c3ab22ed9 (diff) | |
download | external_llvm-a3df8a964aa9d0d171fd4f6e491c7d1cf9dee500.zip external_llvm-a3df8a964aa9d0d171fd4f6e491c7d1cf9dee500.tar.gz external_llvm-a3df8a964aa9d0d171fd4f6e491c7d1cf9dee500.tar.bz2 |
Remove the wierd "Operands" loop, by traversing basicblocks in reverse order
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10536 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/LICM.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 8d42be1..c26fb6b 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -304,16 +304,18 @@ void LICM::SinkRegion(DominatorTree::Node *N) { // subloop (which would already have been processed). if (inSubLoop(BB)) return; - for (BasicBlock::iterator II = BB->begin(), E = BB->end(); II != E; ) { - Instruction &I = *II++; + for (BasicBlock::iterator II = BB->end(); II != BB->begin(); ) { + Instruction &I = *--II; // Check to see if we can sink this instruction to the exit blocks // of the loop. We can do this if the all users of the instruction are // outside of the loop. In this case, it doesn't even matter if the // operands of the instruction are loop invariant. // - if (canSinkOrHoistInst(I) && isNotUsedInLoop(I)) + if (canSinkOrHoistInst(I) && isNotUsedInLoop(I)) { + ++II; sink(I); + } } } @@ -403,14 +405,14 @@ bool LICM::isLoopInvariantInst(Instruction &I) { } /// sink - When an instruction is found to only be used outside of the loop, -/// this function moves it to the exit blocks and patches up SSA form as -/// needed. +/// this function moves it to the exit blocks and patches up SSA form as needed. +/// This method is guaranteed to remove the original instruction from its +/// position, and may either delete it or move it to outside of the loop. /// void LICM::sink(Instruction &I) { DEBUG(std::cerr << "LICM sinking instruction: " << I); const std::vector<BasicBlock*> &ExitBlocks = CurLoop->getExitBlocks(); - std::vector<Value*> Operands(I.op_begin(), I.op_end()); if (isa<LoadInst>(I)) ++NumMovedLoads; ++NumSunk; @@ -512,20 +514,18 @@ void LICM::sink(Instruction &I) { } } } + + // If the instruction doesn't dominate any exit blocks, it must be dead. + if (InsertedBlocks.empty()) { + CurAST->remove(&I); + I.getParent()->getInstList().erase(&I); + } // Finally, promote the fine value to SSA form. std::vector<AllocaInst*> Allocas; Allocas.push_back(AI); PromoteMemToReg(Allocas, *DT, *DF, AA->getTargetData()); } - - // 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 = Operands.size(); i != e; ++i) - if (Instruction *OpI = dyn_cast<Instruction>(Operands[i])) - if (CurLoop->contains(OpI->getParent()) && canSinkOrHoistInst(*OpI) && - isNotUsedInLoop(*OpI) && isSafeToExecuteUnconditionally(*OpI)) - sink(*OpI); } /// hoist - When an instruction is found to only use loop invariant operands |