mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-20 20:38:48 +00:00
- Change TargetInstrInfo::reMaterialize to pass in TargetRegisterInfo.
- If destination is a physical register and it has a subreg index, use the sub-register instead. This fixes PR5423. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@88745 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4ec01b268e
commit
d57cdd5683
@ -21,6 +21,7 @@ namespace llvm {
|
|||||||
|
|
||||||
class MCAsmInfo;
|
class MCAsmInfo;
|
||||||
class TargetRegisterClass;
|
class TargetRegisterClass;
|
||||||
|
class TargetRegisterInfo;
|
||||||
class LiveVariables;
|
class LiveVariables;
|
||||||
class CalleeSavedInfo;
|
class CalleeSavedInfo;
|
||||||
class SDNode;
|
class SDNode;
|
||||||
@ -224,7 +225,8 @@ public:
|
|||||||
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 = 0;
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const = 0;
|
||||||
|
|
||||||
/// 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
|
||||||
@ -554,7 +556,8 @@ public:
|
|||||||
virtual void reMaterialize(MachineBasicBlock &MBB,
|
virtual void reMaterialize(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator MI,
|
MachineBasicBlock::iterator MI,
|
||||||
unsigned DestReg, unsigned SubReg,
|
unsigned DestReg, unsigned SubReg,
|
||||||
const MachineInstr *Orig) const;
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const;
|
||||||
virtual bool isIdentical(const MachineInstr *MI,
|
virtual bool isIdentical(const MachineInstr *MI,
|
||||||
const MachineInstr *Other,
|
const MachineInstr *Other,
|
||||||
const MachineRegisterInfo *MRI) const;
|
const MachineRegisterInfo *MRI) const;
|
||||||
|
@ -881,7 +881,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);
|
TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, TRI);
|
||||||
SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));
|
SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));
|
||||||
|
|
||||||
ReconstructLiveInterval(CurrLI);
|
ReconstructLiveInterval(CurrLI);
|
||||||
|
@ -709,7 +709,7 @@ bool SimpleRegisterCoalescing::ReMaterializeTrivialDef(LiveInterval &SrcInt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MachineBasicBlock::iterator MII = next(MachineBasicBlock::iterator(CopyMI));
|
MachineBasicBlock::iterator MII = next(MachineBasicBlock::iterator(CopyMI));
|
||||||
tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI);
|
tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, tri_);
|
||||||
MachineInstr *NewMI = prior(MII);
|
MachineInstr *NewMI = prior(MII);
|
||||||
|
|
||||||
if (checkForDeadDef) {
|
if (checkForDeadDef) {
|
||||||
|
@ -135,11 +135,16 @@ void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
|
|||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg,
|
unsigned DestReg,
|
||||||
unsigned SubIdx,
|
unsigned SubIdx,
|
||||||
const MachineInstr *Orig) const {
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const {
|
||||||
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
|
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
|
||||||
MachineOperand &MO = MI->getOperand(0);
|
MachineOperand &MO = MI->getOperand(0);
|
||||||
MO.setReg(DestReg);
|
if (TargetRegisterInfo::isVirtualRegister(DestReg)) {
|
||||||
MO.setSubReg(SubIdx);
|
MO.setReg(DestReg);
|
||||||
|
MO.setSubReg(SubIdx);
|
||||||
|
} else {
|
||||||
|
MO.setReg(TRI->getSubReg(DestReg, SubIdx));
|
||||||
|
}
|
||||||
MBB.insert(I, MI);
|
MBB.insert(I, MI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1033,7 +1033,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){
|
isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){
|
||||||
DEBUG(errs() << "2addr: REMATTING : " << *DefMI << "\n");
|
DEBUG(errs() << "2addr: REMATTING : " << *DefMI << "\n");
|
||||||
unsigned regASubIdx = mi->getOperand(DstIdx).getSubReg();
|
unsigned regASubIdx = mi->getOperand(DstIdx).getSubReg();
|
||||||
TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI);
|
TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI, TRI);
|
||||||
ReMatRegs.set(regB);
|
ReMatRegs.set(regB);
|
||||||
++NumReMats;
|
++NumReMats;
|
||||||
} else {
|
} else {
|
||||||
|
@ -594,7 +594,7 @@ static void UpdateKills(MachineInstr &MI, const TargetRegisterInfo* TRI,
|
|||||||
|
|
||||||
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
||||||
const MachineOperand &MO = MI.getOperand(i);
|
const MachineOperand &MO = MI.getOperand(i);
|
||||||
if (!MO.isReg() || !MO.isDef())
|
if (!MO.isReg() || !MO.getReg() || !MO.isDef())
|
||||||
continue;
|
continue;
|
||||||
unsigned Reg = MO.getReg();
|
unsigned Reg = MO.getReg();
|
||||||
RegKills.reset(Reg);
|
RegKills.reset(Reg);
|
||||||
@ -626,7 +626,7 @@ static void ReMaterialize(MachineBasicBlock &MBB,
|
|||||||
"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,
|
||||||
ReMatDefMI->getOperand(0).getSubReg(), ReMatDefMI);
|
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);
|
||||||
|
@ -921,8 +921,15 @@ void ARMBaseInstrInfo::
|
|||||||
reMaterialize(MachineBasicBlock &MBB,
|
reMaterialize(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SubIdx,
|
unsigned DestReg, unsigned SubIdx,
|
||||||
const MachineInstr *Orig) const {
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const {
|
||||||
DebugLoc dl = Orig->getDebugLoc();
|
DebugLoc dl = Orig->getDebugLoc();
|
||||||
|
|
||||||
|
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: {
|
||||||
|
@ -267,7 +267,8 @@ public:
|
|||||||
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;
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const;
|
||||||
|
|
||||||
virtual bool isIdentical(const MachineInstr *MI, const MachineInstr *Other,
|
virtual bool isIdentical(const MachineInstr *MI, const MachineInstr *Other,
|
||||||
const MachineRegisterInfo *MRI) const;
|
const MachineRegisterInfo *MRI) const;
|
||||||
|
@ -81,8 +81,8 @@ bool ARMInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|||||||
|
|
||||||
void ARMInstrInfo::
|
void ARMInstrInfo::
|
||||||
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SubIdx,
|
unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig,
|
||||||
const MachineInstr *Orig) 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) {
|
||||||
@ -100,6 +100,6 @@ reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ARMBaseInstrInfo::reMaterialize(MBB, I, DestReg, SubIdx, Orig);
|
return ARMBaseInstrInfo::reMaterialize(MBB, I, DestReg, SubIdx, Orig, TRI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,8 @@ 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;
|
const MachineInstr *Orig,
|
||||||
|
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
|
||||||
|
@ -991,12 +991,13 @@ static bool isSafeToClobberEFLAGS(MachineBasicBlock &MBB,
|
|||||||
void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
|
void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SubIdx,
|
unsigned DestReg, unsigned SubIdx,
|
||||||
const MachineInstr *Orig) const {
|
const MachineInstr *Orig,
|
||||||
|
const TargetRegisterInfo *TRI) const {
|
||||||
DebugLoc DL = DebugLoc::getUnknownLoc();
|
DebugLoc DL = DebugLoc::getUnknownLoc();
|
||||||
if (I != MBB.end()) DL = I->getDebugLoc();
|
if (I != MBB.end()) DL = I->getDebugLoc();
|
||||||
|
|
||||||
if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
|
if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
|
||||||
DestReg = RI.getSubReg(DestReg, SubIdx);
|
DestReg = TRI->getSubReg(DestReg, SubIdx);
|
||||||
SubIdx = 0;
|
SubIdx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,7 +482,8 @@ public:
|
|||||||
AliasAnalysis *AA) const;
|
AliasAnalysis *AA) const;
|
||||||
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;
|
const MachineInstr *Orig,
|
||||||
|
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
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
; RUN: llc -mcpu=cortex-a8 < %s | FileCheck %s
|
; RUN: llc -mcpu=cortex-a8 < %s | FileCheck %s
|
||||||
; XFAIL: *
|
; PR5423
|
||||||
|
|
||||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"
|
||||||
target triple = "armv7-eabi"
|
target triple = "armv7-eabi"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user