mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-19 19:31:50 +00:00
Add an MF argument to TRI::getPointerRegClass() and TII::getRegClass().
The getPointerRegClass() hook can return register classes that depend on the calling convention of the current function (ptr_rc_tailcall). So far, we have been able to infer the calling convention from the subtarget alone, but as we add support for multiple calling conventions per target, that no longer works. Patch by Yiannis Tsiouris! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156328 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9b23d57dc4
commit
397fc4874e
@ -57,7 +57,8 @@ public:
|
||||
/// class constraint for OpNum, or NULL.
|
||||
const TargetRegisterClass *getRegClass(const MCInstrDesc &TID,
|
||||
unsigned OpNum,
|
||||
const TargetRegisterInfo *TRI) const;
|
||||
const TargetRegisterInfo *TRI,
|
||||
const MachineFunction &MF) const;
|
||||
|
||||
/// isTriviallyReMaterializable - Return true if the instruction is trivially
|
||||
/// rematerializable, meaning it has no side effects and requires no operands
|
||||
|
@ -515,7 +515,8 @@ public:
|
||||
/// getPointerRegClass - Returns a TargetRegisterClass used for pointer
|
||||
/// values. If a target supports multiple different pointer register classes,
|
||||
/// kind specifies which one is indicated.
|
||||
virtual const TargetRegisterClass *getPointerRegClass(unsigned Kind=0) const {
|
||||
virtual const TargetRegisterClass *
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const {
|
||||
llvm_unreachable("Target didn't implement getPointerRegClass!");
|
||||
}
|
||||
|
||||
|
@ -404,7 +404,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,
|
||||
// Note register reference...
|
||||
const TargetRegisterClass *RC = NULL;
|
||||
if (i < MI->getDesc().getNumOperands())
|
||||
RC = TII->getRegClass(MI->getDesc(), i, TRI);
|
||||
RC = TII->getRegClass(MI->getDesc(), i, TRI, MF);
|
||||
AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
|
||||
RegRefs.insert(std::make_pair(Reg, RR));
|
||||
}
|
||||
@ -479,7 +479,7 @@ void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
// Note register reference...
|
||||
const TargetRegisterClass *RC = NULL;
|
||||
if (i < MI->getDesc().getNumOperands())
|
||||
RC = TII->getRegClass(MI->getDesc(), i, TRI);
|
||||
RC = TII->getRegClass(MI->getDesc(), i, TRI, MF);
|
||||
AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
|
||||
RegRefs.insert(std::make_pair(Reg, RR));
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ void CriticalAntiDepBreaker::PrescanInstruction(MachineInstr *MI) {
|
||||
const TargetRegisterClass *NewRC = 0;
|
||||
|
||||
if (i < MI->getDesc().getNumOperands())
|
||||
NewRC = TII->getRegClass(MI->getDesc(), i, TRI);
|
||||
NewRC = TII->getRegClass(MI->getDesc(), i, TRI, MF);
|
||||
|
||||
// For now, only allow the register to be changed if its register
|
||||
// class is consistent across all uses.
|
||||
@ -308,7 +308,7 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
|
||||
const TargetRegisterClass *NewRC = 0;
|
||||
if (i < MI->getDesc().getNumOperands())
|
||||
NewRC = TII->getRegClass(MI->getDesc(), i, TRI);
|
||||
NewRC = TII->getRegClass(MI->getDesc(), i, TRI, MF);
|
||||
|
||||
// For now, only allow the register to be changed if its register
|
||||
// class is consistent across all uses.
|
||||
|
@ -314,7 +314,8 @@ bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
|
||||
// No previously defined register was in range, so create a
|
||||
// new one.
|
||||
int64_t InstrOffset = TRI->getFrameIndexInstrOffset(MI, idx);
|
||||
const TargetRegisterClass *RC = TRI->getPointerRegClass();
|
||||
const MachineFunction *MF = MI->getParent()->getParent();
|
||||
const TargetRegisterClass *RC = TRI->getPointerRegClass(*MF);
|
||||
BaseReg = Fn.getRegInfo().createVirtualRegister(RC);
|
||||
|
||||
DEBUG(dbgs() << " Materializing base register " << BaseReg <<
|
||||
|
@ -942,9 +942,13 @@ const TargetRegisterClass*
|
||||
MachineInstr::getRegClassConstraint(unsigned OpIdx,
|
||||
const TargetInstrInfo *TII,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
assert(getParent() && "Can't have an MBB reference here!");
|
||||
assert(getParent()->getParent() && "Can't have an MF reference here!");
|
||||
const MachineFunction &MF = *getParent()->getParent();
|
||||
|
||||
// Most opcodes have fixed constraints in their MCInstrDesc.
|
||||
if (!isInlineAsm())
|
||||
return TII->getRegClass(getDesc(), OpIdx, TRI);
|
||||
return TII->getRegClass(getDesc(), OpIdx, TRI, MF);
|
||||
|
||||
if (!getOperand(OpIdx).isReg())
|
||||
return NULL;
|
||||
@ -966,7 +970,7 @@ MachineInstr::getRegClassConstraint(unsigned OpIdx,
|
||||
|
||||
// Assume that all registers in a memory operand are pointers.
|
||||
if (InlineAsm::getKind(Flag) == InlineAsm::Kind_Mem)
|
||||
return TRI->getPointerRegClass();
|
||||
return TRI->getPointerRegClass(MF);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1260,11 +1260,11 @@ MachineInstr *MachineLICM::ExtractHoistableLoad(MachineInstr *MI) {
|
||||
if (NewOpc == 0) return 0;
|
||||
const MCInstrDesc &MID = TII->get(NewOpc);
|
||||
if (MID.getNumDefs() != 1) return 0;
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MID, LoadRegIndex, TRI);
|
||||
MachineFunction &MF = *MI->getParent()->getParent();
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MID, LoadRegIndex, TRI, MF);
|
||||
// Ok, we're unfolding. Create a temporary register and do the unfold.
|
||||
unsigned Reg = MRI->createVirtualRegister(RC);
|
||||
|
||||
MachineFunction &MF = *MI->getParent()->getParent();
|
||||
SmallVector<MachineInstr *, 2> NewMIs;
|
||||
bool Success =
|
||||
TII->unfoldMemoryOperand(MF, MI, Reg,
|
||||
|
@ -672,7 +672,8 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
|
||||
report("Illegal subregister index for physical register", MO, MONum);
|
||||
return;
|
||||
}
|
||||
if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) {
|
||||
if (const TargetRegisterClass *DRC =
|
||||
TII->getRegClass(MCID, MONum, TRI, *MF)) {
|
||||
if (!DRC->contains(Reg)) {
|
||||
report("Illegal physical register for instruction", MO, MONum);
|
||||
*OS << TRI->getName(Reg) << " is not a "
|
||||
@ -698,7 +699,8 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (const TargetRegisterClass *DRC = TII->getRegClass(MCID,MONum,TRI)) {
|
||||
if (const TargetRegisterClass *DRC =
|
||||
TII->getRegClass(MCID, MONum, TRI, *MF)) {
|
||||
if (SubIdx) {
|
||||
const TargetRegisterClass *SuperRC =
|
||||
TRI->getLargestLegalSuperClass(RC);
|
||||
@ -1357,4 +1359,3 @@ void MachineVerifier::verifyLiveIntervals() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -779,7 +779,7 @@ bool RegisterCoalescer::ReMaterializeTrivialDef(LiveInterval &SrcInt,
|
||||
// Make sure the copy destination register class fits the instruction
|
||||
// definition register class. The mismatch can happen as a result of earlier
|
||||
// extract_subreg, insert_subreg, subreg_to_reg coalescing.
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MCID, 0, TRI);
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MCID, 0, TRI, *MF);
|
||||
if (TargetRegisterInfo::isVirtualRegister(DstReg)) {
|
||||
if (MRI->getRegClass(DstReg) != RC)
|
||||
return false;
|
||||
|
@ -116,7 +116,7 @@ EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone, bool IsCloned,
|
||||
const TargetRegisterClass *RC = 0;
|
||||
if (i+II.getNumDefs() < II.getNumOperands()) {
|
||||
RC = TRI->getAllocatableClass(
|
||||
TII->getRegClass(II, i+II.getNumDefs(), TRI));
|
||||
TII->getRegClass(II, i+II.getNumDefs(), TRI, *MF));
|
||||
}
|
||||
if (!UseRC)
|
||||
UseRC = RC;
|
||||
@ -199,7 +199,7 @@ void InstrEmitter::CreateVirtualRegisters(SDNode *Node, MachineInstr *MI,
|
||||
// register instead of creating a new vreg.
|
||||
unsigned VRBase = 0;
|
||||
const TargetRegisterClass *RC =
|
||||
TRI->getAllocatableClass(TII->getRegClass(II, i, TRI));
|
||||
TRI->getAllocatableClass(TII->getRegClass(II, i, TRI, *MF));
|
||||
if (II.OpInfo[i].isOptionalDef()) {
|
||||
// Optional def must be a physical register.
|
||||
unsigned NumResults = CountResults(Node);
|
||||
@ -296,7 +296,7 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
|
||||
if (II) {
|
||||
const TargetRegisterClass *DstRC = 0;
|
||||
if (IIOpNum < II->getNumOperands())
|
||||
DstRC = TRI->getAllocatableClass(TII->getRegClass(*II, IIOpNum, TRI));
|
||||
DstRC = TRI->getAllocatableClass(TII->getRegClass(*II,IIOpNum,TRI,*MF));
|
||||
assert((DstRC || (MI->isVariadic() && IIOpNum >= MCID.getNumOperands())) &&
|
||||
"Don't have operand info for this instruction!");
|
||||
if (DstRC && !MRI->constrainRegClass(VReg, DstRC, MinRCSize)) {
|
||||
|
@ -266,7 +266,8 @@ static void GetCostForDef(const ScheduleDAGSDNodes::RegDefIter &RegDefPos,
|
||||
const TargetLowering *TLI,
|
||||
const TargetInstrInfo *TII,
|
||||
const TargetRegisterInfo *TRI,
|
||||
unsigned &RegClass, unsigned &Cost) {
|
||||
unsigned &RegClass, unsigned &Cost,
|
||||
const MachineFunction &MF) {
|
||||
EVT VT = RegDefPos.GetValue();
|
||||
|
||||
// Special handling for untyped values. These values can only come from
|
||||
@ -285,7 +286,7 @@ static void GetCostForDef(const ScheduleDAGSDNodes::RegDefIter &RegDefPos,
|
||||
|
||||
unsigned Idx = RegDefPos.GetIdx();
|
||||
const MCInstrDesc Desc = TII->get(Opcode);
|
||||
const TargetRegisterClass *RC = TII->getRegClass(Desc, Idx, TRI);
|
||||
const TargetRegisterClass *RC = TII->getRegClass(Desc, Idx, TRI, MF);
|
||||
RegClass = RC->getID();
|
||||
// FIXME: Cost arbitrarily set to 1 because there doesn't seem to be a
|
||||
// better way to determine it.
|
||||
@ -1920,7 +1921,7 @@ bool RegReductionPQBase::HighRegPressure(const SUnit *SU) const {
|
||||
for (ScheduleDAGSDNodes::RegDefIter RegDefPos(PredSU, scheduleDAG);
|
||||
RegDefPos.IsValid(); RegDefPos.Advance()) {
|
||||
unsigned RCId, Cost;
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost, MF);
|
||||
|
||||
if ((RegPressure[RCId] + Cost) >= RegLimit[RCId])
|
||||
return true;
|
||||
@ -2034,7 +2035,7 @@ void RegReductionPQBase::scheduledNode(SUnit *SU) {
|
||||
continue;
|
||||
|
||||
unsigned RCId, Cost;
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost, MF);
|
||||
RegPressure[RCId] += Cost;
|
||||
break;
|
||||
}
|
||||
@ -2049,7 +2050,7 @@ void RegReductionPQBase::scheduledNode(SUnit *SU) {
|
||||
if (SkipRegDefs > 0)
|
||||
continue;
|
||||
unsigned RCId, Cost;
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost);
|
||||
GetCostForDef(RegDefPos, TLI, TII, TRI, RCId, Cost, MF);
|
||||
if (RegPressure[RCId] < Cost) {
|
||||
// Register pressure tracking is imprecise. This can happen. But we try
|
||||
// hard not to let it happen because it likely results in poor scheduling.
|
||||
|
@ -1300,7 +1300,7 @@ TryInstructionTransform(MachineBasicBlock::iterator &mi,
|
||||
DEBUG(dbgs() << "2addr: UNFOLDING: " << MI);
|
||||
const TargetRegisterClass *RC =
|
||||
TRI->getAllocatableClass(
|
||||
TII->getRegClass(UnfoldMCID, LoadRegIndex, TRI));
|
||||
TII->getRegClass(UnfoldMCID, LoadRegIndex, TRI, MF));
|
||||
unsigned Reg = MRI->createVirtualRegister(RC);
|
||||
SmallVector<MachineInstr *, 2> NewMIs;
|
||||
if (!TII->unfoldMemoryOperand(MF, &MI, Reg,
|
||||
|
@ -259,7 +259,8 @@ ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC)
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
ARMBaseRegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
ARMBaseRegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
return &ARM::GPRRegClass;
|
||||
}
|
||||
|
||||
@ -939,7 +940,8 @@ materializeFrameBaseRegister(MachineBasicBlock *MBB,
|
||||
|
||||
const MCInstrDesc &MCID = TII.get(ADDriOpc);
|
||||
MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
|
||||
MRI.constrainRegClass(BaseReg, TII.getRegClass(MCID, 0, this));
|
||||
const MachineFunction &MF = *MBB->getParent();
|
||||
MRI.constrainRegClass(BaseReg, TII.getRegClass(MCID, 0, this, MF));
|
||||
|
||||
MachineInstrBuilder MIB = AddDefaultPred(BuildMI(*MBB, Ins, DL, MCID, BaseReg)
|
||||
.addFrameIndex(FrameIdx).addImm(Offset));
|
||||
|
@ -109,7 +109,8 @@ public:
|
||||
SmallVectorImpl<unsigned> &SubIndices,
|
||||
unsigned &NewSubIdx) const;
|
||||
|
||||
const TargetRegisterClass *getPointerRegClass(unsigned Kind = 0) const;
|
||||
const TargetRegisterClass*
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
|
||||
const TargetRegisterClass*
|
||||
getCrossCopyRegClass(const TargetRegisterClass *RC) const;
|
||||
|
||||
|
@ -1737,7 +1737,7 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
||||
Ops.pop_back();
|
||||
|
||||
const MCInstrDesc &MCID = TII->get(NewOpc);
|
||||
const TargetRegisterClass *TRC = TII->getRegClass(MCID, 0, TRI);
|
||||
const TargetRegisterClass *TRC = TII->getRegClass(MCID, 0, TRI, *MF);
|
||||
MRI->constrainRegClass(EvenReg, TRC);
|
||||
MRI->constrainRegClass(OddReg, TRC);
|
||||
|
||||
|
@ -220,7 +220,9 @@ MLxExpansion::ExpandFPMLxInstruction(MachineBasicBlock &MBB, MachineInstr *MI,
|
||||
|
||||
const MCInstrDesc &MCID1 = TII->get(MulOpc);
|
||||
const MCInstrDesc &MCID2 = TII->get(AddSubOpc);
|
||||
unsigned TmpReg = MRI->createVirtualRegister(TII->getRegClass(MCID1, 0, TRI));
|
||||
const MachineFunction &MF = *MI->getParent()->getParent();
|
||||
unsigned TmpReg = MRI->createVirtualRegister(
|
||||
TII->getRegClass(MCID1, 0, TRI, MF));
|
||||
|
||||
MachineInstrBuilder MIB = BuildMI(MBB, MI, MI->getDebugLoc(), MCID1, TmpReg)
|
||||
.addReg(Src1Reg, getKillRegState(Src1Kill))
|
||||
|
@ -54,7 +54,8 @@ Thumb1RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC)
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
Thumb1RegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
Thumb1RegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
return &ARM::tGPRRegClass;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,8 @@ public:
|
||||
const TargetRegisterClass*
|
||||
getLargestLegalSuperClass(const TargetRegisterClass *RC) const;
|
||||
|
||||
const TargetRegisterClass *getPointerRegClass(unsigned Kind = 0) const;
|
||||
const TargetRegisterClass*
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
|
||||
|
||||
/// emitLoadConstPool - Emits a load from constpool to materialize the
|
||||
/// specified immediate.
|
||||
|
@ -193,7 +193,8 @@ SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget,
|
||||
/// getPointerRegClass - Return the register class to use to hold pointers.
|
||||
/// This is used for addressing modes.
|
||||
const TargetRegisterClass *
|
||||
SPURegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
SPURegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
return &SPU::R32CRegClass;
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,7 @@ namespace llvm {
|
||||
/// getPointerRegClass - Return the register class to use to hold pointers.
|
||||
/// This is used for addressing modes.
|
||||
virtual const TargetRegisterClass *
|
||||
getPointerRegClass(unsigned Kind = 0) const;
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
|
||||
|
||||
/// After allocating this many registers, the allocator should feel
|
||||
/// register pressure. The value is a somewhat random guess, based on the
|
||||
|
@ -1128,7 +1128,7 @@ SDNode *HexagonDAGToDAGISel::SelectIntrinsicWOChain(SDNode *N) {
|
||||
// For immediates, lower it.
|
||||
for (unsigned i = 1; i < N->getNumOperands(); ++i) {
|
||||
SDNode *Arg = N->getOperand(i).getNode();
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MCID, i, TRI);
|
||||
const TargetRegisterClass *RC = TII->getRegClass(MCID, i, TRI, *MF);
|
||||
|
||||
if (RC == &Hexagon::IntRegsRegClass ||
|
||||
RC == &Hexagon::DoubleRegsRegClass) {
|
||||
|
@ -2796,7 +2796,7 @@ bool HexagonPacketizerList::CanPromoteToNewValueStore( MachineInstr *MI,
|
||||
// first operand is always the result
|
||||
|
||||
const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
|
||||
const TargetRegisterClass* PacketRC = QII->getRegClass(MCID, 0, QRI);
|
||||
const TargetRegisterClass* PacketRC = QII->getRegClass(MCID, 0, QRI, MF);
|
||||
|
||||
// if there is already an store in the packet, no can do new value store
|
||||
// Arch Spec 3.4.4.2.
|
||||
|
@ -96,7 +96,8 @@ BitVector MSP430RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
MSP430RegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
MSP430RegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
return &MSP430::GR16RegClass;
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,8 @@ public:
|
||||
const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
|
||||
|
||||
BitVector getReservedRegs(const MachineFunction &MF) const;
|
||||
const TargetRegisterClass* getPointerRegClass(unsigned Kind = 0) const;
|
||||
const TargetRegisterClass*
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
|
||||
|
||||
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
|
@ -98,7 +98,8 @@ PPCRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
|
||||
/// getPointerRegClass - Return the register class to use to hold pointers.
|
||||
/// This is used for addressing modes.
|
||||
const TargetRegisterClass *
|
||||
PPCRegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
PPCRegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
if (Subtarget.isPPC64())
|
||||
return &PPC::G8RCRegClass;
|
||||
return &PPC::GPRCRegClass;
|
||||
|
@ -35,7 +35,8 @@ public:
|
||||
|
||||
/// getPointerRegClass - Return the register class to use to hold pointers.
|
||||
/// This is used for addressing modes.
|
||||
virtual const TargetRegisterClass *getPointerRegClass(unsigned Kind=0) const;
|
||||
virtual const TargetRegisterClass *
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const;
|
||||
|
||||
unsigned getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const;
|
||||
|
@ -28,13 +28,14 @@ TargetInstrInfo::~TargetInstrInfo() {
|
||||
|
||||
const TargetRegisterClass*
|
||||
TargetInstrInfo::getRegClass(const MCInstrDesc &MCID, unsigned OpNum,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
const TargetRegisterInfo *TRI,
|
||||
const MachineFunction &MF) const {
|
||||
if (OpNum >= MCID.getNumOperands())
|
||||
return 0;
|
||||
|
||||
short RegClass = MCID.OpInfo[OpNum].RegClass;
|
||||
if (MCID.OpInfo[OpNum].isLookupPtrRegClass())
|
||||
return TRI->getPointerRegClass(RegClass);
|
||||
return TRI->getPointerRegClass(MF, RegClass);
|
||||
|
||||
// Instructions like INSERT_SUBREG do not have fixed register classes.
|
||||
if (RegClass < 0)
|
||||
|
@ -2811,7 +2811,7 @@ X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
|
||||
return NULL;
|
||||
bool NarrowToMOV32rm = false;
|
||||
if (Size) {
|
||||
unsigned RCSize = getRegClass(MI->getDesc(), i, &RI)->getSize();
|
||||
unsigned RCSize = getRegClass(MI->getDesc(), i, &RI, MF)->getSize();
|
||||
if (Size < RCSize) {
|
||||
// Check if it's safe to fold the load. If the size of the object is
|
||||
// narrower than the load width, then it's not.
|
||||
@ -3204,7 +3204,7 @@ bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
|
||||
UnfoldStore &= FoldedStore;
|
||||
|
||||
const MCInstrDesc &MCID = get(Opc);
|
||||
const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI);
|
||||
const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI, MF);
|
||||
if (!MI->hasOneMemOperand() &&
|
||||
RC == &X86::VR128RegClass &&
|
||||
!TM.getSubtarget<X86Subtarget>().isUnalignedMemAccessFast())
|
||||
@ -3299,7 +3299,7 @@ bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
|
||||
|
||||
// Emit the store instruction.
|
||||
if (UnfoldStore) {
|
||||
const TargetRegisterClass *DstRC = getRegClass(MCID, 0, &RI);
|
||||
const TargetRegisterClass *DstRC = getRegClass(MCID, 0, &RI, MF);
|
||||
std::pair<MachineInstr::mmo_iterator,
|
||||
MachineInstr::mmo_iterator> MMOs =
|
||||
MF.extractStoreMemRefs(MI->memoperands_begin(),
|
||||
@ -3325,7 +3325,8 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
|
||||
bool FoldedLoad = I->second.second & TB_FOLDED_LOAD;
|
||||
bool FoldedStore = I->second.second & TB_FOLDED_STORE;
|
||||
const MCInstrDesc &MCID = get(Opc);
|
||||
const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI);
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const TargetRegisterClass *RC = getRegClass(MCID, Index, &RI, MF);
|
||||
unsigned NumDefs = MCID.NumDefs;
|
||||
std::vector<SDValue> AddrOps;
|
||||
std::vector<SDValue> BeforeOps;
|
||||
@ -3346,7 +3347,6 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
|
||||
|
||||
// Emit the load instruction.
|
||||
SDNode *Load = 0;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
if (FoldedLoad) {
|
||||
EVT VT = *RC->vt_begin();
|
||||
std::pair<MachineInstr::mmo_iterator,
|
||||
@ -3373,7 +3373,7 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
|
||||
std::vector<EVT> VTs;
|
||||
const TargetRegisterClass *DstRC = 0;
|
||||
if (MCID.getNumDefs() > 0) {
|
||||
DstRC = getRegClass(MCID, 0, &RI);
|
||||
DstRC = getRegClass(MCID, 0, &RI, MF);
|
||||
VTs.push_back(*DstRC->vt_begin());
|
||||
}
|
||||
for (unsigned i = 0, e = N->getNumValues(); i != e; ++i) {
|
||||
|
@ -181,7 +181,8 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC) const{
|
||||
}
|
||||
|
||||
const TargetRegisterClass *
|
||||
X86RegisterInfo::getPointerRegClass(unsigned Kind) const {
|
||||
X86RegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind)
|
||||
const {
|
||||
switch (Kind) {
|
||||
default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
|
||||
case 0: // Normal GPRs.
|
||||
|
@ -83,7 +83,8 @@ public:
|
||||
|
||||
/// getPointerRegClass - Returns a TargetRegisterClass used for pointer
|
||||
/// values.
|
||||
const TargetRegisterClass *getPointerRegClass(unsigned Kind = 0) const;
|
||||
const TargetRegisterClass *
|
||||
getPointerRegClass(const MachineFunction &MF, unsigned Kind = 0) const;
|
||||
|
||||
/// getCrossCopyRegClass - Returns a legal register class to copy a register
|
||||
/// in the specified class to or from. Returns NULL if it is possible to copy
|
||||
|
Loading…
x
Reference in New Issue
Block a user