mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-25 03:55:25 +00:00
- 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:
parent
b3235d22e9
commit
2e65c29ac6
@ -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;
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user