LLVM 24.0.0git
HexagonRegisterInfo.cpp
Go to the documentation of this file.
1//===-- HexagonRegisterInfo.cpp - Hexagon Register Information ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the Hexagon implementation of the TargetRegisterInfo
10// class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "HexagonRegisterInfo.h"
17#include "HexagonSubtarget.h"
18#include "llvm/ADT/BitVector.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SmallSet.h"
30#include "llvm/IR/Function.h"
31#include "llvm/IR/Type.h"
33#include "llvm/Support/Debug.h"
37
38#define GET_REGINFO_TARGET_DESC
39#include "HexagonGenRegisterInfo.inc"
40
41using namespace llvm;
42
44 "hexagon-frame-index-search-range", cl::init(32), cl::Hidden,
45 cl::desc("Limit on instruction search range in frame index elimination"));
46
48 "hexagon-frame-index-reuse-limit", cl::init(~0), cl::Hidden,
49 cl::desc("Limit on the number of reused registers in frame index "
50 "elimination"));
51
53 : HexagonGenRegisterInfo(Hexagon::R31, 0/*DwarfFlavor*/, 0/*EHFlavor*/,
54 0/*PC*/, HwMode) {}
55
57 switch (Reg) {
58 case Hexagon::R29:
59 case Hexagon::R30:
60 case Hexagon::R31:
61 return true;
62 }
63 return false;
64}
65
67 // VF0-VF31 are fake registers used as sub-registers in HVX vector pairs
68 if (Reg >= Hexagon::VF0 && Reg <= Hexagon::VF31)
69 return true;
70 // VFR0-VFR31 are fake registers used for reversed vector pairs
71 if (Reg >= Hexagon::VFR0 && Reg <= Hexagon::VFR31)
72 return true;
73 return false;
74}
75
77 return R == Hexagon::R0 || R == Hexagon::R1 || R == Hexagon::R2 ||
78 R == Hexagon::R3 || R == Hexagon::D0 || R == Hexagon::D1;
79}
80
81const MCPhysReg *
83 const TargetRegisterClass *RC) const {
84 using namespace Hexagon;
85
86 static const MCPhysReg Int32[] = {
87 R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, 0
88 };
89 static const MCPhysReg Int64[] = {
90 D0, D1, D2, D3, D4, D5, D6, D7, 0
91 };
92 static const MCPhysReg Pred[] = {
93 P0, P1, P2, P3, 0
94 };
95 static const MCPhysReg VecSgl[] = {
96 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13,
97 V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27,
98 V28, V29, V30, V31, 0
99 };
100 static const MCPhysReg VecDbl[] = {
101 W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14, W15, 0
102 };
103 static const MCPhysReg VecPred[] = {
104 Q0, Q1, Q2, Q3, 0
105 };
106
107 switch (RC->getID()) {
108 case IntRegsRegClassID:
109 return Int32;
110 case DoubleRegsRegClassID:
111 return Int64;
112 case PredRegsRegClassID:
113 return Pred;
114 case HvxVRRegClassID:
115 return VecSgl;
116 case HvxWRRegClassID:
117 return VecDbl;
118 case HvxQRRegClassID:
119 return VecPred;
120 default:
121 break;
122 }
123
124 static const MCPhysReg Empty[] = { 0 };
125#ifndef NDEBUG
126 dbgs() << "Register class: " << getRegClassName(RC) << "\n";
127#endif
128 llvm_unreachable("Unexpected register class");
129 return Empty;
130}
131
132// Returns true if MF takes HLX arguments or returns an HLX type.
133static bool hasHLXSignature(const MachineFunction &MF) {
134 const auto &HST = MF.getSubtarget<HexagonSubtarget>();
135 const Function &F = MF.getFunction();
136 return HST.isTypeForHLX(F.getReturnType()) ||
137 any_of(F.args(), [&HST](const Argument &A) {
138 return HST.isTypeForHLX(A.getType());
139 });
140}
141
142const MCPhysReg *
144 static const MCPhysReg CalleeSavedRegsV3[] = {
145 Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19,
146 Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23,
147 Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0
148 };
149
150 // Functions that contain a call to __builtin_eh_return also save the first 4
151 // parameter registers.
152 static const MCPhysReg CalleeSavedRegsV3EHReturn[] = {
153 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3,
154 Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19,
155 Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23,
156 Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0
157 };
158
159 bool HasEHReturn = MF->getInfo<HexagonMachineFunctionInfo>()->hasEHReturn();
160
161 if (hasHLXSignature(*MF))
162 return HasEHReturn ? HexagonCSR_HLX_EH_SaveList : HexagonCSR_HLX_SaveList;
163 return HasEHReturn ? CalleeSavedRegsV3EHReturn : CalleeSavedRegsV3;
164}
165
167 const MachineFunction &MF, CallingConv::ID) const {
168 return HexagonCSR_RegMask;
169}
170
172 return HexagonCSR_HLX_RegMask;
173}
174
177 BitVector Reserved = getBaseReservedRegs(MF);
179 Reserved.set(AP);
180 markSuperRegs(Reserved, AP);
181 }
182 return Reserved;
183}
184
186 const MachineFunction &MF) const {
187 return computeStackAlignBaseRegister(MF, getBaseReservedRegs(MF));
188}
189
191 const MachineFunction &MF, const BitVector &BaseReservedRegs) const {
192 auto &HFI = *MF.getSubtarget<HexagonSubtarget>().getFrameLowering();
193 if (!HFI.needsAligna(MF))
194 return Register();
195
196 // Reserve the first non-volatile register.
197 Register AP;
198 for (const MCPhysReg *R = getCalleeSavedRegs(&MF); *R; ++R) {
199 if (BaseReservedRegs[*R])
200 continue;
201 AP = *R;
202 break;
203 }
204 assert(AP.isValid() && "Couldn't reserve stack align register");
205 return AP;
206}
207
209HexagonRegisterInfo::getBaseReservedRegs(const MachineFunction &MF) const {
210 BitVector Reserved(getNumRegs());
211 Reserved.set(Hexagon::R29);
212 Reserved.set(Hexagon::R30);
213 Reserved.set(Hexagon::R31);
214 Reserved.set(Hexagon::VTMP);
215
216 // Guest registers.
217 Reserved.set(Hexagon::GELR); // G0
218 Reserved.set(Hexagon::GSR); // G1
219 Reserved.set(Hexagon::GOSP); // G2
220 Reserved.set(Hexagon::G3); // G3
221
222 // Control registers.
223 Reserved.set(Hexagon::SA0); // C0
224 Reserved.set(Hexagon::LC0); // C1
225 Reserved.set(Hexagon::SA1); // C2
226 Reserved.set(Hexagon::LC1); // C3
227 Reserved.set(Hexagon::P3_0); // C4
228 Reserved.set(Hexagon::USR); // C8
229 Reserved.set(Hexagon::PC); // C9
230 Reserved.set(Hexagon::UGP); // C10
231 Reserved.set(Hexagon::GP); // C11
232 Reserved.set(Hexagon::UPCYCLELO); // C14
233 Reserved.set(Hexagon::UPCYCLEHI); // C15
234 Reserved.set(Hexagon::FRAMELIMIT); // C16
235 Reserved.set(Hexagon::FRAMEKEY); // C17
236 Reserved.set(Hexagon::PKTCOUNTLO); // C18
237 Reserved.set(Hexagon::PKTCOUNTHI); // C19
238 Reserved.set(Hexagon::VFRAMELIMIT); // C28
239 Reserved.set(Hexagon::VSP); // C29
240 Reserved.set(Hexagon::UTIMERLO); // C30
241 Reserved.set(Hexagon::UTIMERHI); // C31
242 // Out of the control registers, only C8 is explicitly defined in
243 // HexagonRegisterInfo.td. If others are defined, make sure to add
244 // them here as well.
245 Reserved.set(Hexagon::C8);
246 Reserved.set(Hexagon::USR_OVF);
247
248 // Leveraging these registers will require more work to recognize
249 // the new semantics posed, Hi/LoVec patterns, etc.
250 // Note well: if enabled, they should be restricted to only
251 // where `HST.useHVXOps() && HST.hasV67Ops()` is true.
252 for (auto Reg : Hexagon_MC::GetVectRegRev())
253 Reserved.set(Reg);
254
255 static const MCPhysReg RRegs[] = {
256 Hexagon::R6, Hexagon::R7, Hexagon::R8, Hexagon::R9, Hexagon::R10,
257 Hexagon::R11, Hexagon::R12, Hexagon::R13, Hexagon::R14, Hexagon::R15,
258 Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19, Hexagon::R20,
259 Hexagon::R21, Hexagon::R22, Hexagon::R23, Hexagon::R24, Hexagon::R25,
260 Hexagon::R26, Hexagon::R27, Hexagon::R28};
261 for (MCPhysReg Reg : RRegs)
263 Reserved.set(Reg);
264
265 for (int x = Reserved.find_first(); x >= 0; x = Reserved.find_next(x))
266 markSuperRegs(Reserved, x);
267
268 return Reserved;
269}
270
272 int SPAdj, unsigned FIOp,
273 RegScavenger *RS) const {
274 static unsigned ReuseCount = 0;
275 //
276 // Hexagon_TODO: Do we need to enforce this for Hexagon?
277 assert(SPAdj == 0 && "Unexpected");
278
279 MachineInstr &MI = *II;
280 MachineBasicBlock &MB = *MI.getParent();
281 MachineFunction &MF = *MB.getParent();
282 auto &HST = MF.getSubtarget<HexagonSubtarget>();
283 auto &HII = *HST.getInstrInfo();
284 auto &HFI = *HST.getFrameLowering();
285
286 Register BP;
287 int FI = MI.getOperand(FIOp).getIndex();
288 // Select the base pointer (BP) and calculate the actual offset from BP
289 // to the beginning of the object at index FI.
290 int Offset = HFI.getFrameIndexReference(MF, FI, BP).getFixed();
291 // Add the offset from the instruction.
292 int RealOffset = Offset + MI.getOperand(FIOp+1).getImm();
293
294 if (BP == Hexagon::VSP) {
295 auto &MRI = MF.getRegInfo();
296 Register VSPCopy = MRI.createVirtualRegister(&Hexagon::IntRegsRegClass);
297 BuildMI(MB, II, MI.getDebugLoc(), HII.get(Hexagon::A2_tfrcrr), VSPCopy)
298 .addReg(BP);
299 BP = VSPCopy;
300 }
301
302 unsigned Opc = MI.getOpcode();
303 switch (Opc) {
304 case Hexagon::PS_fia:
305 MI.setDesc(HII.get(Hexagon::A2_addi));
306 MI.getOperand(FIOp).ChangeToImmediate(RealOffset);
307 MI.removeOperand(FIOp+1);
308 return false;
309 case Hexagon::PS_fi:
310 // Set up the instruction for updating below.
311 MI.setDesc(HII.get(Hexagon::A2_addi));
312 break;
313 }
314
315 if (!HII.isValidOffset(Opc, RealOffset)) {
316 // If the offset is not valid, calculate the address in a temporary
317 // register and use it with offset 0.
318 int InstOffset = 0;
319 // The actual base register (BP) is typically shared between many
320 // instructions where frame indices are being replaced. In scalar
321 // instructions the offset range is large, and the need for an extra
322 // add instruction is infrequent. Vector loads/stores, however, have
323 // a much smaller offset range: [-8, 7), or #s4. In those cases it
324 // makes sense to "standardize" the immediate in the "addi" instruction
325 // so that multiple loads/stores could be based on it.
326 bool IsPair = false;
327 switch (MI.getOpcode()) {
328 // All of these instructions have the same format: base+#s4.
329 case Hexagon::PS_vloadrw_ai:
330 case Hexagon::PS_vloadrw_nt_ai:
331 case Hexagon::PS_vstorerw_ai:
332 case Hexagon::PS_vstorerw_nt_ai:
333 IsPair = true;
334 [[fallthrough]];
335 case Hexagon::PS_vloadrv_ai:
336 case Hexagon::PS_vloadrv_nt_ai:
337 case Hexagon::PS_vstorerv_ai:
338 case Hexagon::PS_vstorerv_nt_ai:
339 case Hexagon::V6_vL32b_ai:
340 case Hexagon::V6_vS32b_ai: {
341 unsigned HwLen = HST.getVectorLength();
342 if (RealOffset % HwLen == 0) {
343 int VecOffset = RealOffset / HwLen;
344 // Rewrite the offset as "base + [-8, 7)".
345 VecOffset += 8;
346 // Pairs are expanded into two instructions: make sure that both
347 // can use the same base (i.e. VecOffset+1 is not a different
348 // multiple of 16 than VecOffset).
349 if (!IsPair || (VecOffset + 1) % 16 != 0) {
350 RealOffset = (VecOffset & -16) * HwLen;
351 InstOffset = (VecOffset % 16 - 8) * HwLen;
352 }
353 }
354 }
355 }
356
357 // Search backwards in the block for "Reg = A2_addi BP, RealOffset".
358 // This will give us a chance to avoid creating a new register.
359 Register ReuseBP;
360
361 if (ReuseCount < FrameIndexReuseLimit) {
362 unsigned SearchCount = 0, SearchRange = FrameIndexSearchRange;
363 SmallSet<Register,2> SeenVRegs;
364 bool PassedCall = false;
365 LiveRegUnits Defs(*this), Uses(*this);
366
367 for (auto I = std::next(II.getReverse()), E = MB.rend(); I != E; ++I) {
368 if (SearchCount == SearchRange)
369 break;
370 ++SearchCount;
371 const MachineInstr &BI = *I;
373 PassedCall |= BI.isCall();
374 for (const MachineOperand &Op : BI.operands()) {
375 if (SeenVRegs.size() > 1)
376 break;
377 if (Op.isReg() && Op.getReg().isVirtual())
378 SeenVRegs.insert(Op.getReg());
379 }
380 if (BI.getOpcode() != Hexagon::A2_addi)
381 continue;
382 if (BI.getOperand(1).getReg() != BP)
383 continue;
384 const auto &Op2 = BI.getOperand(2);
385 if (!Op2.isImm() || Op2.getImm() != RealOffset)
386 continue;
387
388 Register R = BI.getOperand(0).getReg();
389 if (R.isPhysical()) {
390 if (Defs.available(R))
391 ReuseBP = R;
392 } else if (R.isVirtual()) {
393 // Extending a range of a virtual register can be dangerous,
394 // since the scavenger will need to find a physical register
395 // for it. Avoid extending the range past a function call,
396 // and avoid overlapping it with another virtual register.
397 if (!PassedCall && SeenVRegs.size() <= 1)
398 ReuseBP = R;
399 }
400 break;
401 }
402 if (ReuseBP)
403 ++ReuseCount;
404 }
405
406 auto &MRI = MF.getRegInfo();
407 if (!ReuseBP) {
408 ReuseBP = MRI.createVirtualRegister(&Hexagon::IntRegsRegClass);
409 const DebugLoc &DL = MI.getDebugLoc();
410 BuildMI(MB, II, DL, HII.get(Hexagon::A2_addi), ReuseBP)
411 .addReg(BP)
412 .addImm(RealOffset);
413 }
414 BP = ReuseBP;
415 RealOffset = InstOffset;
416 }
417
418 MI.getOperand(FIOp).ChangeToRegister(BP, false, false, false);
419 MI.getOperand(FIOp+1).ChangeToImmediate(RealOffset);
420 return false;
421}
422
423
425 const TargetRegisterClass *SrcRC, unsigned SubReg,
426 const TargetRegisterClass *DstRC, unsigned DstSubReg,
427 const TargetRegisterClass *NewRC, LiveIntervals &LIS) const {
428 // Coalescing will extend the live interval of the destination register.
429 // If the destination register is a vector pair, avoid introducing function
430 // calls into the interval, since it could result in a spilling of a pair
431 // instead of a single vector.
432 MachineFunction &MF = *MI->getParent()->getParent();
434 if (!HST.useHVXOps() || NewRC->getID() != Hexagon::HvxWRRegClass.getID())
435 return true;
436 bool SmallSrc = SrcRC->getID() == Hexagon::HvxVRRegClass.getID();
437 bool SmallDst = DstRC->getID() == Hexagon::HvxVRRegClass.getID();
438 if (!SmallSrc && !SmallDst)
439 return true;
440
441 Register DstReg = MI->getOperand(0).getReg();
442 Register SrcReg = MI->getOperand(1).getReg();
443 const SlotIndexes &Indexes = *LIS.getSlotIndexes();
444 auto HasCall = [&Indexes] (const LiveInterval::Segment &S) {
445 for (SlotIndex I = S.start.getBaseIndex(), E = S.end.getBaseIndex();
446 I != E; I = I.getNextIndex()) {
447 if (const MachineInstr *MI = Indexes.getInstructionFromIndex(I))
448 if (MI->isCall())
449 return true;
450 }
451 return false;
452 };
453
454 if (SmallSrc == SmallDst) {
455 // Both must be true, because the case for both being false was
456 // checked earlier. Both registers will be coalesced into a register
457 // of a wider class (HvxWR), and we don't want its live range to
458 // span over calls.
459 return !any_of(LIS.getInterval(DstReg), HasCall) &&
460 !any_of(LIS.getInterval(SrcReg), HasCall);
461 }
462
463 // If one register is large (HvxWR) and the other is small (HvxVR), then
464 // coalescing is ok if the large is already live across a function call,
465 // or if the small one is not.
466 Register SmallReg = SmallSrc ? SrcReg : DstReg;
467 Register LargeReg = SmallSrc ? DstReg : SrcReg;
468 return any_of(LIS.getInterval(LargeReg), HasCall) ||
469 !any_of(LIS.getInterval(SmallReg), HasCall);
470}
471
472
474 &MF) const {
475 const HexagonFrameLowering *TFI = getFrameLowering(MF);
476 if (TFI->hasFP(MF))
477 return getFrameRegister();
478 return getStackRegister();
479}
480
481
483 return Hexagon::R30;
484}
485
486
488 return Hexagon::R29;
489}
490
492 return Hexagon::VSP;
493}
494
496 const TargetRegisterClass &RC, unsigned GenIdx) const {
497 assert(GenIdx == Hexagon::ps_sub_lo || GenIdx == Hexagon::ps_sub_hi);
498
499 static const unsigned ISub[] = { Hexagon::isub_lo, Hexagon::isub_hi };
500 static const unsigned VSub[] = { Hexagon::vsub_lo, Hexagon::vsub_hi };
501 static const unsigned WSub[] = { Hexagon::wsub_lo, Hexagon::wsub_hi };
502
503 switch (RC.getID()) {
504 case Hexagon::CtrRegs64RegClassID:
505 case Hexagon::DoubleRegsRegClassID:
506 case Hexagon::CircRegsRegClassID:
507 return ISub[GenIdx];
508 case Hexagon::HvxWRRegClassID:
509 case Hexagon::HlxLLRRegClassID:
510 return VSub[GenIdx];
511 case Hexagon::HvxVQRRegClassID:
512 return WSub[GenIdx];
513 }
514
515 if (!RC.superclasses().empty())
517 GenIdx);
518
519 llvm_unreachable("Invalid register class");
520}
521
523 const {
524 return MF.getSubtarget<HexagonSubtarget>().getFrameLowering()->hasFP(MF);
525}
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static cl::opt< unsigned > FrameIndexReuseLimit("hexagon-frame-index-reuse-limit", cl::init(~0), cl::Hidden, cl::desc("Limit on the number of reused registers in frame index " "elimination"))
static bool hasHLXSignature(const MachineFunction &MF)
static cl::opt< unsigned > FrameIndexSearchRange("hexagon-frame-index-search-range", cl::init(32), cl::Hidden, cl::desc("Limit on instruction search range in frame index elimination"))
IRTranslator LLVM IR MI
A set of register units.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
#define R4(n)
#define R2(n)
#define R6(n)
Promote Memory to Register
Definition Mem2Reg.cpp:110
uint64_t IntrinsicInst * II
MachineRegisterInfo & MRI
This file declares the machine register scavenger class.
Remove Loads Into Fake Uses
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallSet class.
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
A debug info location.
Definition DebugLoc.h:126
Hexagon target-specific information for each MachineFunction.
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
bool isEHReturnCalleeSaveReg(Register Reg) const
BitVector getReservedRegs(const MachineFunction &MF) const override
Register computeStackAlignBaseRegister(const MachineFunction &MF) const
Compute the first available callee-saved register to use as the aligned-stack base register when this...
bool useFPForScavengingIndex(const MachineFunction &MF) const override
Returns true if the frame pointer is valid.
const uint32_t * getHLXCallPreservedMask() const
Mask for calls that pass or return values in HLX registers.
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
unsigned getHexagonSubRegIndex(const TargetRegisterClass &RC, unsigned GenIdx) const
bool shouldCoalesce(MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg, const TargetRegisterClass *DstRC, unsigned DstSubReg, const TargetRegisterClass *NewRC, LiveIntervals &LIS) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
bool isFakeReg(MCPhysReg Reg) const
Returns true if the given reserved physical register Reg is live across function calls/returns.
const MCPhysReg * getCallerSavedRegs(const MachineFunction *MF, const TargetRegisterClass *RC) const
bool isGlobalReg(MCPhysReg Reg) const
Returns true if the given reserved physical register is live across function calls/returns.
const HexagonInstrInfo * getInstrInfo() const override
SlotIndexes * getSlotIndexes() const
LiveInterval & getInterval(Register Reg)
A set of register units used to track register liveness.
static void accumulateUsedDefed(const MachineInstr &MI, LiveRegUnits &ModifiedRegUnits, LiveRegUnits &UsedRegUnits, const TargetRegisterInfo *TRI)
For a machine instruction MI, adds all register units used in UsedRegUnits and defined or clobbered i...
ArrayRef< unsigned > superclasses() const
Returns a list of super-classes.
unsigned getID() const
getID() - Return the register class ID number.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isCall(QueryType Type=AnyInBundle) const
mop_range operands()
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isValid() const
Definition Register.h:112
SlotIndex - An opaque wrapper around machine indexes.
Definition SlotIndexes.h:70
SlotIndexes pass.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:184
size_type size() const
Definition SmallSet.h:171
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
virtual bool isRegisterReservedByUser(Register R) const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
llvm::ArrayRef< MCPhysReg > GetVectRegRev()
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
This represents a simple continuous liveness interval for a value.