mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
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:
parent
4839d872fc
commit
9edf7deb37
@ -339,6 +339,11 @@ public:
|
||||
/// copyPredicates - Copies predicate operand(s) from 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
|
||||
/// 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
|
||||
|
@ -194,11 +194,14 @@ public:
|
||||
|
||||
/// reMaterialize - Re-issue the specified 'original' instruction at the
|
||||
/// 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,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
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
|
||||
/// MachineFunction::CloneMachineInstr(), but the target may update operands
|
||||
@ -585,7 +588,7 @@ public:
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubReg,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const;
|
||||
const TargetRegisterInfo &TRI) const;
|
||||
virtual MachineInstr *duplicate(MachineInstr *Orig,
|
||||
MachineFunction &MF) const;
|
||||
virtual bool produceSameValue(const MachineInstr *MI0,
|
||||
|
@ -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
|
||||
/// SawStore is set to true, it means that there is a store (or call) between
|
||||
/// the instruction's location and its intended destination.
|
||||
|
@ -854,7 +854,7 @@ bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,
|
||||
if (KillPt == DefMI->getParent()->end())
|
||||
return false;
|
||||
|
||||
TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, TRI);
|
||||
TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, *TRI);
|
||||
SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));
|
||||
|
||||
ReconstructLiveInterval(CurrLI);
|
||||
|
@ -727,7 +727,7 @@ bool SimpleRegisterCoalescing::ReMaterializeTrivialDef(LiveInterval &SrcInt,
|
||||
|
||||
MachineBasicBlock::iterator MII =
|
||||
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);
|
||||
|
||||
if (checkForDeadDef) {
|
||||
|
@ -136,17 +136,9 @@ void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
|
||||
unsigned DestReg,
|
||||
unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
const TargetRegisterInfo &TRI) const {
|
||||
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
|
||||
MachineOperand &MO = MI->getOperand(0);
|
||||
if (TargetRegisterInfo::isVirtualRegister(DestReg)) {
|
||||
MO.setReg(DestReg);
|
||||
MO.setSubReg(SubIdx);
|
||||
} else if (SubIdx) {
|
||||
MO.setReg(TRI->getSubReg(DestReg, SubIdx));
|
||||
} else {
|
||||
MO.setReg(DestReg);
|
||||
}
|
||||
MI->substituteRegister(MI->getOperand(0).getReg(), DestReg, SubIdx, TRI);
|
||||
MBB.insert(I, MI);
|
||||
}
|
||||
|
||||
|
@ -1047,7 +1047,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
|
||||
isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){
|
||||
DEBUG(dbgs() << "2addr: REMATTING : " << *DefMI << "\n");
|
||||
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);
|
||||
++NumReMats;
|
||||
} else {
|
||||
|
@ -667,8 +667,7 @@ static void ReMaterialize(MachineBasicBlock &MBB,
|
||||
assert(TID.getNumDefs() == 1 &&
|
||||
"Don't know how to remat instructions that define > 1 values!");
|
||||
#endif
|
||||
TII->reMaterialize(MBB, MII, DestReg,
|
||||
ReMatDefMI->getOperand(0).getSubReg(), ReMatDefMI, TRI);
|
||||
TII->reMaterialize(MBB, MII, DestReg, 0, ReMatDefMI, *TRI);
|
||||
MachineInstr *NewMI = prior(MII);
|
||||
for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = NewMI->getOperand(i);
|
||||
|
@ -1212,17 +1212,12 @@ reMaterialize(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
|
||||
DestReg = TRI->getSubReg(DestReg, SubIdx);
|
||||
SubIdx = 0;
|
||||
}
|
||||
|
||||
const TargetRegisterInfo &TRI) const {
|
||||
unsigned Opcode = Orig->getOpcode();
|
||||
switch (Opcode) {
|
||||
default: {
|
||||
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
|
||||
MI->getOperand(0).setReg(DestReg);
|
||||
MI->substituteRegister(Orig->getOperand(0).getReg(), DestReg, SubIdx, TRI);
|
||||
MBB.insert(I, MI);
|
||||
break;
|
||||
}
|
||||
@ -1238,9 +1233,6 @@ reMaterialize(MachineBasicBlock &MBB,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MachineInstr *NewMI = prior(I);
|
||||
NewMI->getOperand(0).setSubReg(SubIdx);
|
||||
}
|
||||
|
||||
MachineInstr *
|
||||
|
@ -300,7 +300,7 @@ public:
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const;
|
||||
const TargetRegisterInfo &TRI) const;
|
||||
|
||||
MachineInstr *duplicate(MachineInstr *Orig, MachineFunction &MF) const;
|
||||
|
||||
|
@ -63,7 +63,7 @@ unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
||||
void ARMInstrInfo::
|
||||
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
const TargetRegisterInfo &TRI) const {
|
||||
DebugLoc dl = Orig->getDebugLoc();
|
||||
unsigned Opcode = Orig->getOpcode();
|
||||
switch (Opcode) {
|
||||
|
@ -35,7 +35,7 @@ public:
|
||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const;
|
||||
const TargetRegisterInfo &TRI) const;
|
||||
|
||||
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
|
||||
/// such, whenever a client has an instance of instruction info, it should
|
||||
|
@ -1064,14 +1064,9 @@ void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator I,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
const TargetRegisterInfo &TRI) const {
|
||||
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.
|
||||
// Re-materialize them as movri instructions to avoid side effects.
|
||||
bool Clone = true;
|
||||
@ -1098,14 +1093,13 @@ void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
|
||||
|
||||
if (Clone) {
|
||||
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
|
||||
MI->getOperand(0).setReg(DestReg);
|
||||
MBB.insert(I, MI);
|
||||
} 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);
|
||||
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
|
||||
|
@ -555,7 +555,7 @@ public:
|
||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubIdx,
|
||||
const MachineInstr *Orig,
|
||||
const TargetRegisterInfo *TRI) const;
|
||||
const TargetRegisterInfo &TRI) const;
|
||||
|
||||
/// convertToThreeAddress - This method must be implemented by targets that
|
||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||
|
Loading…
Reference in New Issue
Block a user