aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Scalar
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-12-19 08:18:16 +0000
committerChris Lattner <sabre@nondot.org>2003-12-19 08:18:16 +0000
commita3df8a964aa9d0d171fd4f6e491c7d1cf9dee500 (patch)
tree93355a413219d04053854b10c1b6e7621107b96d /lib/Transforms/Scalar
parent86f3dda18b7b36071c3f8753f868fb0c3ab22ed9 (diff)
downloadexternal_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.cpp28
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