Skip to content

Commit 532af14

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 ce9fb44 commit 532af14

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

+127
-114
lines changed

llvm/include/llvm/CodeGen/TargetInstrInfo.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,12 @@ struct ExtAddrMode {
113113
///
114114
class LLVM_ABI TargetInstrInfo : public MCInstrInfo {
115115
protected:
116-
TargetInstrInfo(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u,
117-
unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u)
118-
: CallFrameSetupOpcode(CFSetupOpcode),
116+
const TargetRegisterInfo &TRI;
117+
118+
TargetInstrInfo(const TargetRegisterInfo &TRI, unsigned CFSetupOpcode = ~0u,
119+
unsigned CFDestroyOpcode = ~0u, unsigned CatchRetOpcode = ~0u,
120+
unsigned ReturnOpcode = ~0u)
121+
: TRI(TRI), CallFrameSetupOpcode(CFSetupOpcode),
119122
CallFrameDestroyOpcode(CFDestroyOpcode), CatchRetOpcode(CatchRetOpcode),
120123
ReturnOpcode(ReturnOpcode) {}
121124

@@ -124,6 +127,8 @@ class LLVM_ABI TargetInstrInfo : public MCInstrInfo {
124127
TargetInstrInfo &operator=(const TargetInstrInfo &) = delete;
125128
virtual ~TargetInstrInfo();
126129

130+
const TargetRegisterInfo &getRegisterInfo() const { return TRI; }
131+
127132
static bool isGenericOpcode(unsigned Opc) {
128133
return Opc <= TargetOpcode::GENERIC_OP_END;
129134
}

llvm/lib/CodeGen/TargetInstrInfo.cpp

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,20 @@ 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

6767
short RegClass = MCID.operands()[OpNum].RegClass;
6868
if (MCID.operands()[OpNum].isLookupPtrRegClass())
69-
return TRI->getPointerRegClass(RegClass);
69+
return TRI.getPointerRegClass(RegClass);
7070

7171
// Instructions like INSERT_SUBREG do not have fixed register classes.
7272
if (RegClass < 0)
7373
return nullptr;
7474

7575
// Otherwise just look it up normally.
76-
return TRI->getRegClass(RegClass);
76+
return TRI.getRegClass(RegClass);
7777
}
7878

7979
/// insertNoop - Insert a noop into the instruction stream at the specified
@@ -220,13 +220,11 @@ MachineInstr *TargetInstrInfo::commuteInstructionImpl(MachineInstr &MI,
220220
// %1.sub = INST %1.sub(tied), %0.sub, implicit-def %1
221221
SmallVector<unsigned> UpdateImplicitDefIdx;
222222
if (HasDef && MI.hasImplicitDef()) {
223-
const TargetRegisterInfo *TRI =
224-
MI.getMF()->getSubtarget().getRegisterInfo();
225223
for (auto [OpNo, MO] : llvm::enumerate(MI.implicit_operands())) {
226224
Register ImplReg = MO.getReg();
227225
if ((ImplReg.isVirtual() && ImplReg == Reg0) ||
228226
(ImplReg.isPhysical() && Reg0.isPhysical() &&
229-
TRI->isSubRegisterEq(ImplReg, Reg0)))
227+
TRI.isSubRegisterEq(ImplReg, Reg0)))
230228
UpdateImplicitDefIdx.push_back(OpNo + MI.getNumExplicitOperands());
231229
}
232230
}
@@ -422,37 +420,35 @@ bool TargetInstrInfo::getStackSlotRange(const TargetRegisterClass *RC,
422420
unsigned SubIdx, unsigned &Size,
423421
unsigned &Offset,
424422
const MachineFunction &MF) const {
425-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
426423
if (!SubIdx) {
427-
Size = TRI->getSpillSize(*RC);
424+
Size = TRI.getSpillSize(*RC);
428425
Offset = 0;
429426
return true;
430427
}
431-
unsigned BitSize = TRI->getSubRegIdxSize(SubIdx);
428+
unsigned BitSize = TRI.getSubRegIdxSize(SubIdx);
432429
// Convert bit size to byte size.
433430
if (BitSize % 8)
434431
return false;
435432

436-
int BitOffset = TRI->getSubRegIdxOffset(SubIdx);
433+
int BitOffset = TRI.getSubRegIdxOffset(SubIdx);
437434
if (BitOffset < 0 || BitOffset % 8)
438435
return false;
439436

440437
Size = BitSize / 8;
441438
Offset = (unsigned)BitOffset / 8;
442439

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

445442
if (!MF.getDataLayout().isLittleEndian()) {
446-
Offset = TRI->getSpillSize(*RC) - (Offset + Size);
443+
Offset = TRI.getSpillSize(*RC) - (Offset + Size);
447444
}
448445
return true;
449446
}
450447

451-
void TargetInstrInfo::reMaterialize(MachineBasicBlock &MBB,
452-
MachineBasicBlock::iterator I,
453-
Register DestReg, unsigned SubIdx,
454-
const MachineInstr &Orig,
455-
const TargetRegisterInfo &TRI) const {
448+
void TargetInstrInfo::reMaterialize(
449+
MachineBasicBlock &MBB, MachineBasicBlock::iterator I, Register DestReg,
450+
unsigned SubIdx, const MachineInstr &Orig,
451+
const TargetRegisterInfo & /*Remove me*/) const {
456452
MachineInstr *MI = MBB.getParent()->CloneMachineInstr(&Orig);
457453
MI->substituteRegister(MI->getOperand(0).getReg(), DestReg, SubIdx, TRI);
458454
MBB.insert(I, MI);
@@ -723,7 +719,6 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
723719
// actual load size is.
724720
int64_t MemSize = 0;
725721
const MachineFrameInfo &MFI = MF.getFrameInfo();
726-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
727722

728723
if (Flags & MachineMemOperand::MOStore) {
729724
MemSize = MFI.getObjectSize(FI);
@@ -732,7 +727,7 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
732727
int64_t OpSize = MFI.getObjectSize(FI);
733728

734729
if (auto SubReg = MI.getOperand(OpIdx).getSubReg()) {
735-
unsigned SubRegSize = TRI->getSubRegIdxSize(SubReg);
730+
unsigned SubRegSize = TRI.getSubRegIdxSize(SubReg);
736731
if (SubRegSize > 0 && !(SubRegSize % 8))
737732
OpSize = SubRegSize / 8;
738733
}
@@ -797,11 +792,11 @@ MachineInstr *TargetInstrInfo::foldMemoryOperand(MachineInstr &MI,
797792
// code.
798793
BuildMI(*MBB, Pos, MI.getDebugLoc(), get(TargetOpcode::KILL)).add(MO);
799794
} else {
800-
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, TRI,
795+
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, &TRI,
801796
Register());
802797
}
803798
} else
804-
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, TRI, Register());
799+
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, &TRI, Register());
805800

