Skip to content

Commit 37b57b5

Browse files
committed
CodeGen: Keep reference to TargetRegisterInfo in TargetInstrInfo
Both conceptually belong to the same subtarget, so it should not be necessary to pass in the context TargetRegisterInfo to any TargetInstrInfo member. Add this reference so those superfluous arguments can be removed. Most targets placed their TargetRegisterInfo as a member in TargetInstrInfo. A few had this owned by the TargetSubtargetInfo, so unify all targets to look the same.
1 parent 81ad8fb commit 37b57b5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+126
-113
lines changed

llvm/include/llvm/CodeGen/TargetInstrInfo.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,18 @@ struct ExtAddrMode {
113113
///
114114
class LLVM_ABI TargetInstrInfo : public MCInstrInfo {
115115
protected:
116+
const TargetRegisterInfo &TRI;
117+
116118
/// Subtarget specific sub-array of MCInstrInfo's RegClassByHwModeTables
117119
/// (i.e. the table for the active HwMode). This should be indexed by
118120
/// MCOperandInfo's RegClass field for LookupRegClassByHwMode operands.
119121
const int16_t *const RegClassByHwMode;
120122

121-
TargetInstrInfo(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u,
122-
unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u,
123+
TargetInstrInfo(const TargetRegisterInfo &TRI, unsigned CFSetupOpcode = ~0u,
124+
unsigned CFDestroyOpcode = ~0u, unsigned CatchRetOpcode = ~0u,
125+
unsigned ReturnOpcode = ~0u,
123126
const int16_t *const RegClassByHwModeTable = nullptr)
124-
: RegClassByHwMode(RegClassByHwModeTable),
127+
: TRI(TRI), RegClassByHwMode(RegClassByHwModeTable),
125128
CallFrameSetupOpcode(CFSetupOpcode),
126129
CallFrameDestroyOpcode(CFDestroyOpcode), CatchRetOpcode(CatchRetOpcode),
127130
ReturnOpcode(ReturnOpcode) {}
@@ -131,6 +134,8 @@ class LLVM_ABI TargetInstrInfo : public MCInstrInfo {
131134
TargetInstrInfo &operator=(const TargetInstrInfo &) = delete;
132135
virtual ~TargetInstrInfo();
133136

137+
const TargetRegisterInfo &getRegisterInfo() const { return TRI; }
138+
134139
static bool isGenericOpcode(unsigned Opc) {
135140
return Opc <= TargetOpcode::GENERIC_OP_END;
136141
}

llvm/lib/CodeGen/TargetInstrInfo.cpp

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ TargetInstrInfo::~TargetInstrInfo() = default;
6060

6161
const TargetRegisterClass *
6262
TargetInstrInfo::getRegClass(const MCInstrDesc &MCID, unsigned OpNum,
63-
const TargetRegisterInfo *TRI) const {
63+
const TargetRegisterInfo * /*RemoveMe*/) const {
6464
if (OpNum >= MCID.getNumOperands())
6565
return nullptr;
6666

@@ -69,14 +69,14 @@ TargetInstrInfo::getRegClass(const MCInstrDesc &MCID, unsigned OpNum,
6969

7070
// TODO: Remove isLookupPtrRegClass in favor of isLookupRegClassByHwMode
7171
if (OpInfo.isLookupPtrRegClass())
72-
return TRI->getPointerRegClass(RegClass);
72+
return TRI.getPointerRegClass(RegClass);
7373

7474
// Instructions like INSERT_SUBREG do not have fixed register classes.
7575
if (RegClass < 0)
7676
return nullptr;
7777

7878
// Otherwise just look it up normally.
79-
return TRI->getRegClass(RegClass);
79+
return TRI.getRegClass(RegClass);
8080
}
8181

8282
/// insertNoop - Insert a noop into the instruction stream at the specified
@@ -223,13 +223,11 @@ MachineInstr *TargetInstrInfo::commuteInstructionImpl(MachineInstr &MI,
223223
// %1.sub = INST %1.sub(tied), %0.sub, implicit-def %1
224224
SmallVector<unsigned> UpdateImplicitDefIdx;
225225
if (HasDef && MI.hasImplicitDef()) {
226-
const TargetRegisterInfo *TRI =
227-
MI.getMF()->getSubtarget().getRegisterInfo();
228226
for (auto [OpNo, MO] : llvm::enumerate(MI.implicit_operands())) {
229227
Register ImplReg = MO.getReg();
230228
if ((ImplReg.isVirtual() && ImplReg == Reg0) ||
231229
(ImplReg.isPhysical() && Reg0.isPhysical() &&
232-
TRI->isSubRegisterEq(ImplReg, Reg0)))
230+
TRI.isSubRegisterEq(ImplReg, Reg0)))
233231
UpdateImplicitDefIdx.push_back(OpNo + MI.getNumExplicitOperands());
234232
}
235233
}
@@ -425,37 +423,35 @@ bool TargetInstrInfo::getStackSlotRange(const TargetRegisterClass *RC,
425423
unsigned SubIdx, unsigned &Size,
426424
unsigned &Offset,
427425
const MachineFunction &MF) const {
428-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
429426
if (!SubIdx) {
430-
Size = TRI->getSpillSize(*RC);
427+
Size = TRI.getSpillSize(*RC);
431428
Offset = 0;
432429
return true;
433430
}
434-
unsigned BitSize = TRI->getSubRegIdxSize(SubIdx);
431+
unsigned BitSize = TRI.getSubRegIdxSize(SubIdx);
435432
// Convert bit size to byte size.
436433
if (BitSize % 8)
437434
return false;
438435

439-
int BitOffset = TRI->getSubRegIdxOffset(SubIdx);
436+
int BitOffset = TRI.getSubRegIdxOffset(SubIdx);
440437
if (BitOffset < 0 || BitOffset % 8)
441438
return false;
442439

443440
Size = BitSize / 8;
444441
Offset = (unsigned)BitOffset / 8;
445442

446-
assert(TRI->getSpillSize(*RC) >= (Offset + Size) && "bad subregister range");
443+
assert(TRI.getSpillSize(*RC) >= (Offset + Size) && "bad subregister range");
447444

448445
if (!MF.getDataLayout().isLittleEndian()) {
449-
Offset = TRI->getSpillSize(*RC) - (Offset + Size);
446+
Offset = TRI.getSpillSize(*RC) - (Offset + Size);
450447
}
451448
return true;
452449
}
453450

454-
void TargetInstrInfo::reMaterialize(MachineBasicBlock &MBB,
455-
MachineBasicBlock::iterator I,
456-
Register DestReg, unsigned SubIdx,
457-
const MachineInstr &Orig,
458-
const TargetRegisterInfo &TRI) const {
451+
void TargetInstrInfo::reMaterialize(
452+
MachineBasicBlock &MBB, MachineBasicBlock::iterator I, Register DestReg,
453+
unsigned SubIdx, const MachineInstr &Orig,
454+
const TargetRegisterInfo & /*Remove me*/) const {
459455
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(&Orig);
460456
MI->substituteRegister(MI->getOperand(0).getReg(), DestReg, SubIdx, TRI);
461457
MBB.insert(I, MI);
@@ -726,7 +722,6 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
726722
// actual load size is.
727723
int64_t MemSize = 0;
728724
const MachineFrameInfo &MFI = MF.getFrameInfo();
729-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
730725

731726
if (Flags & MachineMemOperand::MOStore) {
732727
MemSize = MFI.getObjectSize(FI);
@@ -735,7 +730,7 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
735730
int64_t OpSize = MFI.getObjectSize(FI);
736731

737732
if (auto SubReg = MI.getOperand(OpIdx).getSubReg()) {
738-
unsigned SubRegSize = TRI->getSubRegIdxSize(SubReg);
733+
unsigned SubRegSize = TRI.getSubRegIdxSize(SubReg);
739734
if (SubRegSize > 0 && !(SubRegSize % 8))
740735
OpSize = SubRegSize / 8;
741736
}
@@ -800,11 +795,11 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
800795
// code.
801796
BuildMI(*MBB, Pos, MI.getDebugLoc(), get(TargetOpcode::KILL)).add(MO);
802797
} else {
803-
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, TRI,
798+
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, &TRI,
804799
Register());
805800
}
806801
} else
807-
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, TRI, Register());
802+
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, &TRI, Register());
808803

809804
return &*--Pos;
810805
}
@@ -880,8 +875,8 @@ static void transferImplicitOperands(MachineInstr *MI,
880875
}
881876
}
882877

