More cleanups and simplifications, no functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62983 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-01-26 01:57:01 +00:00
parent 2ba2543df2
commit f6784a3262

View File

@ -128,7 +128,6 @@ bool LoopRotate::runOnLoop(Loop *Lp, LPPassManager &LPM) {
/// Rotate loop LP. Return true if the loop is rotated.
bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
L = Lp;
OrigHeader = L->getHeader();
@ -170,8 +169,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// Now, this loop is suitable for rotation.
// Find new Loop header. NewHeader is a Header's one and only successor
// that is inside loop. Header's other successor is out side the
// loop. Otherwise loop is not suitable for rotation.
// that is inside loop. Header's other successor is outside the
// loop. Otherwise loop is not suitable for rotation.
Exit = BI->getSuccessor(0);
NewHeader = BI->getSuccessor(1);
if (L->contains(Exit))
@ -197,31 +196,29 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// receive a clone of original header terminator as a new terminator.
OrigPreHeader->getInstList().pop_back();
BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end();
PHINode *PN = NULL;
PHINode *PN = 0;
for (; (PN = dyn_cast<PHINode>(I)); ++I) {
Instruction *In = I;
// PHI nodes are not copied into original pre-header. Instead their values
// are directly propagated.
Value * NPV = PN->getIncomingValueForBlock(OrigPreHeader);
Value *NPV = PN->getIncomingValueForBlock(OrigPreHeader);
// Create new PHI node with two incoming values for NewHeader.
// One incoming value is from OrigLatch (through OrigHeader) and
// second incoming value is from original pre-header.
PHINode *NH = PHINode::Create(In->getType(), In->getName(),
PHINode *NH = PHINode::Create(PN->getType(), PN->getName(),
NewHeader->begin());
NH->addIncoming(PN->getIncomingValueForBlock(OrigLatch), OrigHeader);
NH->addIncoming(NPV, OrigPreHeader);
// "In" can be replaced by NH at various places.
LoopHeaderInfo.push_back(RenameData(In, NPV, NH));
LoopHeaderInfo.push_back(RenameData(PN, NPV, NH));
}
// Now, handle non-phi instructions.
for (; I != E; ++I) {
Instruction *In = I;
assert(!isa<PHINode>(In) && "PHINode is not expected here");
// This is not a PHI instruction. Insert its clone into original pre-header.
// If this instruction is using a value from same basic block then
// update it to use value from cloned instruction.
@ -230,21 +227,12 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
OrigPreHeader->getInstList().push_back(C);
for (unsigned opi = 0, e = In->getNumOperands(); opi != e; ++opi) {
if (Instruction *OpPhi = dyn_cast<PHINode>(In->getOperand(opi))) {
if (const RenameData *D = findReplacementData(OpPhi)) {
// This is using values from original header PHI node.
// Here, directly used incoming value from original pre-header.
C->setOperand(opi, D->PreHeader);
}
}
else if (Instruction *OpInsn =
dyn_cast<Instruction>(In->getOperand(opi))) {
if (const RenameData *D = findReplacementData(OpInsn))
C->setOperand(opi, D->PreHeader);
}
Instruction *OpInsn = dyn_cast<Instruction>(In->getOperand(opi));
if (!OpInsn) continue; // Ignore non-instruction values.
if (const RenameData *D = findReplacementData(OpInsn))
C->setOperand(opi, D->PreHeader);
}
// If this instruction is used outside this basic block then
// create new PHINode for this instruction.
Instruction *NewHeaderReplacement = NULL;
@ -276,7 +264,7 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// 2) Inside loop but not in original header
//
// Replace this use to reflect definition from new header.
for(unsigned LHI = 0, LHI_E = LoopHeaderInfo.size(); LHI != LHI_E; ++LHI) {
for (unsigned LHI = 0, LHI_E = LoopHeaderInfo.size(); LHI != LHI_E; ++LHI) {
const RenameData &ILoopHeaderInfo = LoopHeaderInfo[LHI];
if (!ILoopHeaderInfo.Header)
@ -289,10 +277,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// not invalidated.
SmallVector<Instruction *, 16> AllUses;
for (Value::use_iterator UI = OldPhi->use_begin(), UE = OldPhi->use_end();
UI != UE; ++UI) {
Instruction *U = cast<Instruction>(UI);
AllUses.push_back(U);
}
UI != UE; ++UI)
AllUses.push_back(cast<Instruction>(UI));
for (SmallVector<Instruction *, 16>::iterator UI = AllUses.begin(),
UE = AllUses.end(); UI != UE; ++UI) {
@ -351,14 +337,9 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
// Removing incoming branch from loop preheader to original header.
// Now original header is inside the loop.
for (BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end();
I != E; ++I) {
Instruction *In = I;
PHINode *PN = dyn_cast<PHINode>(In);
if (!PN)
break;
PN->removeIncomingValue(OrigPreHeader);
}
I != E; ++I)
if (PHINode *PN = dyn_cast<PHINode>(I))
PN->removeIncomingValue(OrigPreHeader);
// Make NewHeader as the new header for the loop.
L->moveToHeader(NewHeader);
@ -411,14 +392,11 @@ void LoopRotate::initialize() {
/// Return true if this instruction is used by any instructions in the loop that
/// aren't in original header.
bool LoopRotate::usedOutsideOriginalHeader(Instruction *In) {
for (Value::use_iterator UI = In->use_begin(), UE = In->use_end();
UI != UE; ++UI) {
Instruction *U = cast<Instruction>(UI);
if (U->getParent() != OrigHeader) {
if (L->contains(U->getParent()))
return true;
}
BasicBlock *UserBB = cast<Instruction>(UI)->getParent();
if (UserBB != OrigHeader && L->contains(UserBB))
return true;
}
return false;
@ -429,7 +407,7 @@ bool LoopRotate::usedOutsideOriginalHeader(Instruction *In) {
const RenameData *LoopRotate::findReplacementData(Instruction *In) {
// Since LoopHeaderInfo is small, linear walk is OK.
for(unsigned LHI = 0, LHI_E = LoopHeaderInfo.size(); LHI != LHI_E; ++LHI) {
for (unsigned LHI = 0, LHI_E = LoopHeaderInfo.size(); LHI != LHI_E; ++LHI) {
const RenameData &ILoopHeaderInfo = LoopHeaderInfo[LHI];
if (ILoopHeaderInfo.Original == In)
return &ILoopHeaderInfo;
@ -464,8 +442,7 @@ void LoopRotate::preserveCanonicalLoopForm(LPPassManager &LPM) {
for (BasicBlock::iterator I = NewHeader->begin(), E = NewHeader->end();
I != E; ++I) {
Instruction *In = I;
PHINode *PN = dyn_cast<PHINode>(In);
PHINode *PN = dyn_cast<PHINode>(I);
if (!PN)
break;
@ -492,8 +469,7 @@ void LoopRotate::preserveCanonicalLoopForm(LPPassManager &LPM) {
DT->changeImmediateDominator(OrigHeader, OrigLatch);
}
if(DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
// New Preheader's dominance frontier is Exit block.
DominanceFrontier::DomSetType NewPHSet;
NewPHSet.insert(Exit);