Slightly change the meaning of the reMaterialize target hook when the original

instruction defines subregisters.

Any existing subreg indices on the original instruction are preserved or
composed with the new subreg index.

Also substitute multiple operands mentioning the original register by using the
new MachineInstr::substituteRegister() function. This is necessary because there
will soon be <imp-def> operands added to non read-modify-write partial
definitions. This instruction:

  %reg1234:foo = FLAP %reg1234<imp-def>

will reMaterialize(%reg3333, bar) like this:

  %reg3333:bar-foo = FLAP %reg333:bar<imp-def>

Finally, replace the TargetRegisterInfo pointer argument with a reference to
indicate that it cannot be NULL.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105358 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2010-06-02 22:47:25 +00:00
parent 4839d872fc
commit 9edf7deb37
14 changed files with 48 additions and 40 deletions

View File

@ -339,6 +339,11 @@ public:
/// copyPredicates - Copies predicate operand(s) from MI. /// copyPredicates - Copies predicate operand(s) from MI.
void copyPredicates(const MachineInstr *MI); void copyPredicates(const MachineInstr *MI);
/// substituteRegister - Replace all occurrences of FromReg with ToReg:SubIdx,
/// properly composing subreg indices where necessary.
void substituteRegister(unsigned FromReg, unsigned ToReg, unsigned SubIdx,
const TargetRegisterInfo &RegInfo);
/// addRegisterKilled - We have determined MI kills a register. Look for the /// addRegisterKilled - We have determined MI kills a register. Look for the
/// operand that uses it and mark it as IsKill. If AddIfNotFound is true, /// operand that uses it and mark it as IsKill. If AddIfNotFound is true,
/// add a implicit operand if it's not found. Returns true if the operand /// add a implicit operand if it's not found. Returns true if the operand

View File

@ -194,11 +194,14 @@ public:
/// reMaterialize - Re-issue the specified 'original' instruction at the /// reMaterialize - Re-issue the specified 'original' instruction at the
/// specific location targeting a new destination register. /// specific location targeting a new destination register.
/// The register in Orig->getOperand(0).getReg() will be substituted by
/// DestReg:SubIdx. Any existing subreg index is preserved or composed with
/// SubIdx.
virtual void reMaterialize(MachineBasicBlock &MBB, virtual void reMaterialize(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI, MachineBasicBlock::iterator MI,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const = 0; const TargetRegisterInfo &TRI) const = 0;
/// duplicate - Create a duplicate of the Orig instruction in MF. This is like /// duplicate - Create a duplicate of the Orig instruction in MF. This is like
/// MachineFunction::CloneMachineInstr(), but the target may update operands /// MachineFunction::CloneMachineInstr(), but the target may update operands
@ -585,7 +588,7 @@ public:
MachineBasicBlock::iterator MI, MachineBasicBlock::iterator MI,
unsigned DestReg, unsigned SubReg, unsigned DestReg, unsigned SubReg,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const; const TargetRegisterInfo &TRI) const;
virtual MachineInstr *duplicate(MachineInstr *Orig, virtual MachineInstr *duplicate(MachineInstr *Orig,
MachineFunction &MF) const; MachineFunction &MF) const;
virtual bool produceSameValue(const MachineInstr *MI0, virtual bool produceSameValue(const MachineInstr *MI0,

View File

@ -1037,6 +1037,29 @@ void MachineInstr::copyPredicates(const MachineInstr *MI) {
} }
} }
void MachineInstr::substituteRegister(unsigned FromReg,
unsigned ToReg,
unsigned SubIdx,
const TargetRegisterInfo &RegInfo) {
if (TargetRegisterInfo::isPhysicalRegister(ToReg)) {
if (SubIdx)
ToReg = RegInfo.getSubReg(ToReg, SubIdx);
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
MachineOperand &MO = getOperand(i);
if (!MO.isReg() || MO.getReg() != FromReg)
continue;
MO.substPhysReg(ToReg, RegInfo);
}
} else {
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
MachineOperand &MO = getOperand(i);
if (!MO.isReg() || MO.getReg() != FromReg)
continue;
MO.substVirtReg(ToReg, SubIdx, RegInfo);
}
}
}
/// isSafeToMove - Return true if it is safe to move this instruction. If /// isSafeToMove - Return true if it is safe to move this instruction. If
/// SawStore is set to true, it means that there is a store (or call) between /// SawStore is set to true, it means that there is a store (or call) between
/// the instruction's location and its intended destination. /// the instruction's location and its intended destination.

View File

@ -854,7 +854,7 @@ bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,
if (KillPt == DefMI->getParent()->end()) if (KillPt == DefMI->getParent()->end())
return false; return false;
TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, TRI); TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, *TRI);
SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt)); SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));
ReconstructLiveInterval(CurrLI); ReconstructLiveInterval(CurrLI);

View File

@ -727,7 +727,7 @@ bool SimpleRegisterCoalescing::ReMaterializeTrivialDef(LiveInterval &SrcInt,
MachineBasicBlock::iterator MII = MachineBasicBlock::iterator MII =
llvm::next(MachineBasicBlock::iterator(CopyMI)); llvm::next(MachineBasicBlock::iterator(CopyMI));
tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, tri_); tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, *tri_);
MachineInstr *NewMI = prior(MII); MachineInstr *NewMI = prior(MII);
if (checkForDeadDef) { if (checkForDeadDef) {

View File

@ -136,17 +136,9 @@ void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
unsigned DestReg, unsigned DestReg,
unsigned SubIdx, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const { const TargetRegisterInfo &TRI) const {
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig); MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
MachineOperand &MO = MI->getOperand(0); MI->substituteRegister(MI->getOperand(0).getReg(), DestReg, SubIdx, TRI);
if (TargetRegisterInfo::isVirtualRegister(DestReg)) {
MO.setReg(DestReg);
MO.setSubReg(SubIdx);
} else if (SubIdx) {
MO.setReg(TRI->getSubReg(DestReg, SubIdx));
} else {
MO.setReg(DestReg);
}
MBB.insert(I, MI); MBB.insert(I, MI);
} }

