diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-12-04 00:09:05 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-12-04 00:09:05 +0000 |
commit | 2e65c29ac64e7b36603d1a1de3d01cdfd2e61e23 (patch) | |
tree | 0c3aad3bf5ca0f61917728a7d8358498d243bed3 /lib/CodeGen/MachineSSAUpdater.cpp | |
parent | b3235d22e94c21ef00539d83db4d6d65bada48f5 (diff) |
- 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
Diffstat (limited to 'lib/CodeGen/MachineSSAUpdater.cpp')
-rw-r--r-- | lib/CodeGen/MachineSSAUpdater.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/CodeGen/MachineSSAUpdater.cpp b/lib/CodeGen/MachineSSAUpdater.cpp index 644cb9d46b..31662b3494 100644 --- a/lib/CodeGen/MachineSSAUpdater.cpp +++ b/lib/CodeGen/MachineSSAUpdater.cpp @@ -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; - } |