806801
return &*--Pos;
807802
}
@@ -877,8 +872,8 @@ static void transferImplicitOperands(MachineInstr *MI,
877872
}
878873
}
879874

880-
void TargetInstrInfo::lowerCopy(MachineInstr *MI,
881-
const TargetRegisterInfo *TRI) const {
875+
void TargetInstrInfo::lowerCopy(
876+
MachineInstr *MI, const TargetRegisterInfo * /*Remove me*/) const {
882877
if (MI->allDefsAreDead()) {
883878
MI->setDesc(get(TargetOpcode::KILL));
884879
return;
@@ -908,7 +903,7 @@ void TargetInstrInfo::lowerCopy(MachineInstr *MI,
908903
SrcMO.getReg().isPhysical() ? SrcMO.isRenamable() : false);
909904

910905
if (MI->getNumOperands() > 2)
911-
transferImplicitOperands(MI, TRI);
906+
transferImplicitOperands(MI, &TRI);
912907
MI->eraseFromParent();
913908
}
914909

@@ -1324,8 +1319,7 @@ void TargetInstrInfo::reassociateOps(
13241319
MachineFunction *MF = Root.getMF();
13251320
MachineRegisterInfo &MRI = MF->getRegInfo();
13261321
const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
1327-
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
1328-
const TargetRegisterClass *RC = Root.getRegClassConstraint(0, TII, TRI);
1322+
const TargetRegisterClass *RC = Root.getRegClassConstraint(0, TII, &TRI);
13291323

13301324
MachineOperand &OpA = Prev.getOperand(OperandIndices[1]);
13311325
MachineOperand &OpB = Root.getOperand(OperandIndices[2]);
@@ -1707,8 +1701,7 @@ bool TargetInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
17071701
// stack slot reference to depend on the instruction that does the
17081702
// modification.
17091703
const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
1710-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
1711-
return MI.modifiesRegister(TLI.getStackPointerRegisterToSaveRestore(), TRI);
1704+
return MI.modifiesRegister(TLI.getStackPointerRegisterToSaveRestore(), &TRI);
17121705
}
17131706

17141707
// Provide a global flag for disabling the PreRA hazard recognizer that targets
@@ -1741,11 +1734,11 @@ CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II,
17411734
// Default implementation of getMemOperandWithOffset.
17421735
bool TargetInstrInfo::getMemOperandWithOffset(
17431736
const MachineInstr &MI, const MachineOperand *&BaseOp, int64_t &Offset,
1744-
bool &OffsetIsScalable, const TargetRegisterInfo *TRI) const {
1737+
bool &OffsetIsScalable, const TargetRegisterInfo * /*RemoveMe*/) const {
17451738
SmallVector<const MachineOperand *, 4> BaseOps;
17461739
LocationSize Width = LocationSize::precise(0);
17471740
if (!getMemOperandsWithOffsetWidth(MI, BaseOps, Offset, OffsetIsScalable,
1748-
Width, TRI) ||
1741+
Width, &TRI) ||
17491742
BaseOps.size() != 1)
17501743
return false;
17511744
BaseOp = BaseOps.front();
@@ -1866,7 +1859,6 @@ std::optional<ParamLoadedValue>
18661859
TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
18671860
Register Reg) const {
18681861
const MachineFunction *MF = MI.getMF();
1869-
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
18701862
DIExpression *Expr = DIExpression::get(MF->getFunction().getContext(), {});
18711863
int64_t Offset;
18721864
bool OffsetIsScalable;
@@ -1897,7 +1889,6 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
18971889
// Only describe memory which provably does not escape the function. As
18981890
// described in llvm.org/PR43343, escaped memory may be clobbered by the
18991891
// callee (or by another thread).
1900-
const auto &TII = MF->getSubtarget().getInstrInfo();
19011892
const MachineFrameInfo &MFI = MF->getFrameInfo();
19021893
const MachineMemOperand *MMO = MI.memoperands()[0];
19031894
const PseudoSourceValue *PSV = MMO->getPseudoValue();
@@ -1908,8 +1899,7 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI,
19081899
return std::nullopt;
19091900

19101901
const MachineOperand *BaseOp;
1911-
if (!TII->getMemOperandWithOffset(MI, BaseOp, Offset, OffsetIsScalable,
1912-
TRI))
1902+
if (!getMemOperandWithOffset(MI, BaseOp, Offset, OffsetIsScalable, &TRI))
19131903
return std::nullopt;
19141904

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

20532043
if (!MI.isInlineAsm())
20542044
return "";
@@ -2081,12 +2071,8 @@ std::string TargetInstrInfo::createMIROperandComment(
20812071
OS << F.getKindName();
20822072

20832073
unsigned RCID;
2084-
if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {
2085-
if (TRI) {
2086-
OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));
2087-
} else
2088-
OS << ":RC" << RCID;
2089-
}
2074+
if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID))
2075+
OS << ':' << TRI.getRegClassName(TRI.getRegClass(RCID));
20902076

20912077
if (F.isMemKind()) {
20922078
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
@@ -62,7 +62,8 @@ static cl::opt<bool> Fix16BitCopies(
6262
cl::ReallyHidden);
6363

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

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)