883-
void TargetInstrInfo::lowerCopy(MachineInstr *MI,
884-
const TargetRegisterInfo *TRI) const {
878+
void TargetInstrInfo::lowerCopy(
879+
MachineInstr *MI, const TargetRegisterInfo * /*Remove me*/) const {
885880
if (MI->allDefsAreDead()) {
886881
MI->setDesc(get(TargetOpcode::KILL));
887882
return;
@@ -911,7 +906,7 @@ void TargetInstrInfo::lowerCopy(MachineInstr *MI,
911906
SrcMO.getReg().isPhysical() ? SrcMO.isRenamable() : false);
912907

913908
if (MI->getNumOperands() > 2)
914-
transferImplicitOperands(MI, TRI);
909+
transferImplicitOperands(MI, &TRI);
915910
MI->eraseFromParent();
916911
}
917912

@@ -1327,8 +1322,7 @@ void TargetInstrInfo::reassociateOps(
13271322
MachineFunction *MF = Root.getMF();
13281323
MachineRegisterInfo &MRI = MF->getRegInfo();
13291324
const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
1330-
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
1331-
const TargetRegisterClass *RC = Root.getRegClassConstraint(0, TII, TRI);
1325+
const TargetRegisterClass *RC = Root.getRegClassConstraint(0, TII, &TRI);
13321326

13331327
MachineOperand &OpA = Prev.getOperand(OperandIndices[1]);
13341328
MachineOperand &OpB = Root.getOperand(OperandIndices[2]);
@@ -1704,8 +1698,7 @@ bool TargetInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
17041698
// stack slot reference to depend on the instruction that does the
17051699
// modification.
17061700
const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
1707-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
1708-
return MI.modifiesRegister(TLI.getStackPointerRegisterToSaveRestore(), TRI);
1701+
return MI.modifiesRegister(TLI.getStackPointerRegisterToSaveRestore(), &TRI);
17091702
}
17101703

17111704
// Provide a global flag for disabling the PreRA hazard recognizer that targets
@@ -1738,11 +1731,11 @@ CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II,
17381731
// Default implementation of getMemOperandWithOffset.
17391732
bool TargetInstrInfo::getMemOperandWithOffset(
17401733
const MachineInstr &MI, const MachineOperand *&BaseOp, int64_t &Offset,
1741-
bool &OffsetIsScalable, const TargetRegisterInfo *TRI) const {
1734+
bool &OffsetIsScalable, const TargetRegisterInfo * /*RemoveMe*/) const {
17421735
SmallVector<const MachineOperand *, 4> BaseOps;
17431736
LocationSize Width = LocationSize::precise(0);
17441737
if (!getMemOperandsWithOffsetWidth(MI, BaseOps, Offset, OffsetIsScalable,
1745-
Width, TRI) ||
1738+
Width, &TRI) ||
17461739
BaseOps.size() != 1)
17471740
return false;
17481741
BaseOp = BaseOps.front();
@@ -1863,7 +1856,6 @@ std::optional<ParamLoadedValue>
18631856
TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
18641857
Register Reg) const {
18651858
const MachineFunction *MF = MI.getMF();
1866-
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
18671859
DIExpression *Expr = DIExpression::get(MF->getFunction().getContext(), {});
18681860
int64_t Offset;
18691861
bool OffsetIsScalable;
@@ -1894,7 +1886,6 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
18941886
// Only describe memory which provably does not escape the function. As
18951887
// described in llvm.org/PR43343, escaped memory may be clobbered by the
18961888
// callee (or by another thread).
1897-
const auto &TII = MF->getSubtarget().getInstrInfo();
18981889
const MachineFrameInfo &MFI = MF->getFrameInfo();
18991890
const MachineMemOperand *MMO = MI.memoperands()[0];
19001891
const PseudoSourceValue *PSV = MMO->getPseudoValue();
@@ -1905,8 +1896,7 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
19051896
return std::nullopt;
19061897

19071898
const MachineOperand *BaseOp;
1908-
if (!TII->getMemOperandWithOffset(MI, BaseOp, Offset, OffsetIsScalable,
1909-
TRI))
1899+
if (!getMemOperandWithOffset(MI, BaseOp, Offset, OffsetIsScalable, &TRI))
19101900
return std::nullopt;
19111901

19121902
// FIXME: Scalable offsets are not yet handled in the offset code below.
@@ -2045,7 +2035,7 @@ bool TargetInstrInfo::getInsertSubregInputs(
20452035
// Returns a MIRPrinter comment for this machine operand.
20462036
std::string TargetInstrInfo::createMIROperandComment(
20472037
const MachineInstr &MI, const MachineOperand &Op, unsigned OpIdx,
2048-
const TargetRegisterInfo *TRI) const {
2038+
const TargetRegisterInfo * /*RemoveMe*/) const {
20492039

20502040
if (!MI.isInlineAsm())
20512041
return "";
@@ -2078,12 +2068,8 @@ std::string TargetInstrInfo::createMIROperandComment(
20782068
OS << F.getKindName();
20792069

20802070
unsigned RCID;
2081-
if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {
2082-
if (TRI) {
2083-
OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));
2084-
} else
2085-
OS << ":RC" << RCID;
2086-
}
2071+
if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID))
2072+
OS << ':' << TRI.getRegClassName(TRI.getRegClass(RCID));
20872073

20882074
if (F.isMemKind()) {
20892075
InlineAsm::ConstraintCode MCID = F.getMemoryConstraintID();

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static cl::opt<unsigned> GatherOptSearchLimit(
9191
"machine-combiner gather pattern optimization"));
9292

9393
AArch64InstrInfo::AArch64InstrInfo(const AArch64Subtarget &STI)
94-
: AArch64GenInstrInfo(STI, AArch64::ADJCALLSTACKDOWN,
94+
: AArch64GenInstrInfo(STI, RI, AArch64::ADJCALLSTACKDOWN,
9595
AArch64::ADJCALLSTACKUP, AArch64::CATCHRET),
9696
RI(STI.getTargetTriple(), STI.getHwMode()), Subtarget(STI) {}
9797

llvm/lib/Target/AMDGPU/R600InstrInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ using namespace llvm;
2929
#include "R600GenInstrInfo.inc"
3030

3131
R600InstrInfo::R600InstrInfo(const R600Subtarget &ST)
32-
: R600GenInstrInfo(ST, -1, -1), RI(), ST(ST) {}
32+
: R600GenInstrInfo(ST, RI, -1, -1), RI(), ST(ST) {}
3333

3434
bool R600InstrInfo::isVector(const MachineInstr &MI) const {
3535
return get(MI.getOpcode()).TSFlags & R600_InstFlag::VECTOR;

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ static cl::opt<bool> Fix16BitCopies(
6363
cl::ReallyHidden);
6464

6565
SIInstrInfo::SIInstrInfo(const GCNSubtarget &ST)
66-
: AMDGPUGenInstrInfo(ST, AMDGPU::ADJCALLSTACKUP, AMDGPU::ADJCALLSTACKDOWN),
66+
: AMDGPUGenInstrInfo(ST, RI, AMDGPU::ADJCALLSTACKUP,
67+
AMDGPU::ADJCALLSTACKDOWN),
6768
RI(ST), ST(ST) {
6869
SchedModel.init(&ST);
6970
}

llvm/lib/Target/ARC/ARCInstrInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ enum TSFlagsConstants {
4444
void ARCInstrInfo::anchor() {}
4545

4646
ARCInstrInfo::ARCInstrInfo(const ARCSubtarget &ST)
47-
: ARCGenInstrInfo(ST, ARC::ADJCALLSTACKDOWN, ARC::ADJCALLSTACKUP), RI(ST) {}
47+
: ARCGenInstrInfo(ST, RI, ARC::ADJCALLSTACKDOWN, ARC::ADJCALLSTACKUP),
48+
RI(ST) {}
4849

4950
static bool isZeroImm(const MachineOperand &Op) {
5051
return Op.isImm() && Op.getImm() == 0;

llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ static const ARM_MLxEntry ARM_MLxTable[] = {
107107
{ ARM::VMLSslfq, ARM::VMULslfq, ARM::VSUBfq, false, true },
108108
};
109109

110-
ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget &STI)
111-
: ARMGenInstrInfo(STI, ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
110+
ARMBaseInstrInfo::ARMBaseInstrInfo(const ARMSubtarget &STI,
111+
const ARMBaseRegisterInfo &TRI)
112+
: ARMGenInstrInfo(STI, TRI, ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
112113
Subtarget(STI) {
113114
for (unsigned i = 0, e = std::size(ARM_MLxTable); i != e; ++i) {
114115
if (!MLxEntryMap.insert(std::make_pair(ARM_MLxTable[i].MLxOpc, i)).second)

llvm/lib/Target/ARM/ARMBaseInstrInfo.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ class ARMBaseInstrInfo : public ARMGenInstrInfo {
4444

4545
protected:
4646
// Can be only subclassed.
47-
explicit ARMBaseInstrInfo(const ARMSubtarget &STI);
47+
explicit ARMBaseInstrInfo(const ARMSubtarget &STI,
48+
const ARMBaseRegisterInfo &TRI);
4849

4950
void expandLoadStackGuardBase(MachineBasicBlock::iterator MI,
5051
unsigned LoadImmOpc, unsigned LoadOpc) const;
@@ -125,7 +126,11 @@ class ARMBaseInstrInfo : public ARMGenInstrInfo {
125126
// if there is not such an opcode.
126127
virtual unsigned getUnindexedOpcode(unsigned Opc) const = 0;
127128

128-
virtual const ARMBaseRegisterInfo &getRegisterInfo() const = 0;
129+
const ARMBaseRegisterInfo &getRegisterInfo() const {
130+
return static_cast<const ARMBaseRegisterInfo &>(
131+
TargetInstrInfo::getRegisterInfo());
132+
}
133+
129134
const ARMSubtarget &getSubtarget() const { return Subtarget; }
130135

131136
ScheduleHazardRecognizer *

llvm/lib/Target/ARM/ARMInstrInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
#include "llvm/MC/MCInst.h"
2626
using namespace llvm;
2727

28-
ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI) : ARMBaseInstrInfo(STI) {}
28+
ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI)
29+
: ARMBaseInstrInfo(STI, RI) {}
2930

3031
/// Return the noop instruction to use for a noop.
3132
MCInst ARMInstrInfo::getNop() const {

llvm/lib/Target/ARM/ARMInstrInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ARMInstrInfo : public ARMBaseInstrInfo {
3535
/// such, whenever a client has an instance of instruction info, it should
3636
/// always be able to get register info as well (through this method).
3737
///
38-
const ARMRegisterInfo &getRegisterInfo() const override { return RI; }
38+
const ARMRegisterInfo &getRegisterInfo() const { return RI; }
3939

4040
private:
4141
void expandLoadStackGuard(MachineBasicBlock::iterator MI) const override;

0 commit comments

Comments
 (0)