[llvm-branch-commits] [llvm-branch] r91393 - /llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp
Evan Cheng
evan.cheng at apple.com
Mon Dec 14 17:55:31 PST 2009
Author: evancheng
Date: Mon Dec 14 19:55:30 2009
New Revision: 91393
URL: http://llvm.org/viewvc/llvm-project?rev=91393&view=rev
Log:
Merge 91390.
Modified:
llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp
Modified: llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp?rev=91393&r1=91392&r2=91393&view=diff
==============================================================================
--- llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp (original)
+++ llvm/branches/Apple/Zoidberg/lib/CodeGen/TailDuplication.cpp Mon Dec 14 19:55:30 2009
@@ -90,7 +90,8 @@
SmallSetVector<MachineBasicBlock*, 8> &Succs);
bool TailDuplicateBlocks(MachineFunction &MF);
bool TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
- SmallVector<MachineBasicBlock*, 8> &TDBBs);
+ SmallVector<MachineBasicBlock*, 8> &TDBBs,
+ SmallVector<MachineInstr*, 16> &Copies);
void RemoveDeadBlock(MachineBasicBlock *MBB);
};
@@ -194,7 +195,8 @@
MBB->succ_end());
SmallVector<MachineBasicBlock*, 8> TDBBs;
- if (TailDuplicate(MBB, MF, TDBBs)) {
+ SmallVector<MachineInstr*, 16> Copies;
+ if (TailDuplicate(MBB, MF, TDBBs, Copies)) {
++NumTails;
// TailBB's immediate successors are now successors of those predecessors
@@ -251,6 +253,21 @@
SSAUpdateVals.clear();
}
+ // Eliminate some of the copies inserted tail duplication to maintain
+ // SSA form.
+ for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
+ MachineInstr *Copy = Copies[i];
+ unsigned Src, Dst, SrcSR, DstSR;
+ if (TII->isMoveInstr(*Copy, Src, Dst, SrcSR, DstSR)) {
+ MachineRegisterInfo::use_iterator UI = MRI->use_begin(Src);
+ if (++UI == MRI->use_end()) {
+ // Copy is the only use. Do trivial copy propagation here.
+ MRI->replaceRegWith(Dst, Src);
+ Copy->eraseFromParent();
+ }
+ }
+ }
+
if (PreRegAlloc && TailDupVerify)
VerifyPHIs(MF, false);
MadeChange = true;
@@ -418,7 +435,8 @@
/// of its predecessors.
bool
TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
- SmallVector<MachineBasicBlock*, 8> &TDBBs) {
+ SmallVector<MachineBasicBlock*, 8> &TDBBs,
+ SmallVector<MachineInstr*, 16> &Copies) {
// Don't try to tail-duplicate single-block loops.
if (TailBB->isSuccessor(TailBB))
return false;
@@ -502,7 +520,7 @@
// Clone the contents of TailBB into PredBB.
DenseMap<unsigned, unsigned> LocalVRMap;
- SmallVector<std::pair<unsigned,unsigned>, 4> Copies;
+ SmallVector<std::pair<unsigned,unsigned>, 4> CopyInfos;
MachineBasicBlock::iterator I = TailBB->begin();
while (I != TailBB->end()) {
MachineInstr *MI = &*I;
@@ -510,7 +528,7 @@
if (MI->getOpcode() == TargetInstrInfo::PHI) {
// Replace the uses of the def of the PHI with the register coming
// from PredBB.
- ProcessPHI(MI, TailBB, PredBB, LocalVRMap, Copies);
+ ProcessPHI(MI, TailBB, PredBB, LocalVRMap, CopyInfos);
} else {
// Replace def of virtual registers with new registers, and update
// uses with PHI source register or the new registers.
@@ -518,9 +536,12 @@
}
}
MachineBasicBlock::iterator Loc = PredBB->getFirstTerminator();
- for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
- const TargetRegisterClass *RC = MRI->getRegClass(Copies[i].first);
- TII->copyRegToReg(*PredBB, Loc, Copies[i].first, Copies[i].second, RC, RC);
+ for (unsigned i = 0, e = CopyInfos.size(); i != e; ++i) {
+ const TargetRegisterClass *RC = MRI->getRegClass(CopyInfos[i].first);
+ TII->copyRegToReg(*PredBB, Loc, CopyInfos[i].first,
+ CopyInfos[i].second, RC,RC);
+ MachineInstr *CopyMI = prior(Loc);
+ Copies.push_back(CopyMI);
}
NumInstrDups += TailBB->size() - 1; // subtract one for removed branch
@@ -553,14 +574,14 @@
<< "From MBB: " << *TailBB);
if (PreRegAlloc) {
DenseMap<unsigned, unsigned> LocalVRMap;
- SmallVector<std::pair<unsigned,unsigned>, 4> Copies;
+ SmallVector<std::pair<unsigned,unsigned>, 4> CopyInfos;
MachineBasicBlock::iterator I = TailBB->begin();
// Process PHI instructions first.
while (I != TailBB->end() && I->getOpcode() == TargetInstrInfo::PHI) {
// Replace the uses of the def of the PHI with the register coming
// from PredBB.
MachineInstr *MI = &*I++;
- ProcessPHI(MI, TailBB, PrevBB, LocalVRMap, Copies);
+ ProcessPHI(MI, TailBB, PrevBB, LocalVRMap, CopyInfos);
if (MI->getParent())
MI->eraseFromParent();
}
@@ -574,9 +595,12 @@
MI->eraseFromParent();
}
MachineBasicBlock::iterator Loc = PrevBB->getFirstTerminator();
- for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
- const TargetRegisterClass *RC = MRI->getRegClass(Copies[i].first);
- TII->copyRegToReg(*PrevBB, Loc, Copies[i].first, Copies[i].second, RC, RC);
+ for (unsigned i = 0, e = CopyInfos.size(); i != e; ++i) {
+ const TargetRegisterClass *RC = MRI->getRegClass(CopyInfos[i].first);
+ TII->copyRegToReg(*PrevBB, Loc, CopyInfos[i].first,
+ CopyInfos[i].second, RC, RC);
+ MachineInstr *CopyMI = prior(Loc);
+ Copies.push_back(CopyMI);
}
} else {
// No PHIs to worry about, just splice the instructions over.
More information about the llvm-branch-commits
mailing list