forked from OSchip/llvm-project
parent
01d48ec041
commit
97b9a4b412
|
@ -941,33 +941,14 @@ bool SimpleRegisterCoalescing::CanCoalesceWithImpDef(MachineInstr *CopyMI,
|
||||||
LiveInterval &ImpLi) const{
|
LiveInterval &ImpLi) const{
|
||||||
if (!CopyMI->killsRegister(ImpLi.reg))
|
if (!CopyMI->killsRegister(ImpLi.reg))
|
||||||
return false;
|
return false;
|
||||||
unsigned CopyIdx = li_->getDefIndex(li_->getInstructionIndex(CopyMI));
|
// Make sure this is the only use.
|
||||||
LiveInterval::iterator LR = li.FindLiveRangeContaining(CopyIdx);
|
for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(ImpLi.reg),
|
||||||
if (LR == li.end())
|
|
||||||
return false;
|
|
||||||
if (LR->valno->hasPHIKill())
|
|
||||||
return false;
|
|
||||||
if (LR->valno->def != CopyIdx)
|
|
||||||
return false;
|
|
||||||
// Make sure all of val# uses are copies.
|
|
||||||
for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(li.reg),
|
|
||||||
UE = mri_->use_end(); UI != UE;) {
|
UE = mri_->use_end(); UI != UE;) {
|
||||||
MachineInstr *UseMI = &*UI;
|
MachineInstr *UseMI = &*UI;
|
||||||
++UI;
|
++UI;
|
||||||
if (JoinedCopies.count(UseMI))
|
if (CopyMI == UseMI || JoinedCopies.count(UseMI))
|
||||||
continue;
|
continue;
|
||||||
unsigned UseIdx = li_->getUseIndex(li_->getInstructionIndex(UseMI));
|
return false;
|
||||||
LiveInterval::iterator ULR = li.FindLiveRangeContaining(UseIdx);
|
|
||||||
if (ULR == li.end() || ULR->valno != LR->valno)
|
|
||||||
continue;
|
|
||||||
// If the use is not a use, then it's not safe to coalesce the move.
|
|
||||||
unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx;
|
|
||||||
if (!tii_->isMoveInstr(*UseMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx)) {
|
|
||||||
if (UseMI->getOpcode() == TargetInstrInfo::INSERT_SUBREG &&
|
|
||||||
UseMI->getOperand(1).getReg() == li.reg)
|
|
||||||
continue;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2554,56 +2535,6 @@ static bool isZeroLengthInterval(LiveInterval *li) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TurnCopyIntoImpDef - If source of the specified copy is an implicit def,
|
|
||||||
/// turn the copy into an implicit def.
|
|
||||||
bool
|
|
||||||
SimpleRegisterCoalescing::TurnCopyIntoImpDef(MachineBasicBlock::iterator &I,
|
|
||||||
MachineBasicBlock *MBB,
|
|
||||||
unsigned DstReg, unsigned SrcReg) {
|
|
||||||
MachineInstr *CopyMI = &*I;
|
|
||||||
unsigned CopyIdx = li_->getDefIndex(li_->getInstructionIndex(CopyMI));
|
|
||||||
if (!li_->hasInterval(SrcReg))
|
|
||||||
return false;
|
|
||||||
LiveInterval &SrcInt = li_->getInterval(SrcReg);
|
|
||||||
if (!SrcInt.empty())
|
|
||||||
return false;
|
|
||||||
if (!li_->hasInterval(DstReg))
|
|
||||||
return false;
|
|
||||||
LiveInterval &DstInt = li_->getInterval(DstReg);
|
|
||||||
const LiveRange *DstLR = DstInt.getLiveRangeContaining(CopyIdx);
|
|
||||||
// If the valno extends beyond this basic block, then it's not safe to delete
|
|
||||||
// the val# or else livein information won't be correct.
|
|
||||||
MachineBasicBlock *EndMBB = li_->getMBBFromIndex(DstLR->end);
|
|
||||||
if (EndMBB != MBB)
|
|
||||||
return false;
|
|
||||||
DstInt.removeValNo(DstLR->valno);
|
|
||||||
li_->RemoveMachineInstrFromMaps(CopyMI);
|
|
||||||
CopyMI->eraseFromParent();
|
|
||||||
bool NoUse = mri_->use_empty(SrcReg);
|
|
||||||
if (NoUse) {
|
|
||||||
for (MachineRegisterInfo::reg_iterator RI = mri_->reg_begin(SrcReg),
|
|
||||||
RE = mri_->reg_end(); RI != RE; ) {
|
|
||||||
assert(RI.getOperand().isDef());
|
|
||||||
MachineInstr *DefMI = &*RI;
|
|
||||||
++RI;
|
|
||||||
// The implicit_def source has no other uses, delete it.
|
|
||||||
assert(DefMI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF);
|
|
||||||
li_->RemoveMachineInstrFromMaps(DefMI);
|
|
||||||
DefMI->eraseFromParent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark uses of implicit_def isUndef.
|
|
||||||
for (MachineRegisterInfo::use_iterator RI = mri_->use_begin(DstReg),
|
|
||||||
RE = mri_->use_end(); RI != RE; ++RI) {
|
|
||||||
assert((*RI).getParent() == MBB);
|
|
||||||
RI.getOperand().setIsUndef();
|
|
||||||
}
|
|
||||||
|
|
||||||
++I;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
|
bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
|
||||||
mf_ = &fn;
|
mf_ = &fn;
|
||||||
|
@ -2716,7 +2647,7 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
|
||||||
li_->RemoveMachineInstrFromMaps(MI);
|
li_->RemoveMachineInstrFromMaps(MI);
|
||||||
mii = mbbi->erase(mii);
|
mii = mbbi->erase(mii);
|
||||||
++numPeep;
|
++numPeep;
|
||||||
} else if (!isMove || !TurnCopyIntoImpDef(mii, mbb, DstReg, SrcReg)) {
|
} else {
|
||||||
SmallSet<unsigned, 4> UniqueUses;
|
SmallSet<unsigned, 4> UniqueUses;
|
||||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
const MachineOperand &mop = MI->getOperand(i);
|
const MachineOperand &mop = MI->getOperand(i);
|
||||||
|
|
|
@ -208,12 +208,6 @@ namespace llvm {
|
||||||
bool ReMaterializeTrivialDef(LiveInterval &SrcInt, unsigned DstReg,
|
bool ReMaterializeTrivialDef(LiveInterval &SrcInt, unsigned DstReg,
|
||||||
unsigned DstSubIdx, MachineInstr *CopyMI);
|
unsigned DstSubIdx, MachineInstr *CopyMI);
|
||||||
|
|
||||||
/// TurnCopyIntoImpDef - If source of the specified copy is an implicit def,
|
|
||||||
/// turn the copy into an implicit def.
|
|
||||||
bool TurnCopyIntoImpDef(MachineBasicBlock::iterator &I,
|
|
||||||
MachineBasicBlock *MBB,
|
|
||||||
unsigned DstReg, unsigned SrcReg);
|
|
||||||
|
|
||||||
/// CanCoalesceWithImpDef - Returns true if the specified copy instruction
|
/// CanCoalesceWithImpDef - Returns true if the specified copy instruction
|
||||||
/// from an implicit def to another register can be coalesced away.
|
/// from an implicit def to another register can be coalesced away.
|
||||||
bool CanCoalesceWithImpDef(MachineInstr *CopyMI,
|
bool CanCoalesceWithImpDef(MachineInstr *CopyMI,
|
||||||
|
|
Loading…
Reference in New Issue