Add Use replacement. Assuming there is nothing horribly wrong with this, LCSSA

is now theoretically feature-complete.  It has not, however, been thoroughly
test, and is still considered experimental.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28529 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2006-05-29 01:00:00 +00:00
parent fb0c0dc960
commit 00ea74c27e

View File

@ -111,6 +111,7 @@ bool LCSSA::visitSubloop(Loop* L) {
// Iterate over all affected values for this loop and insert Phi nodes
// for them in the appropriate exit blocks
std::map<BasicBlock*, PHINode*> ExitPhis;
for (std::set<Instruction*>::iterator I = AffectedValues.begin(),
E = AffectedValues.end(); I != E; ++I) {
++NumLCSSA; // We are applying the transformation
@ -119,6 +120,7 @@ bool LCSSA::visitSubloop(Loop* L) {
PHINode *phi = new PHINode((*I)->getType(), "lcssa");
(*BBI)->getInstList().insert((*BBI)->front(), phi);
workList.push_back(phi);
ExitPhis[*BBI] = phi;
// Since LoopSimplify has been run, we know that all of these predecessors
// are in the loop, so just hook them up in the obvious manner.
@ -167,8 +169,39 @@ bool LCSSA::visitSubloop(Loop* L) {
}
}
// FIXME: Should update all uses.
// Find all uses of the affected value, and replace them with the
// appropriate Phi.
for (Instruction::use_iterator UI = (*I)->use_begin(), UE=(*I)->use_end();
UI != UE; ++UI) {
Instruction* use = cast<Instruction>(*UI);
// Don't need to update uses within the loop body
if (!std::binary_search(LoopBlocks.begin(), LoopBlocks.end(),
use->getParent())) {
for (std::map<BasicBlock*, PHINode*>::iterator DI = ExitPhis.begin(),
DE = ExitPhis.end(); DI != DE; ++DI) {
if (DT->getNode((*DI).first)->dominates( \
DT->getNode(use->getParent())) && use != (*DI).second) {
use->replaceUsesOfWith(*I, (*DI).second);
break;
}
}
for (std::map<BasicBlock*, PHINode*>::iterator DI = DFPhis.begin(),
DE = DFPhis.end(); DI != DE; ++DI) {
if (DT->getNode((*DI).first)->dominates( \
DT->getNode(use->getParent()))) {
use->replaceUsesOfWith(*I, (*DI).second);
break;
}
}
}
}
}
return true; // FIXME: Should be more intelligent in our return value.
}