View File

@ -1047,7 +1047,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){ isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){
DEBUG(dbgs() << "2addr: REMATTING : " << *DefMI << "\n"); DEBUG(dbgs() << "2addr: REMATTING : " << *DefMI << "\n");
unsigned regASubIdx = mi->getOperand(DstIdx).getSubReg(); unsigned regASubIdx = mi->getOperand(DstIdx).getSubReg();
TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI, TRI); TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI, *TRI);
ReMatRegs.set(regB); ReMatRegs.set(regB);
++NumReMats; ++NumReMats;
} else { } else {

View File

@ -667,8 +667,7 @@ static void ReMaterialize(MachineBasicBlock &MBB,
assert(TID.getNumDefs() == 1 && assert(TID.getNumDefs() == 1 &&
"Don't know how to remat instructions that define > 1 values!"); "Don't know how to remat instructions that define > 1 values!");
#endif #endif
TII->reMaterialize(MBB, MII, DestReg, TII->reMaterialize(MBB, MII, DestReg, 0, ReMatDefMI, *TRI);
ReMatDefMI->getOperand(0).getSubReg(), ReMatDefMI, TRI);
MachineInstr *NewMI = prior(MII); MachineInstr *NewMI = prior(MII);
for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {
MachineOperand &MO = NewMI->getOperand(i); MachineOperand &MO = NewMI->getOperand(i);

View File

@ -1212,17 +1212,12 @@ reMaterialize(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I, MachineBasicBlock::iterator I,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const { const TargetRegisterInfo &TRI) const {
if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
DestReg = TRI->getSubReg(DestReg, SubIdx);
SubIdx = 0;
}
unsigned Opcode = Orig->getOpcode(); unsigned Opcode = Orig->getOpcode();
switch (Opcode) { switch (Opcode) {
default: { default: {
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig); MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
MI->getOperand(0).setReg(DestReg); MI->substituteRegister(Orig->getOperand(0).getReg(), DestReg, SubIdx, TRI);
MBB.insert(I, MI); MBB.insert(I, MI);
break; break;
} }
@ -1238,9 +1233,6 @@ reMaterialize(MachineBasicBlock &MBB,
break; break;
} }
} }
MachineInstr *NewMI = prior(I);
NewMI->getOperand(0).setSubReg(SubIdx);
} }
MachineInstr * MachineInstr *

View File

@ -300,7 +300,7 @@ public:
MachineBasicBlock::iterator MI, MachineBasicBlock::iterator MI,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const; const TargetRegisterInfo &TRI) const;
MachineInstr *duplicate(MachineInstr *Orig, MachineFunction &MF) const; MachineInstr *duplicate(MachineInstr *Orig, MachineFunction &MF) const;

View File

@ -63,7 +63,7 @@ unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const {
void ARMInstrInfo:: void ARMInstrInfo::
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const { const TargetRegisterInfo &TRI) const {
DebugLoc dl = Orig->getDebugLoc(); DebugLoc dl = Orig->getDebugLoc();
unsigned Opcode = Orig->getOpcode(); unsigned Opcode = Orig->getOpcode();
switch (Opcode) { switch (Opcode) {

View File

@ -35,7 +35,7 @@ public:
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const; const TargetRegisterInfo &TRI) const;
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
/// such, whenever a client has an instance of instruction info, it should /// such, whenever a client has an instance of instruction info, it should

View File

@ -1064,14 +1064,9 @@ void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I, MachineBasicBlock::iterator I,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const { const TargetRegisterInfo &TRI) const {
DebugLoc DL = Orig->getDebugLoc(); DebugLoc DL = Orig->getDebugLoc();
if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
DestReg = TRI->getSubReg(DestReg, SubIdx);
SubIdx = 0;
}
// MOV32r0 etc. are implemented with xor which clobbers condition code. // MOV32r0 etc. are implemented with xor which clobbers condition code.
// Re-materialize them as movri instructions to avoid side effects. // Re-materialize them as movri instructions to avoid side effects.
bool Clone = true; bool Clone = true;
@ -1098,14 +1093,13 @@ void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
if (Clone) { if (Clone) {
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig); MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
MI->getOperand(0).setReg(DestReg);
MBB.insert(I, MI); MBB.insert(I, MI);
} else { } else {
BuildMI(MBB, I, DL, get(Opc), DestReg).addImm(0); BuildMI(MBB, I, DL, get(Opc)).addOperand(Orig->getOperand(0)).addImm(0);
} }
MachineInstr *NewMI = prior(I); MachineInstr *NewMI = prior(I);
NewMI->getOperand(0).setSubReg(SubIdx); NewMI->substituteRegister(Orig->getOperand(0).getReg(), DestReg, SubIdx, TRI);
} }
/// hasLiveCondCodeDef - True if MI has a condition code def, e.g. EFLAGS, that /// hasLiveCondCodeDef - True if MI has a condition code def, e.g. EFLAGS, that

View File

@ -555,7 +555,7 @@ public:
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
unsigned DestReg, unsigned SubIdx, unsigned DestReg, unsigned SubIdx,
const MachineInstr *Orig, const MachineInstr *Orig,
const TargetRegisterInfo *TRI) const; const TargetRegisterInfo &TRI) const;
/// convertToThreeAddress - This method must be implemented by targets that /// convertToThreeAddress - This method must be implemented by targets that
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target /// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target