- If the reaching definition is an undef and the use is a PHI, add the implicit_def to the end of the source block.

- When reaching value is replaced with another, update the cache as well.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90501 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2009-12-04 00:09:05 +00:00
parent b3235d22e9
commit 2e65c29ac6

View File

@ -194,17 +194,22 @@ void MachineSSAUpdater::RewriteUse(MachineOperand &U) {
if (UseMI->getOpcode() == TargetInstrInfo::PHI) {
MachineBasicBlock *SourceBB = findCorrespondingPred(UseMI, &U);
NewVR = GetValueAtEndOfBlock(SourceBB);
} else {
NewVR = GetValueInMiddleOfBlock(UseMI->getParent());
}
if (NewVR == ~0U) {
// Insert an implicit_def to represent an undef value.
MachineInstr *NewDef = InsertNewDef(TargetInstrInfo::IMPLICIT_DEF,
UseMI->getParent(), UseMI, VRC,MRI,TII);
SourceBB,SourceBB->getFirstTerminator(),
VRC, MRI, TII);
NewVR = NewDef->getOperand(0).getReg();
} else {
NewVR = GetValueInMiddleOfBlock(UseMI->getParent());
if (NewVR == ~0U) {
// Insert an implicit_def to represent an undef value.
MachineInstr *NewDef = InsertNewDef(TargetInstrInfo::IMPLICIT_DEF,
UseMI->getParent(), UseMI,
VRC, MRI, TII);
NewVR = NewDef->getOperand(0).getReg();
}
}
U.setReg(NewVR);
}
@ -281,7 +286,7 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
/// this block is involved in a loop, a no-entry PHI node will have been
/// inserted as InsertedVal. Otherwise, we'll still have the null we inserted
/// above.
unsigned InsertedVal = AvailableVals[BB];
unsigned &InsertedVal = AvailableVals[BB];
// If all the predecessor values are the same then we don't need to insert a
// PHI. This is the simple and common case.
@ -294,10 +299,10 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
assert(InsertedVal != SingularValue && "Dead loop?");
MRI->replaceRegWith(InsertedVal, SingularValue);
OldVal->eraseFromParent();
} else {
InsertedVal = SingularValue;
}
InsertedVal = SingularValue;
// Drop the entries we added in IncomingPredInfo to restore the stack.
IncomingPredInfo.erase(IncomingPredInfo.begin()+FirstPredInfoEntry,
IncomingPredInfo.end());
@ -348,5 +353,4 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
}
return InsertedVal;
}