Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
MachineInstr.cpp
Go to the documentation of this file.
1//===- lib/CodeGen/MachineInstr.cpp ---------------------------------------===//
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// Methods common to all machine instructions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/CodeGen/MachineInstr.h"
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/Hashing.h"
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/SmallBitVector.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/Analysis/AliasAnalysis.h"
20#include "llvm/Analysis/MemoryLocation.h"
21#include "llvm/CodeGen/LiveRegUnits.h"
22#include "llvm/CodeGen/MachineBasicBlock.h"
23#include "llvm/CodeGen/MachineFrameInfo.h"
24#include "llvm/CodeGen/MachineFunction.h"
25#include "llvm/CodeGen/MachineInstrBuilder.h"
26#include "llvm/CodeGen/MachineInstrBundle.h"
27#include "llvm/CodeGen/MachineMemOperand.h"
28#include "llvm/CodeGen/MachineModuleInfo.h"
29#include "llvm/CodeGen/MachineOperand.h"
30#include "llvm/CodeGen/MachineRegisterInfo.h"
31#include "llvm/CodeGen/PseudoSourceValue.h"
32#include "llvm/CodeGen/Register.h"
33#include "llvm/CodeGen/StackMaps.h"
34#include "llvm/CodeGen/TargetInstrInfo.h"
35#include "llvm/CodeGen/TargetRegisterInfo.h"
36#include "llvm/CodeGen/TargetSubtargetInfo.h"
37#include "llvm/CodeGenTypes/LowLevelType.h"
38#include "llvm/IR/Constants.h"
39#include "llvm/IR/DebugInfoMetadata.h"
40#include "llvm/IR/DebugLoc.h"
41#include "llvm/IR/Function.h"
42#include "llvm/IR/InlineAsm.h"
43#include "llvm/IR/Instructions.h"
44#include "llvm/IR/LLVMContext.h"
45#include "llvm/IR/Metadata.h"
46#include "llvm/IR/Module.h"
47#include "llvm/IR/ModuleSlotTracker.h"
48#include "llvm/IR/Operator.h"
49#include "llvm/MC/MCInstrDesc.h"
50#include "llvm/MC/MCRegisterInfo.h"
51#include "llvm/Support/Casting.h"
52#include "llvm/Support/Compiler.h"
53#include "llvm/Support/Debug.h"
54#include "llvm/Support/ErrorHandling.h"
55#include "llvm/Support/FormattedStream.h"
56#include "llvm/Support/raw_ostream.h"
57#include "llvm/Target/TargetMachine.h"
58#include <algorithm>
59#include <cassert>
60#include <cstdint>
61#include <cstring>
62#include <utility>
63
64using namespacellvm;
65
66staticconstMachineFunction *getMFIfAvailable(constMachineInstr &MI) {
67if (constMachineBasicBlock *MBB =MI.getParent())
68if (constMachineFunction *MF =MBB->getParent())
69return MF;
70returnnullptr;
71}
72
73// Try to crawl up to the machine function and get TRI and IntrinsicInfo from
74// it.
75staticvoidtryToGetTargetInfo(constMachineInstr &MI,
76constTargetRegisterInfo *&TRI,
77constMachineRegisterInfo *&MRI,
78constTargetIntrinsicInfo *&IntrinsicInfo,
79constTargetInstrInfo *&TII) {
80
81if (constMachineFunction *MF =getMFIfAvailable(MI)) {
82TRI = MF->getSubtarget().getRegisterInfo();
83MRI = &MF->getRegInfo();
84 IntrinsicInfo = MF->getTarget().getIntrinsicInfo();
85TII = MF->getSubtarget().getInstrInfo();
86 }
87}
88
89voidMachineInstr::addImplicitDefUseOperands(MachineFunction &MF) {
90for (MCPhysReg ImpDef : MCID->implicit_defs())
91addOperand(MF,MachineOperand::CreateReg(ImpDef,true,true));
92for (MCPhysReg ImpUse : MCID->implicit_uses())
93addOperand(MF,MachineOperand::CreateReg(ImpUse,false,true));
94}
95
96/// MachineInstr ctor - This constructor creates a MachineInstr and adds the
97/// implicit operands. It reserves space for the number of operands specified by
98/// the MCInstrDesc.
99MachineInstr::MachineInstr(MachineFunction &MF,constMCInstrDesc &TID,
100DebugLocDL,bool NoImp)
101 : MCID(&TID), NumOperands(0), Flags(0), AsmPrinterFlags(0),
102 DbgLoc(std::move(DL)), DebugInstrNum(0), Opcode(TID.Opcode) {
103assert(DbgLoc.hasTrivialDestructor() &&"Expected trivial destructor");
104
105// Reserve space for the expected number of operands.
106if (unsigned NumOps = MCID->getNumOperands() + MCID->implicit_defs().size() +
107 MCID->implicit_uses().size()) {
108 CapOperands = OperandCapacity::get(NumOps);
109 Operands = MF.allocateOperandArray(CapOperands);
110 }
111
112if (!NoImp)
113addImplicitDefUseOperands(MF);
114}
115
116/// MachineInstr ctor - Copies MachineInstr arg exactly.
117/// Does not copy the number from debug instruction numbering, to preserve
118/// uniqueness.
119MachineInstr::MachineInstr(MachineFunction &MF,constMachineInstr &MI)
120 : MCID(&MI.getDesc()), NumOperands(0),Flags(0), AsmPrinterFlags(0),
121Info(MI.Info), DbgLoc(MI.getDebugLoc()), DebugInstrNum(0),
122 Opcode(MI.getOpcode()) {
123assert(DbgLoc.hasTrivialDestructor() &&"Expected trivial destructor");
124
125 CapOperands = OperandCapacity::get(MI.getNumOperands());
126 Operands = MF.allocateOperandArray(CapOperands);
127
128// Copy operands.
129for (constMachineOperand &MO :MI.operands())
130addOperand(MF, MO);
131
132// Replicate ties between the operands, which addOperand was not
133// able to do reliably.
134for (unsigned i = 0, e =getNumOperands(); i <e; ++i) {
135MachineOperand &NewMO =getOperand(i);
136constMachineOperand &OrigMO =MI.getOperand(i);
137 NewMO.TiedTo = OrigMO.TiedTo;
138 }
139
140// Copy all the sensible flags.
141setFlags(MI.Flags);
142}
143
144voidMachineInstr::setDesc(constMCInstrDesc &TID) {
145if (getParent())
146getMF()->handleChangeDesc(*this, TID);
147 MCID = &TID;
148 Opcode = TID.Opcode;
149}
150
151voidMachineInstr::moveBefore(MachineInstr *MovePos) {
152 MovePos->getParent()->splice(MovePos,getParent(),getIterator());
153}
154
155/// getRegInfo - If this instruction is embedded into a MachineFunction,
156/// return the MachineRegisterInfo object for the current function, otherwise
157/// return null.
158MachineRegisterInfo *MachineInstr::getRegInfo() {
159if (MachineBasicBlock *MBB =getParent())
160return &MBB->getParent()->getRegInfo();
161returnnullptr;
162}
163
164constMachineRegisterInfo *MachineInstr::getRegInfo() const{
165if (constMachineBasicBlock *MBB =getParent())
166return &MBB->getParent()->getRegInfo();
167returnnullptr;
168}
169
170void MachineInstr::removeRegOperandsFromUseLists(MachineRegisterInfo &MRI) {
171for (MachineOperand &MO :operands())
172if (MO.isReg())
173MRI.removeRegOperandFromUseList(&MO);
174}
175
176void MachineInstr::addRegOperandsToUseLists(MachineRegisterInfo &MRI) {
177for (MachineOperand &MO :operands())
178if (MO.isReg())
179MRI.addRegOperandToUseList(&MO);
180}
181
182voidMachineInstr::addOperand(constMachineOperand &Op) {
183MachineBasicBlock *MBB =getParent();
184assert(MBB &&"Use MachineInstrBuilder to add operands to dangling instrs");
185MachineFunction *MF =MBB->getParent();
186assert(MF &&"Use MachineInstrBuilder to add operands to dangling instrs");
187addOperand(*MF,Op);
188}
189
190/// Move NumOps MachineOperands from Src to Dst, with support for overlapping
191/// ranges. If MRI is non-null also update use-def chains.
192staticvoidmoveOperands(MachineOperand *Dst,MachineOperand *Src,
193unsigned NumOps,MachineRegisterInfo *MRI) {
194if (MRI)
195returnMRI->moveOperands(Dst, Src, NumOps);
196// MachineOperand is a trivially copyable type so we can just use memmove.
197assert(Dst && Src &&"Unknown operands");
198 std::memmove(Dst, Src, NumOps *sizeof(MachineOperand));
199}
200
201/// addOperand - Add the specified operand to the instruction. If it is an
202/// implicit operand, it is added to the end of the operand list. If it is
203/// an explicit operand it is added at the end of the explicit operand list
204/// (before the first implicit operand).
205voidMachineInstr::addOperand(MachineFunction &MF,constMachineOperand &Op) {
206assert(isUInt<LLVM_MI_NUMOPERANDS_BITS>(NumOperands + 1) &&
207"Cannot add more operands.");
208assert(MCID &&"Cannot add operands before providing an instr descriptor");
209
210// Check if we're adding one of our existing operands.
211if (&Op >= Operands && &Op < Operands + NumOperands) {
212// This is unusual: MI->addOperand(MI->getOperand(i)).
213// If adding Op requires reallocating or moving existing operands around,
214// the Op reference could go stale. Support it by copying Op.
215MachineOperand CopyOp(Op);
216returnaddOperand(MF, CopyOp);
217 }
218
219// Find the insert location for the new operand. Implicit registers go at
220// the end, everything else goes before the implicit regs.
221//
222// FIXME: Allow mixed explicit and implicit operands on inline asm.
223// InstrEmitter::EmitSpecialNode() is marking inline asm clobbers as
224// implicit-defs, but they must not be moved around. See the FIXME in
225// InstrEmitter.cpp.
226unsigned OpNo =getNumOperands();
227bool isImpReg =Op.isReg() &&Op.isImplicit();
228if (!isImpReg && !isInlineAsm()) {
229while (OpNo && Operands[OpNo-1].isReg() && Operands[OpNo-1].isImplicit()) {
230 --OpNo;
231assert(!Operands[OpNo].isTied() &&"Cannot move tied operands");
232 }
233 }
234
235// OpNo now points as the desired insertion point. Unless this is a variadic
236// instruction, only implicit regs are allowed beyond MCID->getNumOperands().
237// RegMask operands go between the explicit and implicit operands.
238MachineRegisterInfo *MRI = getRegInfo();
239
240// Determine if the Operands array needs to be reallocated.
241// Save the old capacity and operand array.
242 OperandCapacity OldCap = CapOperands;
243MachineOperand *OldOperands = Operands;
244if (!OldOperands || OldCap.getSize() ==getNumOperands()) {
245 CapOperands = OldOperands ? OldCap.getNext() : OldCap.get(1);
246 Operands = MF.allocateOperandArray(CapOperands);
247// Move the operands before the insertion point.
248if (OpNo)
249moveOperands(Operands, OldOperands, OpNo,MRI);
250 }
251
252// Move the operands following the insertion point.
253if (OpNo != NumOperands)
254moveOperands(Operands + OpNo + 1, OldOperands + OpNo, NumOperands - OpNo,
255MRI);
256 ++NumOperands;
257
258// Deallocate the old operand array.
259if (OldOperands != Operands && OldOperands)
260 MF.deallocateOperandArray(OldCap, OldOperands);
261
262// Copy Op into place. It still needs to be inserted into the MRI use lists.
263MachineOperand *NewMO =new (Operands + OpNo)MachineOperand(Op);
264 NewMO->ParentMI =this;
265
266// When adding a register operand, tell MRI about it.
267if (NewMO->isReg()) {
268// Ensure isOnRegUseList() returns false, regardless of Op's status.
269 NewMO->Contents.Reg.Prev =nullptr;
270// Ignore existing ties. This is not a property that can be copied.
271 NewMO->TiedTo = 0;
272// Add the new operand to MRI, but only for instructions in an MBB.
273if (MRI)
274MRI->addRegOperandToUseList(NewMO);
275// The MCID operand information isn't accurate until we start adding
276// explicit operands. The implicit operands are added first, then the
277// explicits are inserted before them.
278if (!isImpReg) {
279// Tie uses to defs as indicated in MCInstrDesc.
280if (NewMO->isUse()) {
281int DefIdx = MCID->getOperandConstraint(OpNo,MCOI::TIED_TO);
282if (DefIdx != -1)
283tieOperands(DefIdx, OpNo);
284 }
285// If the register operand is flagged as early, mark the operand as such.
286if (MCID->getOperandConstraint(OpNo,MCOI::EARLY_CLOBBER) != -1)
287 NewMO->setIsEarlyClobber(true);
288 }
289// Ensure debug instructions set debug flag on register uses.
290if (NewMO->isUse() &&isDebugInstr())
291 NewMO->setIsDebug();
292 }
293}
294
295voidMachineInstr::removeOperand(unsigned OpNo) {
296assert(OpNo <getNumOperands() &&"Invalid operand number");
297untieRegOperand(OpNo);
298
299#ifndef NDEBUG
300// Moving tied operands would break the ties.
301for (unsigned i = OpNo + 1, e =getNumOperands(); i != e; ++i)
302if (Operands[i].isReg())
303assert(!Operands[i].isTied() &&"Cannot move tied operands");
304#endif
305
306MachineRegisterInfo *MRI = getRegInfo();
307if (MRI && Operands[OpNo].isReg())
308MRI->removeRegOperandFromUseList(Operands + OpNo);
309
310// Don't call the MachineOperand destructor. A lot of this code depends on
311// MachineOperand having a trivial destructor anyway, and adding a call here
312// wouldn't make it 'destructor-correct'.
313
314if (unsignedN = NumOperands - 1 - OpNo)
315moveOperands(Operands + OpNo, Operands + OpNo + 1,N,MRI);
316 --NumOperands;
317}
318
319void MachineInstr::setExtraInfo(MachineFunction &MF,
320ArrayRef<MachineMemOperand *> MMOs,
321MCSymbol *PreInstrSymbol,
322MCSymbol *PostInstrSymbol,
323MDNode *HeapAllocMarker,MDNode *PCSections,
324uint32_t CFIType,MDNode *MMRAs) {
325bool HasPreInstrSymbol = PreInstrSymbol !=nullptr;
326bool HasPostInstrSymbol = PostInstrSymbol !=nullptr;
327bool HasHeapAllocMarker = HeapAllocMarker !=nullptr;
328bool HasPCSections = PCSections !=nullptr;
329bool HasCFIType = CFIType != 0;
330bool HasMMRAs = MMRAs !=nullptr;
331int NumPointers = MMOs.size() + HasPreInstrSymbol + HasPostInstrSymbol +
332 HasHeapAllocMarker + HasPCSections + HasCFIType + HasMMRAs;
333
334// Drop all extra info if there is none.
335if (NumPointers <= 0) {
336 Info.clear();
337return;
338 }
339
340// If more than one pointer, then store out of line. Store heap alloc markers
341// out of line because PointerSumType cannot hold more than 4 tag types with
342// 32-bit pointers.
343// FIXME: Maybe we should make the symbols in the extra info mutable?
344elseif (NumPointers > 1 || HasMMRAs || HasHeapAllocMarker || HasPCSections ||
345 HasCFIType) {
346 Info.set<EIIK_OutOfLine>(
347 MF.createMIExtraInfo(MMOs, PreInstrSymbol, PostInstrSymbol,
348 HeapAllocMarker, PCSections, CFIType, MMRAs));
349return;
350 }
351
352// Otherwise store the single pointer inline.
353if (HasPreInstrSymbol)
354 Info.set<EIIK_PreInstrSymbol>(PreInstrSymbol);
355elseif (HasPostInstrSymbol)
356 Info.set<EIIK_PostInstrSymbol>(PostInstrSymbol);
357else
358 Info.set<EIIK_MMO>(MMOs[0]);
359}
360
361voidMachineInstr::dropMemRefs(MachineFunction &MF) {
362if (memoperands_empty())
363return;
364
365 setExtraInfo(MF, {},getPreInstrSymbol(),getPostInstrSymbol(),
366getHeapAllocMarker(),getPCSections(),getCFIType(),
367getMMRAMetadata());
368}
369
370voidMachineInstr::setMemRefs(MachineFunction &MF,
371ArrayRef<MachineMemOperand *> MMOs) {
372if (MMOs.empty()) {
373dropMemRefs(MF);
374return;
375 }
376
377 setExtraInfo(MF, MMOs,getPreInstrSymbol(),getPostInstrSymbol(),
378getHeapAllocMarker(),getPCSections(),getCFIType(),
379getMMRAMetadata());
380}
381
382voidMachineInstr::addMemOperand(MachineFunction &MF,
383MachineMemOperand *MO) {
384SmallVector<MachineMemOperand *, 2> MMOs;
385 MMOs.append(memoperands_begin(),memoperands_end());
386 MMOs.push_back(MO);
387setMemRefs(MF, MMOs);
388}
389
390voidMachineInstr::cloneMemRefs(MachineFunction &MF,constMachineInstr &MI) {
391if (this == &MI)
392// Nothing to do for a self-clone!
393return;
394
395assert(&MF ==MI.getMF() &&
396"Invalid machine functions when cloning memory refrences!");
397// See if we can just steal the extra info already allocated for the
398// instruction. We can do this whenever the pre- and post-instruction symbols
399// are the same (including null).
400if (getPreInstrSymbol() ==MI.getPreInstrSymbol() &&
401getPostInstrSymbol() ==MI.getPostInstrSymbol() &&
402getHeapAllocMarker() ==MI.getHeapAllocMarker() &&
403getPCSections() ==MI.getPCSections() &&getMMRAMetadata() &&
404MI.getMMRAMetadata()) {
405 Info =MI.Info;
406return;
407 }
408
409// Otherwise, fall back on a copy-based clone.
410setMemRefs(MF,MI.memoperands());
411}
412
413/// Check to see if the MMOs pointed to by the two MemRefs arrays are
414/// identical.
415staticboolhasIdenticalMMOs(ArrayRef<MachineMemOperand *> LHS,
416ArrayRef<MachineMemOperand *> RHS) {
417if (LHS.size() !=RHS.size())
418returnfalse;
419
420auto LHSPointees =make_pointee_range(LHS);
421auto RHSPointees =make_pointee_range(RHS);
422return std::equal(LHSPointees.begin(), LHSPointees.end(),
423 RHSPointees.begin());
424}
425
426voidMachineInstr::cloneMergedMemRefs(MachineFunction &MF,
427ArrayRef<const MachineInstr *> MIs) {
428// Try handling easy numbers of MIs with simpler mechanisms.
429if (MIs.empty()) {
430dropMemRefs(MF);
431return;
432 }
433if (MIs.size() == 1) {
434cloneMemRefs(MF, *MIs[0]);
435return;
436 }
437// Because an empty memoperands list provides *no* information and must be
438// handled conservatively (assuming the instruction can do anything), the only
439// way to merge with it is to drop all other memoperands.
440if (MIs[0]->memoperands_empty()) {
441dropMemRefs(MF);
442return;
443 }
444
445// Handle the general case.
446SmallVector<MachineMemOperand *, 2> MergedMMOs;
447// Start with the first instruction.
448assert(&MF == MIs[0]->getMF() &&
449"Invalid machine functions when cloning memory references!");
450 MergedMMOs.append(MIs[0]->memoperands_begin(), MIs[0]->memoperands_end());
451// Now walk all the other instructions and accumulate any different MMOs.
452for (constMachineInstr &MI :make_pointee_range(MIs.slice(1))) {
453assert(&MF ==MI.getMF() &&
454"Invalid machine functions when cloning memory references!");
455
456// Skip MIs with identical operands to the first. This is a somewhat
457// arbitrary hack but will catch common cases without being quadratic.
458// TODO: We could fully implement merge semantics here if needed.
459if (hasIdenticalMMOs(MIs[0]->memoperands(),MI.memoperands()))
460continue;
461
462// Because an empty memoperands list provides *no* information and must be
463// handled conservatively (assuming the instruction can do anything), the
464// only way to merge with it is to drop all other memoperands.
465if (MI.memoperands_empty()) {
466dropMemRefs(MF);
467return;
468 }
469
470// Otherwise accumulate these into our temporary buffer of the merged state.
471 MergedMMOs.append(MI.memoperands_begin(),MI.memoperands_end());
472 }
473
474setMemRefs(MF, MergedMMOs);
475}
476
477voidMachineInstr::setPreInstrSymbol(MachineFunction &MF,MCSymbol *Symbol) {
478// Do nothing if old and new symbols are the same.
479if (Symbol ==getPreInstrSymbol())
480return;
481
482// If there was only one symbol and we're removing it, just clear info.
483if (!Symbol && Info.is<EIIK_PreInstrSymbol>()) {
484 Info.clear();
485return;
486 }
487
488 setExtraInfo(MF,memoperands(), Symbol,getPostInstrSymbol(),
489getHeapAllocMarker(),getPCSections(),getCFIType(),
490getMMRAMetadata());
491}
492
493voidMachineInstr::setPostInstrSymbol(MachineFunction &MF,MCSymbol *Symbol) {
494// Do nothing if old and new symbols are the same.
495if (Symbol ==getPostInstrSymbol())
496return;
497
498// If there was only one symbol and we're removing it, just clear info.
499if (!Symbol && Info.is<EIIK_PostInstrSymbol>()) {
500 Info.clear();
501return;
502 }
503
504 setExtraInfo(MF,memoperands(),getPreInstrSymbol(), Symbol,
505getHeapAllocMarker(),getPCSections(),getCFIType(),
506getMMRAMetadata());
507}
508
509voidMachineInstr::setHeapAllocMarker(MachineFunction &MF,MDNode *Marker) {
510// Do nothing if old and new symbols are the same.
511if (Marker ==getHeapAllocMarker())
512return;
513
514 setExtraInfo(MF,memoperands(),getPreInstrSymbol(),getPostInstrSymbol(),
515 Marker,getPCSections(),getCFIType(),getMMRAMetadata());
516}
517
518voidMachineInstr::setPCSections(MachineFunction &MF,MDNode *PCSections) {
519// Do nothing if old and new symbols are the same.
520if (PCSections ==getPCSections())
521return;
522
523 setExtraInfo(MF,memoperands(),getPreInstrSymbol(),getPostInstrSymbol(),
524getHeapAllocMarker(), PCSections,getCFIType(),
525getMMRAMetadata());
526}
527
528voidMachineInstr::setCFIType(MachineFunction &MF,uint32_tType) {
529// Do nothing if old and new types are the same.
530if (Type ==getCFIType())
531return;
532
533 setExtraInfo(MF,memoperands(),getPreInstrSymbol(),getPostInstrSymbol(),
534getHeapAllocMarker(),getPCSections(),Type,getMMRAMetadata());
535}
536
537voidMachineInstr::setMMRAMetadata(MachineFunction &MF,MDNode *MMRAs) {
538// Do nothing if old and new symbols are the same.
539if (MMRAs ==getMMRAMetadata())
540return;
541
542 setExtraInfo(MF,memoperands(),getPreInstrSymbol(),getPostInstrSymbol(),
543getHeapAllocMarker(),getPCSections(),getCFIType(), MMRAs);
544}
545
546voidMachineInstr::cloneInstrSymbols(MachineFunction &MF,
547constMachineInstr &MI) {
548if (this == &MI)
549// Nothing to do for a self-clone!
550return;
551
552assert(&MF ==MI.getMF() &&
553"Invalid machine functions when cloning instruction symbols!");
554
555setPreInstrSymbol(MF,MI.getPreInstrSymbol());
556setPostInstrSymbol(MF,MI.getPostInstrSymbol());
557setHeapAllocMarker(MF,MI.getHeapAllocMarker());
558setPCSections(MF,MI.getPCSections());
559setMMRAMetadata(MF,MI.getMMRAMetadata());
560}
561
562uint32_tMachineInstr::mergeFlagsWith(constMachineInstr &Other) const{
563// For now, the just return the union of the flags. If the flags get more
564// complicated over time, we might need more logic here.
565returngetFlags() |Other.getFlags();
566}
567
568uint32_tMachineInstr::copyFlagsFromInstruction(constInstruction &I) {
569uint32_t MIFlags = 0;
570// Copy the wrapping flags.
571if (constOverflowingBinaryOperator *OB =
572 dyn_cast<OverflowingBinaryOperator>(&I)) {
573if (OB->hasNoSignedWrap())
574 MIFlags |=MachineInstr::MIFlag::NoSWrap;
575if (OB->hasNoUnsignedWrap())
576 MIFlags |=MachineInstr::MIFlag::NoUWrap;
577 }elseif (constTruncInst *TI = dyn_cast<TruncInst>(&I)) {
578if (TI->hasNoSignedWrap())
579 MIFlags |=MachineInstr::MIFlag::NoSWrap;
580if (TI->hasNoUnsignedWrap())
581 MIFlags |=MachineInstr::MIFlag::NoUWrap;
582 }elseif (constGetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(&I)) {
583if (GEP->hasNoUnsignedSignedWrap())
584 MIFlags |=MachineInstr::MIFlag::NoUSWrap;
585if (GEP->hasNoUnsignedWrap())
586 MIFlags |=MachineInstr::MIFlag::NoUWrap;
587 }
588
589// Copy the nonneg flag.
590if (constPossiblyNonNegInst *PNI = dyn_cast<PossiblyNonNegInst>(&I)) {
591if (PNI->hasNonNeg())
592 MIFlags |=MachineInstr::MIFlag::NonNeg;
593// Copy the disjoint flag.
594 }elseif (constPossiblyDisjointInst *PD =
595 dyn_cast<PossiblyDisjointInst>(&I)) {
596if (PD->isDisjoint())
597 MIFlags |=MachineInstr::MIFlag::Disjoint;
598 }
599
600// Copy the samesign flag.
601if (constICmpInst *ICmp = dyn_cast<ICmpInst>(&I))
602if (ICmp->hasSameSign())
603 MIFlags |=MachineInstr::MIFlag::SameSign;
604
605// Copy the exact flag.
606if (constPossiblyExactOperator *PE = dyn_cast<PossiblyExactOperator>(&I))
607if (PE->isExact())
608 MIFlags |=MachineInstr::MIFlag::IsExact;
609
610// Copy the fast-math flags.
611if (constFPMathOperator *FP = dyn_cast<FPMathOperator>(&I)) {
612constFastMathFlags Flags =FP->getFastMathFlags();
613if (Flags.noNaNs())
614 MIFlags |=MachineInstr::MIFlag::FmNoNans;
615if (Flags.noInfs())
616 MIFlags |=MachineInstr::MIFlag::FmNoInfs;
617if (Flags.noSignedZeros())
618 MIFlags |=MachineInstr::MIFlag::FmNsz;
619if (Flags.allowReciprocal())
620 MIFlags |=MachineInstr::MIFlag::FmArcp;
621if (Flags.allowContract())
622 MIFlags |=MachineInstr::MIFlag::FmContract;
623if (Flags.approxFunc())
624 MIFlags |=MachineInstr::MIFlag::FmAfn;
625if (Flags.allowReassoc())
626 MIFlags |=MachineInstr::MIFlag::FmReassoc;
627 }
628
629if (I.getMetadata(LLVMContext::MD_unpredictable))
630 MIFlags |=MachineInstr::MIFlag::Unpredictable;
631
632return MIFlags;
633}
634
635voidMachineInstr::copyIRFlags(constInstruction &I) {
636 Flags =copyFlagsFromInstruction(I);
637}
638
639bool MachineInstr::hasPropertyInBundle(uint64_t Mask, QueryTypeType) const{
640assert(!isBundledWithPred() &&"Must be called on bundle header");
641for (MachineBasicBlock::const_instr_iterator MII =getIterator();; ++MII) {
642if (MII->getDesc().getFlags() & Mask) {
643if (Type ==AnyInBundle)
644returntrue;
645 }else {
646if (Type ==AllInBundle && !MII->isBundle())
647returnfalse;
648 }
649// This was the last instruction in the bundle.
650if (!MII->isBundledWithSucc())
651returnType ==AllInBundle;
652 }
653}
654
655boolMachineInstr::isIdenticalTo(constMachineInstr &Other,
656MICheckType Check) const{
657// If opcodes or number of operands are not the same then the two
658// instructions are obviously not identical.
659if (Other.getOpcode() !=getOpcode() ||
660Other.getNumOperands() !=getNumOperands())
661returnfalse;
662
663if (isBundle()) {
664// We have passed the test above that both instructions have the same
665// opcode, so we know that both instructions are bundles here. Let's compare
666// MIs inside the bundle.
667assert(Other.isBundle() &&"Expected that both instructions are bundles.");
668MachineBasicBlock::const_instr_iterator I1 =getIterator();
669MachineBasicBlock::const_instr_iterator I2 =Other.getIterator();
670// Loop until we analysed the last intruction inside at least one of the
671// bundles.
672while (I1->isBundledWithSucc() && I2->isBundledWithSucc()) {
673 ++I1;
674 ++I2;
675if (!I1->isIdenticalTo(*I2,Check))
676returnfalse;
677 }
678// If we've reached the end of just one of the two bundles, but not both,
679// the instructions are not identical.
680if (I1->isBundledWithSucc() || I2->isBundledWithSucc())
681returnfalse;
682 }
683
684// Check operands to make sure they match.
685for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
686constMachineOperand &MO =getOperand(i);
687constMachineOperand &OMO =Other.getOperand(i);
688if (!MO.isReg()) {
689if (!MO.isIdenticalTo(OMO))
690returnfalse;
691continue;
692 }
693
694// Clients may or may not want to ignore defs when testing for equality.
695// For example, machine CSE pass only cares about finding common
696// subexpressions, so it's safe to ignore virtual register defs.
697if (MO.isDef()) {
698if (Check ==IgnoreDefs)
699continue;
700elseif (Check ==IgnoreVRegDefs) {
701if (!MO.getReg().isVirtual() || !OMO.getReg().isVirtual())
702if (!MO.isIdenticalTo(OMO))
703returnfalse;
704 }else {
705if (!MO.isIdenticalTo(OMO))
706returnfalse;
707if (Check ==CheckKillDead && MO.isDead() != OMO.isDead())
708returnfalse;
709 }
710 }else {
711if (!MO.isIdenticalTo(OMO))
712returnfalse;
713if (Check ==CheckKillDead && MO.isKill() != OMO.isKill())
714returnfalse;
715 }
716 }
717// If DebugLoc does not match then two debug instructions are not identical.
718if (isDebugInstr())
719if (getDebugLoc() &&Other.getDebugLoc() &&
720getDebugLoc() !=Other.getDebugLoc())
721returnfalse;
722// If pre- or post-instruction symbols do not match then the two instructions
723// are not identical.
724if (getPreInstrSymbol() !=Other.getPreInstrSymbol() ||
725getPostInstrSymbol() !=Other.getPostInstrSymbol())
726returnfalse;
727// Call instructions with different CFI types are not identical.
728if (isCall() &&getCFIType() !=Other.getCFIType())
729returnfalse;
730
731returntrue;
732}
733
734boolMachineInstr::isEquivalentDbgInstr(constMachineInstr &Other) const{
735if (!isDebugValueLike() || !Other.isDebugValueLike())
736returnfalse;
737if (getDebugLoc() !=Other.getDebugLoc())
738returnfalse;
739if (getDebugVariable() !=Other.getDebugVariable())
740returnfalse;
741if (getNumDebugOperands() !=Other.getNumDebugOperands())
742returnfalse;
743for (unsigned OpIdx = 0; OpIdx <getNumDebugOperands(); ++OpIdx)
744if (!getDebugOperand(OpIdx).isIdenticalTo(Other.getDebugOperand(OpIdx)))
745returnfalse;
746if (!DIExpression::isEqualExpression(
747getDebugExpression(),isIndirectDebugValue(),
748Other.getDebugExpression(),Other.isIndirectDebugValue()))
749returnfalse;
750returntrue;
751}
752
753constMachineFunction *MachineInstr::getMF() const{
754returngetParent()->getParent();
755}
756
757MachineInstr *MachineInstr::removeFromParent() {
758assert(getParent() &&"Not embedded in a basic block!");
759returngetParent()->remove(this);
760}
761
762MachineInstr *MachineInstr::removeFromBundle() {
763assert(getParent() &&"Not embedded in a basic block!");
764returngetParent()->remove_instr(this);
765}
766
767voidMachineInstr::eraseFromParent() {
768assert(getParent() &&"Not embedded in a basic block!");
769getParent()->erase(this);
770}
771
772voidMachineInstr::eraseFromBundle() {
773assert(getParent() &&"Not embedded in a basic block!");
774getParent()->erase_instr(this);
775}
776
777boolMachineInstr::isCandidateForAdditionalCallInfo(QueryTypeType) const{
778if (!isCall(Type))
779returnfalse;
780switch (getOpcode()) {
781case TargetOpcode::PATCHPOINT:
782case TargetOpcode::STACKMAP:
783case TargetOpcode::STATEPOINT:
784case TargetOpcode::FENTRY_CALL:
785returnfalse;
786 }
787returntrue;
788}
789
790boolMachineInstr::shouldUpdateAdditionalCallInfo() const{
791if (isBundle())
792returnisCandidateForAdditionalCallInfo(MachineInstr::AnyInBundle);
793returnisCandidateForAdditionalCallInfo();
794}
795
796unsignedMachineInstr::getNumExplicitOperands() const{
797unsigned NumOperands = MCID->getNumOperands();
798if (!MCID->isVariadic())
799return NumOperands;
800
801for (unsignedI = NumOperands, E =getNumOperands();I != E; ++I) {
802constMachineOperand &MO =getOperand(I);
803// The operands must always be in the following order:
804// - explicit reg defs,
805// - other explicit operands (reg uses, immediates, etc.),
806// - implicit reg defs
807// - implicit reg uses
808if (MO.isReg() && MO.isImplicit())
809break;
810 ++NumOperands;
811 }
812return NumOperands;
813}
814
815unsignedMachineInstr::getNumExplicitDefs() const{
816unsigned NumDefs = MCID->getNumDefs();
817if (!MCID->isVariadic())
818return NumDefs;
819
820for (unsignedI = NumDefs, E =getNumOperands();I != E; ++I) {
821constMachineOperand &MO =getOperand(I);
822if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
823break;
824 ++NumDefs;
825 }
826return NumDefs;
827}
828
829voidMachineInstr::bundleWithPred() {
830assert(!isBundledWithPred() &&"MI is already bundled with its predecessor");
831setFlag(BundledPred);
832MachineBasicBlock::instr_iterator Pred =getIterator();
833 --Pred;
834assert(!Pred->isBundledWithSucc() &&"Inconsistent bundle flags");
835 Pred->setFlag(BundledSucc);
836}
837
838voidMachineInstr::bundleWithSucc() {
839assert(!isBundledWithSucc() &&"MI is already bundled with its successor");
840setFlag(BundledSucc);
841MachineBasicBlock::instr_iterator Succ =getIterator();
842 ++Succ;
843assert(!Succ->isBundledWithPred() &&"Inconsistent bundle flags");
844 Succ->setFlag(BundledPred);
845}
846
847voidMachineInstr::unbundleFromPred() {
848assert(isBundledWithPred() &&"MI isn't bundled with its predecessor");
849clearFlag(BundledPred);
850MachineBasicBlock::instr_iterator Pred =getIterator();
851 --Pred;
852assert(Pred->isBundledWithSucc() &&"Inconsistent bundle flags");
853 Pred->clearFlag(BundledSucc);
854}
855
856voidMachineInstr::unbundleFromSucc() {
857assert(isBundledWithSucc() &&"MI isn't bundled with its successor");
858clearFlag(BundledSucc);
859MachineBasicBlock::instr_iterator Succ =getIterator();
860 ++Succ;
861assert(Succ->isBundledWithPred() &&"Inconsistent bundle flags");
862 Succ->clearFlag(BundledPred);
863}
864
865boolMachineInstr::isStackAligningInlineAsm() const{
866if (isInlineAsm()) {
867unsigned ExtraInfo =getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
868if (ExtraInfo &InlineAsm::Extra_IsAlignStack)
869returntrue;
870 }
871returnfalse;
872}
873
874InlineAsm::AsmDialectMachineInstr::getInlineAsmDialect() const{
875assert(isInlineAsm() &&"getInlineAsmDialect() only works for inline asms!");
876unsigned ExtraInfo =getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
877returnInlineAsm::AsmDialect((ExtraInfo &InlineAsm::Extra_AsmDialect) != 0);
878}
879
880intMachineInstr::findInlineAsmFlagIdx(unsigned OpIdx,
881unsigned *GroupNo) const{
882assert(isInlineAsm() &&"Expected an inline asm instruction");
883assert(OpIdx <getNumOperands() &&"OpIdx out of range");
884
885// Ignore queries about the initial operands.
886if (OpIdx <InlineAsm::MIOp_FirstOperand)
887return -1;
888
889unsigned Group = 0;
890unsigned NumOps;
891for (unsigned i =InlineAsm::MIOp_FirstOperand, e =getNumOperands(); i < e;
892 i += NumOps) {
893constMachineOperand &FlagMO =getOperand(i);
894// If we reach the implicit register operands, stop looking.
895if (!FlagMO.isImm())
896return -1;
897constInlineAsm::FlagF(FlagMO.getImm());
898 NumOps = 1 +F.getNumOperandRegisters();
899if (i + NumOps > OpIdx) {
900if (GroupNo)
901 *GroupNo = Group;
902return i;
903 }
904 ++Group;
905 }
906return -1;
907}
908
909constDILabel *MachineInstr::getDebugLabel() const{
910assert(isDebugLabel() &&"not a DBG_LABEL");
911return cast<DILabel>(getOperand(0).getMetadata());
912}
913
914constMachineOperand &MachineInstr::getDebugVariableOp() const{
915assert((isDebugValueLike()) &&"not a DBG_VALUE*");
916unsigned VariableOp =isNonListDebugValue() ? 2 : 0;
917returngetOperand(VariableOp);
918}
919
920MachineOperand &MachineInstr::getDebugVariableOp() {
921assert((isDebugValueLike()) &&"not a DBG_VALUE*");
922unsigned VariableOp =isNonListDebugValue() ? 2 : 0;
923returngetOperand(VariableOp);
924}
925
926constDILocalVariable *MachineInstr::getDebugVariable() const{
927return cast<DILocalVariable>(getDebugVariableOp().getMetadata());
928}
929
930constMachineOperand &MachineInstr::getDebugExpressionOp() const{
931assert((isDebugValueLike()) &&"not a DBG_VALUE*");
932unsigned ExpressionOp =isNonListDebugValue() ? 3 : 1;
933returngetOperand(ExpressionOp);
934}
935
936MachineOperand &MachineInstr::getDebugExpressionOp() {
937assert((isDebugValueLike()) &&"not a DBG_VALUE*");
938unsigned ExpressionOp =isNonListDebugValue() ? 3 : 1;
939returngetOperand(ExpressionOp);
940}
941
942constDIExpression *MachineInstr::getDebugExpression() const{
943return cast<DIExpression>(getDebugExpressionOp().getMetadata());
944}
945
946boolMachineInstr::isDebugEntryValue() const{
947returnisDebugValue() &&getDebugExpression()->isEntryValue();
948}
949
950constTargetRegisterClass*
951MachineInstr::getRegClassConstraint(unsigned OpIdx,
952constTargetInstrInfo *TII,
953constTargetRegisterInfo *TRI) const{
954assert(getParent() &&"Can't have an MBB reference here!");
955assert(getMF() &&"Can't have an MF reference here!");
956constMachineFunction &MF = *getMF();
957
958// Most opcodes have fixed constraints in their MCInstrDesc.
959if (!isInlineAsm())
960returnTII->getRegClass(getDesc(), OpIdx,TRI, MF);
961
962if (!getOperand(OpIdx).isReg())
963returnnullptr;
964
965// For tied uses on inline asm, get the constraint from the def.
966unsigned DefIdx;
967if (getOperand(OpIdx).isUse() &&isRegTiedToDefOperand(OpIdx, &DefIdx))
968 OpIdx = DefIdx;
969
970// Inline asm stores register class constraints in the flag word.
971int FlagIdx =findInlineAsmFlagIdx(OpIdx);
972if (FlagIdx < 0)
973returnnullptr;
974
975constInlineAsm::FlagF(getOperand(FlagIdx).getImm());
976unsigned RCID;
977if ((F.isRegUseKind() ||F.isRegDefKind() ||F.isRegDefEarlyClobberKind()) &&
978F.hasRegClassConstraint(RCID))
979returnTRI->getRegClass(RCID);
980
981// Assume that all registers in a memory operand are pointers.
982if (F.isMemKind())
983returnTRI->getPointerRegClass(MF);
984
985returnnullptr;
986}
987
988constTargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVReg(
989Register Reg,constTargetRegisterClass *CurRC,constTargetInstrInfo *TII,
990constTargetRegisterInfo *TRI,bool ExploreBundle) const{
991// Check every operands inside the bundle if we have
992// been asked to.
993if (ExploreBundle)
994for (ConstMIBundleOperands OpndIt(*this); OpndIt.isValid() && CurRC;
995 ++OpndIt)
996 CurRC = OpndIt->getParent()->getRegClassConstraintEffectForVRegImpl(
997 OpndIt.getOperandNo(), Reg, CurRC,TII,TRI);
998else
999// Otherwise, just check the current operands.
1000for (unsigned i = 0, e = NumOperands; i < e && CurRC; ++i)
1001 CurRC = getRegClassConstraintEffectForVRegImpl(i, Reg, CurRC,TII,TRI);
1002return CurRC;
1003}
1004
1005constTargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVRegImpl(
1006unsigned OpIdx,Register Reg,constTargetRegisterClass *CurRC,
1007constTargetInstrInfo *TII,constTargetRegisterInfo *TRI) const{
1008assert(CurRC &&"Invalid initial register class");
1009// Check if Reg is constrained by some of its use/def from MI.
1010constMachineOperand &MO =getOperand(OpIdx);
1011if (!MO.isReg() || MO.getReg() != Reg)
1012return CurRC;
1013// If yes, accumulate the constraints through the operand.
1014returngetRegClassConstraintEffect(OpIdx, CurRC,TII,TRI);
1015}
1016
1017constTargetRegisterClass *MachineInstr::getRegClassConstraintEffect(
1018unsigned OpIdx,constTargetRegisterClass *CurRC,
1019constTargetInstrInfo *TII,constTargetRegisterInfo *TRI) const{
1020constTargetRegisterClass *OpRC =getRegClassConstraint(OpIdx,TII,TRI);
1021constMachineOperand &MO =getOperand(OpIdx);
1022assert(MO.isReg() &&
1023"Cannot get register constraints for non-register operand");
1024assert(CurRC &&"Invalid initial register class");
1025if (unsigned SubIdx = MO.getSubReg()) {
1026if (OpRC)
1027 CurRC =TRI->getMatchingSuperRegClass(CurRC, OpRC, SubIdx);
1028else
1029 CurRC =TRI->getSubClassWithSubReg(CurRC, SubIdx);
1030 }elseif (OpRC)
1031 CurRC =TRI->getCommonSubClass(CurRC, OpRC);
1032return CurRC;
1033}
1034
1035/// Return the number of instructions inside the MI bundle, not counting the
1036/// header instruction.
1037unsignedMachineInstr::getBundleSize() const{
1038MachineBasicBlock::const_instr_iteratorI =getIterator();
1039unsignedSize = 0;
1040while (I->isBundledWithSucc()) {
1041 ++Size;
1042 ++I;
1043 }
1044returnSize;
1045}
1046
1047/// Returns true if the MachineInstr has an implicit-use operand of exactly
1048/// the given register (not considering sub/super-registers).
1049boolMachineInstr::hasRegisterImplicitUseOperand(Register Reg) const{
1050for (constMachineOperand &MO :implicit_operands()) {
1051if (MO.isReg() && MO.isUse() && MO.getReg() == Reg)
1052returntrue;
1053 }
1054returnfalse;
1055}
1056
1057/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of
1058/// the specific register or -1 if it is not found. It further tightens
1059/// the search criteria to a use that kills the register if isKill is true.
1060intMachineInstr::findRegisterUseOperandIdx(Register Reg,
1061constTargetRegisterInfo *TRI,
1062bool isKill) const{
1063for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
1064constMachineOperand &MO =getOperand(i);
1065if (!MO.isReg() || !MO.isUse())
1066continue;
1067Register MOReg = MO.getReg();
1068if (!MOReg)
1069continue;
1070if (MOReg == Reg || (TRI && Reg && MOReg &&TRI->regsOverlap(MOReg, Reg)))
1071if (!isKill || MO.isKill())
1072return i;
1073 }
1074return -1;
1075}
1076
1077/// readsWritesVirtualRegister - Return a pair of bools (reads, writes)
1078/// indicating if this instruction reads or writes Reg. This also considers
1079/// partial defines.
1080std::pair<bool,bool>
1081MachineInstr::readsWritesVirtualRegister(Register Reg,
1082SmallVectorImpl<unsigned> *Ops) const{
1083bool PartDef =false;// Partial redefine.
1084bool FullDef =false;// Full define.
1085boolUse =false;
1086
1087for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
1088constMachineOperand &MO =getOperand(i);
1089if (!MO.isReg() || MO.getReg() != Reg)
1090continue;
1091if (Ops)
1092 Ops->push_back(i);
1093if (MO.isUse())
1094Use |= !MO.isUndef();
1095elseif (MO.getSubReg() && !MO.isUndef())
1096// A partial def undef doesn't count as reading the register.
1097 PartDef =true;
1098else
1099 FullDef =true;
1100 }
1101// A partial redefine uses Reg unless there is also a full define.
1102return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef);
1103}
1104
1105/// findRegisterDefOperandIdx() - Returns the operand index that is a def of
1106/// the specified register or -1 if it is not found. If isDead is true, defs
1107/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
1108/// also checks if there is a def of a super-register.
1109intMachineInstr::findRegisterDefOperandIdx(Register Reg,
1110constTargetRegisterInfo *TRI,
1111boolisDead,bool Overlap) const{
1112bool isPhys = Reg.isPhysical();
1113for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
1114constMachineOperand &MO =getOperand(i);
1115// Accept regmask operands when Overlap is set.
1116// Ignore them when looking for a specific def operand (Overlap == false).
1117if (isPhys && Overlap && MO.isRegMask() && MO.clobbersPhysReg(Reg))
1118return i;
1119if (!MO.isReg() || !MO.isDef())
1120continue;
1121Register MOReg = MO.getReg();
1122bool Found = (MOReg == Reg);
1123if (!Found &&TRI && isPhys && MOReg.isPhysical()) {
1124if (Overlap)
1125 Found =TRI->regsOverlap(MOReg, Reg);
1126else
1127 Found =TRI->isSubRegister(MOReg, Reg);
1128 }
1129if (Found && (!isDead || MO.isDead()))
1130return i;
1131 }
1132return -1;
1133}
1134
1135/// findFirstPredOperandIdx() - Find the index of the first operand in the
1136/// operand list that is used to represent the predicate. It returns -1 if
1137/// none is found.
1138intMachineInstr::findFirstPredOperandIdx() const{
1139// Don't call MCID.findFirstPredOperandIdx() because this variant
1140// is sometimes called on an instruction that's not yet complete, and
1141// so the number of operands is less than the MCID indicates. In
1142// particular, the PTX target does this.
1143constMCInstrDesc &MCID =getDesc();
1144if (MCID.isPredicable()) {
1145for (unsigned i = 0, e =getNumOperands(); i != e; ++i)
1146if (MCID.operands()[i].isPredicate())
1147return i;
1148 }
1149
1150return -1;
1151}
1152
1153// MachineOperand::TiedTo is 4 bits wide.
1154constunsignedTiedMax = 15;
1155
1156/// tieOperands - Mark operands at DefIdx and UseIdx as tied to each other.
1157///
1158/// Use and def operands can be tied together, indicated by a non-zero TiedTo
1159/// field. TiedTo can have these values:
1160///
1161/// 0: Operand is not tied to anything.
1162/// 1 to TiedMax-1: Tied to getOperand(TiedTo-1).
1163/// TiedMax: Tied to an operand >= TiedMax-1.
1164///
1165/// The tied def must be one of the first TiedMax operands on a normal
1166/// instruction. INLINEASM instructions allow more tied defs.
1167///
1168voidMachineInstr::tieOperands(unsigned DefIdx,unsigned UseIdx) {
1169MachineOperand &DefMO =getOperand(DefIdx);
1170MachineOperand &UseMO =getOperand(UseIdx);
1171assert(DefMO.isDef() &&"DefIdx must be a def operand");
1172assert(UseMO.isUse() &&"UseIdx must be a use operand");
1173assert(!DefMO.isTied() &&"Def is already tied to another use");
1174assert(!UseMO.isTied() &&"Use is already tied to another def");
1175
1176if (DefIdx <TiedMax)
1177 UseMO.TiedTo = DefIdx + 1;
1178else {
1179// Inline asm can use the group descriptors to find tied operands,
1180// statepoint tied operands are trivial to match (1-1 reg def with reg use),
1181// but on normal instruction, the tied def must be within the first TiedMax
1182// operands.
1183assert((isInlineAsm() ||getOpcode() == TargetOpcode::STATEPOINT) &&
1184"DefIdx out of range");
1185 UseMO.TiedTo =TiedMax;
1186 }
1187
1188// UseIdx can be out of range, we'll search for it in findTiedOperandIdx().
1189 DefMO.TiedTo = std::min(UseIdx + 1,TiedMax);
1190}
1191
1192/// Given the index of a tied register operand, find the operand it is tied to.
1193/// Defs are tied to uses and vice versa. Returns the index of the tied operand
1194/// which must exist.
1195unsignedMachineInstr::findTiedOperandIdx(unsigned OpIdx) const{
1196constMachineOperand &MO =getOperand(OpIdx);
1197assert(MO.isTied() &&"Operand isn't tied");
1198
1199// Normally TiedTo is in range.
1200if (MO.TiedTo <TiedMax)
1201return MO.TiedTo - 1;
1202
1203// Uses on normal instructions can be out of range.
1204if (!isInlineAsm() &&getOpcode() != TargetOpcode::STATEPOINT) {
1205// Normal tied defs must be in the 0..TiedMax-1 range.
1206if (MO.isUse())
1207returnTiedMax - 1;
1208// MO is a def. Search for the tied use.
1209for (unsigned i =TiedMax - 1, e =getNumOperands(); i != e; ++i) {
1210constMachineOperand &UseMO =getOperand(i);
1211if (UseMO.isReg() && UseMO.isUse() && UseMO.TiedTo == OpIdx + 1)
1212return i;
1213 }
1214llvm_unreachable("Can't find tied use");
1215 }
1216
1217if (getOpcode() == TargetOpcode::STATEPOINT) {
1218// In STATEPOINT defs correspond 1-1 to GC pointer operands passed
1219// on registers.
1220StatepointOpers SO(this);
1221unsigned CurUseIdx = SO.getFirstGCPtrIdx();
1222assert(CurUseIdx != -1U &&"only gc pointer statepoint operands can be tied");
1223unsigned NumDefs =getNumDefs();
1224for (unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {
1225while (!getOperand(CurUseIdx).isReg())
1226 CurUseIdx =StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1227if (OpIdx == CurDefIdx)
1228return CurUseIdx;
1229if (OpIdx == CurUseIdx)
1230return CurDefIdx;
1231 CurUseIdx =StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1232 }
1233llvm_unreachable("Can't find tied use");
1234 }
1235
1236// Now deal with inline asm by parsing the operand group descriptor flags.
1237// Find the beginning of each operand group.
1238SmallVector<unsigned, 8> GroupIdx;
1239unsigned OpIdxGroup = ~0u;
1240unsigned NumOps;
1241for (unsigned i =InlineAsm::MIOp_FirstOperand, e =getNumOperands(); i < e;
1242 i += NumOps) {
1243constMachineOperand &FlagMO =getOperand(i);
1244assert(FlagMO.isImm() &&"Invalid tied operand on inline asm");
1245unsigned CurGroup = GroupIdx.size();
1246 GroupIdx.push_back(i);
1247constInlineAsm::FlagF(FlagMO.getImm());
1248 NumOps = 1 +F.getNumOperandRegisters();
1249// OpIdx belongs to this operand group.
1250if (OpIdx > i && OpIdx < i + NumOps)
1251 OpIdxGroup = CurGroup;
1252unsigned TiedGroup;
1253if (!F.isUseOperandTiedToDef(TiedGroup))
1254continue;
1255// Operands in this group are tied to operands in TiedGroup which must be
1256// earlier. Find the number of operands between the two groups.
1257unsigned Delta = i - GroupIdx[TiedGroup];
1258
1259// OpIdx is a use tied to TiedGroup.
1260if (OpIdxGroup == CurGroup)
1261return OpIdx - Delta;
1262
1263// OpIdx is a def tied to this use group.
1264if (OpIdxGroup == TiedGroup)
1265return OpIdx + Delta;
1266 }
1267llvm_unreachable("Invalid tied operand on inline asm");
1268}
1269
1270/// clearKillInfo - Clears kill flags on all operands.
1271///
1272voidMachineInstr::clearKillInfo() {
1273for (MachineOperand &MO :operands()) {
1274if (MO.isReg() && MO.isUse())
1275 MO.setIsKill(false);
1276 }
1277}
1278
1279voidMachineInstr::substituteRegister(Register FromReg,Register ToReg,
1280unsigned SubIdx,
1281constTargetRegisterInfo &RegInfo) {
1282if (ToReg.isPhysical()) {
1283if (SubIdx)
1284 ToReg = RegInfo.getSubReg(ToReg, SubIdx);
1285for (MachineOperand &MO :operands()) {
1286if (!MO.isReg() || MO.getReg() != FromReg)
1287continue;
1288 MO.substPhysReg(ToReg, RegInfo);
1289 }
1290 }else {
1291for (MachineOperand &MO :operands()) {
1292if (!MO.isReg() || MO.getReg() != FromReg)
1293continue;
1294 MO.substVirtReg(ToReg, SubIdx, RegInfo);
1295 }
1296 }
1297}
1298
1299/// isSafeToMove - Return true if it is safe to move this instruction. If
1300/// SawStore is set to true, it means that there is a store (or call) between
1301/// the instruction's location and its intended destination.
1302boolMachineInstr::isSafeToMove(bool &SawStore) const{
1303// Ignore stuff that we obviously can't move.
1304//
1305// Treat volatile loads as stores. This is not strictly necessary for
1306// volatiles, but it is required for atomic loads. It is not allowed to move
1307// a load across an atomic load with Ordering > Monotonic.
1308if (mayStore() ||isCall() ||isPHI() ||
1309 (mayLoad() &&hasOrderedMemoryRef())) {
1310 SawStore =true;
1311returnfalse;
1312 }
1313
1314if (isPosition() ||isDebugInstr() ||isTerminator() ||
1315mayRaiseFPException() ||hasUnmodeledSideEffects() ||
1316isJumpTableDebugInfo())
1317returnfalse;
1318
1319// See if this instruction does a load. If so, we have to guarantee that the
1320// loaded value doesn't change between the load and the its intended
1321// destination. The check for isInvariantLoad gives the target the chance to
1322// classify the load as always returning a constant, e.g. a constant pool
1323// load.
1324if (mayLoad() && !isDereferenceableInvariantLoad())
1325// Otherwise, this is a real load. If there is a store between the load and
1326// end of block, we can't move it.
1327return !SawStore;
1328
1329returntrue;
1330}
1331
1332boolMachineInstr::wouldBeTriviallyDead() const{
1333// Don't delete frame allocation labels.
1334// FIXME: Why is LOCAL_ESCAPE not considered in MachineInstr::isLabel?
1335if (getOpcode() == TargetOpcode::LOCAL_ESCAPE)
1336returnfalse;
1337
1338// Don't delete FAKE_USE.
1339// FIXME: Why is FAKE_USE not considered in MachineInstr::isPosition?
1340if (isFakeUse())
1341returnfalse;
1342
1343// LIFETIME markers should be preserved.
1344// FIXME: Why are LIFETIME markers not considered in MachineInstr::isPosition?
1345if (isLifetimeMarker())
1346returnfalse;
1347
1348// If we can move an instruction, we can remove it. Otherwise, it has
1349// a side-effect of some sort.
1350bool SawStore =false;
1351returnisPHI() ||isSafeToMove(SawStore);
1352}
1353
1354boolMachineInstr::isDead(constMachineRegisterInfo &MRI,
1355LiveRegUnits *LivePhysRegs) const{
1356// Instructions without side-effects are dead iff they only define dead regs.
1357// This function is hot and this loop returns early in the common case,
1358// so only perform additional checks before this if absolutely necessary.
1359for (constMachineOperand &MO :all_defs()) {
1360Register Reg = MO.getReg();
1361if (Reg.isPhysical()) {
1362// Don't delete live physreg defs, or any reserved register defs.
1363if (!LivePhysRegs || !LivePhysRegs->available(Reg) ||MRI.isReserved(Reg))
1364returnfalse;
1365 }else {
1366if (MO.isDead())
1367continue;
1368for (constMachineInstr &Use :MRI.use_nodbg_instructions(Reg)) {
1369if (&Use !=this)
1370// This def has a non-debug use. Don't delete the instruction!
1371returnfalse;
1372 }
1373 }
1374 }
1375
1376// Technically speaking inline asm without side effects and no defs can still
1377// be deleted. But there is so much bad inline asm code out there, we should
1378// let them be.
1379if (isInlineAsm())
1380returnfalse;
1381
1382// FIXME: See issue #105950 for why LIFETIME markers are considered dead here.
1383if (isLifetimeMarker())
1384returntrue;
1385
1386// If there are no defs with uses, then we call the instruction dead so long
1387// as we do not suspect it may have sideeffects.
1388returnwouldBeTriviallyDead();
1389}
1390
1391staticboolMemOperandsHaveAlias(constMachineFrameInfo &MFI,
1392BatchAAResults *AA,boolUseTBAA,
1393constMachineMemOperand *MMOa,
1394constMachineMemOperand *MMOb) {
1395// The following interface to AA is fashioned after DAGCombiner::isAlias and
1396// operates with MachineMemOperand offset with some important assumptions:
1397// - LLVM fundamentally assumes flat address spaces.
1398// - MachineOperand offset can *only* result from legalization and cannot
1399// affect queries other than the trivial case of overlap checking.
1400// - These offsets never wrap and never step outside of allocated objects.
1401// - There should never be any negative offsets here.
1402//
1403// FIXME: Modify API to hide this math from "user"
1404// Even before we go to AA we can reason locally about some memory objects. It
1405// can save compile time, and possibly catch some corner cases not currently
1406// covered.
1407
1408 int64_t OffsetA = MMOa->getOffset();
1409 int64_t OffsetB = MMOb->getOffset();
1410 int64_t MinOffset = std::min(OffsetA, OffsetB);
1411
1412LocationSize WidthA = MMOa->getSize();
1413LocationSize WidthB = MMOb->getSize();
1414bool KnownWidthA = WidthA.hasValue();
1415bool KnownWidthB = WidthB.hasValue();
1416bool BothMMONonScalable = !WidthA.isScalable() && !WidthB.isScalable();
1417
1418constValue *ValA = MMOa->getValue();
1419constValue *ValB = MMOb->getValue();
1420bool SameVal = (ValA && ValB && (ValA == ValB));
1421if (!SameVal) {
1422constPseudoSourceValue *PSVa = MMOa->getPseudoValue();
1423constPseudoSourceValue *PSVb = MMOb->getPseudoValue();
1424if (PSVa && ValB && !PSVa->mayAlias(&MFI))
1425returnfalse;
1426if (PSVb && ValA && !PSVb->mayAlias(&MFI))
1427returnfalse;
1428if (PSVa && PSVb && (PSVa == PSVb))
1429 SameVal =true;
1430 }
1431
1432if (SameVal && BothMMONonScalable) {
1433if (!KnownWidthA || !KnownWidthB)
1434returntrue;
1435 int64_t MaxOffset = std::max(OffsetA, OffsetB);
1436 int64_t LowWidth = (MinOffset == OffsetA)
1437 ? WidthA.getValue().getKnownMinValue()
1438 : WidthB.getValue().getKnownMinValue();
1439return (MinOffset + LowWidth > MaxOffset);
1440 }
1441
1442if (!AA)
1443returntrue;
1444
1445if (!ValA || !ValB)
1446returntrue;
1447
1448assert((OffsetA >= 0) &&"Negative MachineMemOperand offset");
1449assert((OffsetB >= 0) &&"Negative MachineMemOperand offset");
1450
1451// If Scalable Location Size has non-zero offset, Width + Offset does not work
1452// at the moment
1453if ((WidthA.isScalable() && OffsetA > 0) ||
1454 (WidthB.isScalable() && OffsetB > 0))
1455returntrue;
1456
1457 int64_t OverlapA =
1458 KnownWidthA ? WidthA.getValue().getKnownMinValue() + OffsetA - MinOffset
1459 :MemoryLocation::UnknownSize;
1460 int64_t OverlapB =
1461 KnownWidthB ? WidthB.getValue().getKnownMinValue() + OffsetB - MinOffset
1462 :MemoryLocation::UnknownSize;
1463
1464LocationSize LocA = (WidthA.isScalable() || !KnownWidthA)
1465 ? WidthA
1466 :LocationSize::precise(OverlapA);
1467LocationSize LocB = (WidthB.isScalable() || !KnownWidthB)
1468 ? WidthB
1469 :LocationSize::precise(OverlapB);
1470
1471return !AA->isNoAlias(
1472MemoryLocation(ValA, LocA,UseTBAA ? MMOa->getAAInfo() :AAMDNodes()),
1473MemoryLocation(ValB, LocB,UseTBAA ? MMOb->getAAInfo() :AAMDNodes()));
1474}
1475
1476boolMachineInstr::mayAlias(BatchAAResults *AA,constMachineInstr &Other,
1477boolUseTBAA) const{
1478constMachineFunction *MF =getMF();
1479constTargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
1480constMachineFrameInfo &MFI = MF->getFrameInfo();
1481
1482// Exclude call instruction which may alter the memory but can not be handled
1483// by this function.
1484if (isCall() ||Other.isCall())
1485returntrue;
1486
1487// If neither instruction stores to memory, they can't alias in any
1488// meaningful way, even if they read from the same address.
1489if (!mayStore() && !Other.mayStore())
1490returnfalse;
1491
1492// Both instructions must be memory operations to be able to alias.
1493if (!mayLoadOrStore() || !Other.mayLoadOrStore())
1494returnfalse;
1495
1496// Let the target decide if memory accesses cannot possibly overlap.
1497if (TII->areMemAccessesTriviallyDisjoint(*this,Other))
1498returnfalse;
1499
1500// Memory operations without memory operands may access anything. Be
1501// conservative and assume `MayAlias`.
1502if (memoperands_empty() ||Other.memoperands_empty())
1503returntrue;
1504
1505// Skip if there are too many memory operands.
1506auto NumChecks =getNumMemOperands() *Other.getNumMemOperands();
1507if (NumChecks >TII->getMemOperandAACheckLimit())
1508returntrue;
1509
1510// Check each pair of memory operands from both instructions, which can't
1511// alias only if all pairs won't alias.
1512for (auto *MMOa :memoperands())
1513for (auto *MMOb :Other.memoperands())
1514if (MemOperandsHaveAlias(MFI, AA,UseTBAA, MMOa, MMOb))
1515returntrue;
1516
1517returnfalse;
1518}
1519
1520boolMachineInstr::mayAlias(AAResults *AA,constMachineInstr &Other,
1521boolUseTBAA) const{
1522if (AA) {
1523BatchAAResults BAA(*AA);
1524returnmayAlias(&BAA,Other,UseTBAA);
1525 }
1526returnmayAlias(static_cast<BatchAAResults *>(nullptr),Other,UseTBAA);
1527}
1528
1529/// hasOrderedMemoryRef - Return true if this instruction may have an ordered
1530/// or volatile memory reference, or if the information describing the memory
1531/// reference is not available. Return false if it is known to have no ordered
1532/// memory references.
1533boolMachineInstr::hasOrderedMemoryRef() const{
1534// An instruction known never to access memory won't have a volatile access.
1535if (!mayStore() &&
1536 !mayLoad() &&
1537 !isCall() &&
1538 !hasUnmodeledSideEffects())
1539returnfalse;
1540
1541// Otherwise, if the instruction has no memory reference information,
1542// conservatively assume it wasn't preserved.
1543if (memoperands_empty())
1544returntrue;
1545
1546// Check if any of our memory operands are ordered.
1547returnllvm::any_of(memoperands(), [](constMachineMemOperand *MMO) {
1548return !MMO->isUnordered();
1549 });
1550}
1551
1552/// isDereferenceableInvariantLoad - Return true if this instruction will never
1553/// trap and is loading from a location whose value is invariant across a run of
1554/// this function.
1555boolMachineInstr::isDereferenceableInvariantLoad() const{
1556// If the instruction doesn't load at all, it isn't an invariant load.
1557if (!mayLoad())
1558returnfalse;
1559
1560// If the instruction has lost its memoperands, conservatively assume that
1561// it may not be an invariant load.
1562if (memoperands_empty())
1563returnfalse;
1564
1565constMachineFrameInfo &MFI =getParent()->getParent()->getFrameInfo();
1566
1567for (MachineMemOperand *MMO :memoperands()) {
1568if (!MMO->isUnordered())
1569// If the memory operand has ordering side effects, we can't move the
1570// instruction. Such an instruction is technically an invariant load,
1571// but the caller code would need updated to expect that.
1572returnfalse;
1573if (MMO->isStore())returnfalse;
1574if (MMO->isInvariant() && MMO->isDereferenceable())
1575continue;
1576
1577// A load from a constant PseudoSourceValue is invariant.
1578if (constPseudoSourceValue *PSV = MMO->getPseudoValue()) {
1579if (PSV->isConstant(&MFI))
1580continue;
1581 }
1582
1583// Otherwise assume conservatively.
1584returnfalse;
1585 }
1586
1587// Everything checks out.
1588returntrue;
1589}
1590
1591RegisterMachineInstr::isConstantValuePHI() const{
1592if (!isPHI())
1593return {};
1594assert(getNumOperands() >= 3 &&
1595"It's illegal to have a PHI without source operands");
1596
1597Register Reg =getOperand(1).getReg();
1598for (unsigned i = 3, e =getNumOperands(); i < e; i += 2)
1599if (getOperand(i).getReg() != Reg)
1600return {};
1601return Reg;
1602}
1603
1604boolMachineInstr::hasUnmodeledSideEffects() const{
1605if (hasProperty(MCID::UnmodeledSideEffects))
1606returntrue;
1607if (isInlineAsm()) {
1608unsigned ExtraInfo =getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1609if (ExtraInfo &InlineAsm::Extra_HasSideEffects)
1610returntrue;
1611 }
1612
1613returnfalse;
1614}
1615
1616boolMachineInstr::isLoadFoldBarrier() const{
1617returnmayStore() ||isCall() ||
1618 (hasUnmodeledSideEffects() && !isPseudoProbe());
1619}
1620
1621/// allDefsAreDead - Return true if all the defs of this instruction are dead.
1622///
1623boolMachineInstr::allDefsAreDead() const{
1624for (constMachineOperand &MO :operands()) {
1625if (!MO.isReg() || MO.isUse())
1626continue;
1627if (!MO.isDead())
1628returnfalse;
1629 }
1630returntrue;
1631}
1632
1633boolMachineInstr::allImplicitDefsAreDead() const{
1634for (constMachineOperand &MO :implicit_operands()) {
1635if (!MO.isReg() || MO.isUse())
1636continue;
1637if (!MO.isDead())
1638returnfalse;
1639 }
1640returntrue;
1641}
1642
1643/// copyImplicitOps - Copy implicit register operands from specified
1644/// instruction to this instruction.
1645voidMachineInstr::copyImplicitOps(MachineFunction &MF,
1646constMachineInstr &MI) {
1647for (constMachineOperand &MO :
1648llvm::drop_begin(MI.operands(),MI.getDesc().getNumOperands()))
1649if ((MO.isReg() && MO.isImplicit()) || MO.isRegMask())
1650addOperand(MF, MO);
1651}
1652
1653boolMachineInstr::hasComplexRegisterTies() const{
1654constMCInstrDesc &MCID =getDesc();
1655if (MCID.Opcode == TargetOpcode::STATEPOINT)
1656returntrue;
1657for (unsignedI = 0, E =getNumOperands();I < E; ++I) {
1658constauto &Operand =getOperand(I);
1659if (!Operand.isReg() || Operand.isDef())
1660// Ignore the defined registers as MCID marks only the uses as tied.
1661continue;
1662int ExpectedTiedIdx = MCID.getOperandConstraint(I,MCOI::TIED_TO);
1663int TiedIdx = Operand.isTied() ? int(findTiedOperandIdx(I)) : -1;
1664if (ExpectedTiedIdx != TiedIdx)
1665returntrue;
1666 }
1667returnfalse;
1668}
1669
1670LLTMachineInstr::getTypeToPrint(unsigned OpIdx,SmallBitVector &PrintedTypes,
1671constMachineRegisterInfo &MRI) const{
1672constMachineOperand &Op =getOperand(OpIdx);
1673if (!Op.isReg())
1674returnLLT{};
1675
1676if (isVariadic() || OpIdx >=getNumExplicitOperands())
1677returnMRI.getType(Op.getReg());
1678
1679auto &OpInfo =getDesc().operands()[OpIdx];
1680if (!OpInfo.isGenericType())
1681returnMRI.getType(Op.getReg());
1682
1683if (PrintedTypes[OpInfo.getGenericTypeIndex()])
1684returnLLT{};
1685
1686LLT TypeToPrint =MRI.getType(Op.getReg());
1687// Don't mark the type index printed if it wasn't actually printed: maybe
1688// another operand with the same type index has an actual type attached:
1689if (TypeToPrint.isValid())
1690 PrintedTypes.set(OpInfo.getGenericTypeIndex());
1691return TypeToPrint;
1692}
1693
1694#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1695LLVM_DUMP_METHODvoidMachineInstr::dump() const{
1696dbgs() <<" ";
1697print(dbgs());
1698}
1699
1700LLVM_DUMP_METHODvoid MachineInstr::dumprImpl(
1701constMachineRegisterInfo &MRI,unsignedDepth,unsigned MaxDepth,
1702SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const{
1703if (Depth >= MaxDepth)
1704return;
1705if (!AlreadySeenInstrs.insert(this).second)
1706return;
1707// PadToColumn always inserts at least one space.
1708// Don't mess up the alignment if we don't want any space.
1709if (Depth)
1710fdbgs().PadToColumn(Depth * 2);
1711print(fdbgs());
1712for (constMachineOperand &MO :operands()) {
1713if (!MO.isReg() || MO.isDef())
1714continue;
1715Register Reg = MO.getReg();
1716if (Reg.isPhysical())
1717continue;
1718constMachineInstr *NewMI =MRI.getUniqueVRegDef(Reg);
1719if (NewMI ==nullptr)
1720continue;
1721 NewMI->dumprImpl(MRI,Depth + 1, MaxDepth, AlreadySeenInstrs);
1722 }
1723}
1724
1725LLVM_DUMP_METHODvoidMachineInstr::dumpr(constMachineRegisterInfo &MRI,
1726unsigned MaxDepth) const{
1727SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;
1728 dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
1729}
1730#endif
1731
1732voidMachineInstr::print(raw_ostream &OS,bool IsStandalone,bool SkipOpers,
1733bool SkipDebugLoc,bool AddNewLine,
1734constTargetInstrInfo *TII) const{
1735constModule *M =nullptr;
1736constFunction *F =nullptr;
1737if (constMachineFunction *MF =getMFIfAvailable(*this)) {
1738F = &MF->getFunction();
1739 M =F->getParent();
1740if (!TII)
1741TII = MF->getSubtarget().getInstrInfo();
1742 }
1743
1744ModuleSlotTracker MST(M);
1745if (F)
1746 MST.incorporateFunction(*F);
1747print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine,TII);
1748}
1749
1750voidMachineInstr::print(raw_ostream &OS,ModuleSlotTracker &MST,
1751bool IsStandalone,bool SkipOpers,bool SkipDebugLoc,
1752bool AddNewLine,constTargetInstrInfo *TII) const{
1753// We can be a bit tidier if we know the MachineFunction.
1754constTargetRegisterInfo *TRI =nullptr;
1755constMachineRegisterInfo *MRI =nullptr;
1756constTargetIntrinsicInfo *IntrinsicInfo =nullptr;
1757tryToGetTargetInfo(*this,TRI,MRI, IntrinsicInfo,TII);
1758
1759if (isCFIInstruction())
1760assert(getNumOperands() == 1 &&"Expected 1 operand in CFI instruction");
1761
1762SmallBitVector PrintedTypes(8);
1763bool ShouldPrintRegisterTies = IsStandalone ||hasComplexRegisterTies();
1764auto getTiedOperandIdx = [&](unsigned OpIdx) {
1765if (!ShouldPrintRegisterTies)
1766return 0U;
1767constMachineOperand &MO =getOperand(OpIdx);
1768if (MO.isReg() && MO.isTied() && !MO.isDef())
1769returnfindTiedOperandIdx(OpIdx);
1770return 0U;
1771 };
1772unsigned StartOp = 0;
1773unsigned e =getNumOperands();
1774
1775// Print explicitly defined operands on the left of an assignment syntax.
1776while (StartOp < e) {
1777constMachineOperand &MO =getOperand(StartOp);
1778if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
1779break;
1780
1781if (StartOp != 0)
1782OS <<", ";
1783
1784LLT TypeToPrint =MRI ?getTypeToPrint(StartOp, PrintedTypes, *MRI) :LLT{};
1785unsigned TiedOperandIdx = getTiedOperandIdx(StartOp);
1786 MO.print(OS, MST, TypeToPrint, StartOp,/*PrintDef=*/false, IsStandalone,
1787 ShouldPrintRegisterTies, TiedOperandIdx,TRI, IntrinsicInfo);
1788 ++StartOp;
1789 }
1790
1791if (StartOp != 0)
1792OS <<" = ";
1793
1794if (getFlag(MachineInstr::FrameSetup))
1795OS <<"frame-setup ";
1796if (getFlag(MachineInstr::FrameDestroy))
1797OS <<"frame-destroy ";
1798if (getFlag(MachineInstr::FmNoNans))
1799OS <<"nnan ";
1800if (getFlag(MachineInstr::FmNoInfs))
1801OS <<"ninf ";
1802if (getFlag(MachineInstr::FmNsz))
1803OS <<"nsz ";
1804if (getFlag(MachineInstr::FmArcp))
1805OS <<"arcp ";
1806if (getFlag(MachineInstr::FmContract))
1807OS <<"contract ";
1808if (getFlag(MachineInstr::FmAfn))
1809OS <<"afn ";
1810if (getFlag(MachineInstr::FmReassoc))
1811OS <<"reassoc ";
1812if (getFlag(MachineInstr::NoUWrap))
1813OS <<"nuw ";
1814if (getFlag(MachineInstr::NoSWrap))
1815OS <<"nsw ";
1816if (getFlag(MachineInstr::IsExact))
1817OS <<"exact ";
1818if (getFlag(MachineInstr::NoFPExcept))
1819OS <<"nofpexcept ";
1820if (getFlag(MachineInstr::NoMerge))
1821OS <<"nomerge ";
1822if (getFlag(MachineInstr::NonNeg))
1823OS <<"nneg ";
1824if (getFlag(MachineInstr::Disjoint))
1825OS <<"disjoint ";
1826if (getFlag(MachineInstr::SameSign))
1827OS <<"samesign ";
1828
1829// Print the opcode name.
1830if (TII)
1831OS <<TII->getName(getOpcode());
1832else
1833OS <<"UNKNOWN";
1834
1835if (SkipOpers)
1836return;
1837
1838// Print the rest of the operands.
1839bool FirstOp =true;
1840unsigned AsmDescOp = ~0u;
1841unsigned AsmOpCount = 0;
1842
1843if (isInlineAsm() && e >=InlineAsm::MIOp_FirstOperand) {
1844// Print asm string.
1845OS <<" ";
1846constunsigned OpIdx =InlineAsm::MIOp_AsmString;
1847LLT TypeToPrint =MRI ?getTypeToPrint(OpIdx, PrintedTypes, *MRI) :LLT{};
1848unsigned TiedOperandIdx = getTiedOperandIdx(OpIdx);
1849getOperand(OpIdx).print(OS, MST, TypeToPrint, OpIdx,/*PrintDef=*/true, IsStandalone,
1850 ShouldPrintRegisterTies, TiedOperandIdx,TRI,
1851 IntrinsicInfo);
1852
1853// Print HasSideEffects, MayLoad, MayStore, IsAlignStack
1854unsigned ExtraInfo =getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1855if (ExtraInfo &InlineAsm::Extra_HasSideEffects)
1856OS <<" [sideeffect]";
1857if (ExtraInfo &InlineAsm::Extra_MayLoad)
1858OS <<" [mayload]";
1859if (ExtraInfo &InlineAsm::Extra_MayStore)
1860OS <<" [maystore]";
1861if (ExtraInfo &InlineAsm::Extra_IsConvergent)
1862OS <<" [isconvergent]";
1863if (ExtraInfo &InlineAsm::Extra_IsAlignStack)
1864OS <<" [alignstack]";
1865if (getInlineAsmDialect() ==InlineAsm::AD_ATT)
1866OS <<" [attdialect]";
1867if (getInlineAsmDialect() ==InlineAsm::AD_Intel)
1868OS <<" [inteldialect]";
1869
1870 StartOp = AsmDescOp =InlineAsm::MIOp_FirstOperand;
1871 FirstOp =false;
1872 }
1873
1874for (unsigned i = StartOp, e =getNumOperands(); i != e; ++i) {
1875constMachineOperand &MO =getOperand(i);
1876
1877if (FirstOp) FirstOp =false;elseOS <<",";
1878OS <<" ";
1879
1880if (isDebugValueLike() && MO.isMetadata()) {
1881// Pretty print DBG_VALUE* instructions.
1882auto *DIV = dyn_cast<DILocalVariable>(MO.getMetadata());
1883if (DIV && !DIV->getName().empty())
1884OS <<"!\"" << DIV->getName() <<'\"';
1885else {
1886LLT TypeToPrint =MRI ?getTypeToPrint(i, PrintedTypes, *MRI) :LLT{};
1887unsigned TiedOperandIdx = getTiedOperandIdx(i);
1888 MO.print(OS, MST, TypeToPrint, i,/*PrintDef=*/true, IsStandalone,
1889 ShouldPrintRegisterTies, TiedOperandIdx,TRI, IntrinsicInfo);
1890 }
1891 }elseif (isDebugLabel() && MO.isMetadata()) {
1892// Pretty print DBG_LABEL instructions.
1893auto *DIL = dyn_cast<DILabel>(MO.getMetadata());
1894if (DIL && !DIL->getName().empty())
1895OS <<"\"" << DIL->getName() <<'\"';
1896else {
1897LLT TypeToPrint =MRI ?getTypeToPrint(i, PrintedTypes, *MRI) :LLT{};
1898unsigned TiedOperandIdx = getTiedOperandIdx(i);
1899 MO.print(OS, MST, TypeToPrint, i,/*PrintDef=*/true, IsStandalone,
1900 ShouldPrintRegisterTies, TiedOperandIdx,TRI, IntrinsicInfo);
1901 }
1902 }elseif (i == AsmDescOp && MO.isImm()) {
1903// Pretty print the inline asm operand descriptor.
1904OS <<'$' << AsmOpCount++;
1905unsigned Flag = MO.getImm();
1906constInlineAsm::FlagF(Flag);
1907OS <<":[";
1908OS <<F.getKindName();
1909
1910unsigned RCID;
1911if (!F.isImmKind() && !F.isMemKind() &&F.hasRegClassConstraint(RCID)) {
1912if (TRI) {
1913OS <<':' <<TRI->getRegClassName(TRI->getRegClass(RCID));
1914 }else
1915OS <<":RC" << RCID;
1916 }
1917
1918if (F.isMemKind()) {
1919constInlineAsm::ConstraintCode MCID =F.getMemoryConstraintID();
1920OS <<":" <<InlineAsm::getMemConstraintName(MCID);
1921 }
1922
1923unsigned TiedTo;
1924if (F.isUseOperandTiedToDef(TiedTo))
1925OS <<" tiedto:$" << TiedTo;
1926
1927if ((F.isRegDefKind() ||F.isRegDefEarlyClobberKind() ||
1928F.isRegUseKind()) &&
1929F.getRegMayBeFolded()) {
1930OS <<" foldable";
1931 }
1932
1933OS <<']';
1934
1935// Compute the index of the next operand descriptor.
1936 AsmDescOp += 1 +F.getNumOperandRegisters();
1937 }else {
1938LLT TypeToPrint =MRI ?getTypeToPrint(i, PrintedTypes, *MRI) :LLT{};
1939unsigned TiedOperandIdx = getTiedOperandIdx(i);
1940if (MO.isImm() &&isOperandSubregIdx(i))
1941MachineOperand::printSubRegIdx(OS, MO.getImm(),TRI);
1942else
1943 MO.print(OS, MST, TypeToPrint, i,/*PrintDef=*/true, IsStandalone,
1944 ShouldPrintRegisterTies, TiedOperandIdx,TRI, IntrinsicInfo);
1945 }
1946 }
1947
1948// Print any optional symbols attached to this instruction as-if they were
1949// operands.
1950if (MCSymbol *PreInstrSymbol =getPreInstrSymbol()) {
1951if (!FirstOp) {
1952 FirstOp =false;
1953OS <<',';
1954 }
1955OS <<" pre-instr-symbol ";
1956MachineOperand::printSymbol(OS, *PreInstrSymbol);
1957 }
1958if (MCSymbol *PostInstrSymbol =getPostInstrSymbol()) {
1959if (!FirstOp) {
1960 FirstOp =false;
1961OS <<',';
1962 }
1963OS <<" post-instr-symbol ";
1964MachineOperand::printSymbol(OS, *PostInstrSymbol);
1965 }
1966if (MDNode *HeapAllocMarker =getHeapAllocMarker()) {
1967if (!FirstOp) {
1968 FirstOp =false;
1969OS <<',';
1970 }
1971OS <<" heap-alloc-marker ";
1972 HeapAllocMarker->printAsOperand(OS, MST);
1973 }
1974if (MDNode *PCSections =getPCSections()) {
1975if (!FirstOp) {
1976 FirstOp =false;
1977OS <<',';
1978 }
1979OS <<" pcsections ";
1980 PCSections->printAsOperand(OS, MST);
1981 }
1982if (MDNode *MMRA =getMMRAMetadata()) {
1983if (!FirstOp) {
1984 FirstOp =false;
1985OS <<',';
1986 }
1987OS <<" mmra ";
1988 MMRA->printAsOperand(OS, MST);
1989 }
1990if (uint32_t CFIType =getCFIType()) {
1991if (!FirstOp)
1992OS <<',';
1993OS <<" cfi-type " << CFIType;
1994 }
1995
1996if (DebugInstrNum) {
1997if (!FirstOp)
1998OS <<",";
1999OS <<" debug-instr-number " << DebugInstrNum;
2000 }
2001
2002if (!SkipDebugLoc) {
2003if (constDebugLoc &DL =getDebugLoc()) {
2004if (!FirstOp)
2005OS <<',';
2006OS <<" debug-location ";
2007DL->printAsOperand(OS, MST);
2008 }
2009 }
2010
2011if (!memoperands_empty()) {
2012SmallVector<StringRef, 0> SSNs;
2013constLLVMContext *Context =nullptr;
2014 std::unique_ptr<LLVMContext> CtxPtr;
2015constMachineFrameInfo *MFI =nullptr;
2016if (constMachineFunction *MF =getMFIfAvailable(*this)) {
2017 MFI = &MF->getFrameInfo();
2018 Context = &MF->getFunction().getContext();
2019 }else {
2020 CtxPtr = std::make_unique<LLVMContext>();
2021 Context = CtxPtr.get();
2022 }
2023
2024OS <<" :: ";
2025bool NeedComma =false;
2026for (constMachineMemOperand *Op :memoperands()) {
2027if (NeedComma)
2028OS <<", ";
2029Op->print(OS, MST, SSNs, *Context, MFI,TII);
2030 NeedComma =true;
2031 }
2032 }
2033
2034if (SkipDebugLoc)
2035return;
2036
2037bool HaveSemi =false;
2038
2039// Print debug location information.
2040if (constDebugLoc &DL =getDebugLoc()) {
2041if (!HaveSemi) {
2042OS <<';';
2043 HaveSemi =true;
2044 }
2045OS <<' ';
2046DL.print(OS);
2047 }
2048
2049// Print extra comments for DEBUG_VALUE and friends if they are well-formed.
2050if ((isNonListDebugValue() &&getNumOperands() >= 4) ||
2051 (isDebugValueList() &&getNumOperands() >= 2) ||
2052 (isDebugRef() &&getNumOperands() >= 3)) {
2053if (getDebugVariableOp().isMetadata()) {
2054if (!HaveSemi) {
2055OS <<";";
2056 HaveSemi =true;
2057 }
2058auto *DV =getDebugVariable();
2059OS <<" line no:" << DV->getLine();
2060if (isIndirectDebugValue())
2061OS <<" indirect";
2062 }
2063 }
2064// TODO: DBG_LABEL
2065
2066if (AddNewLine)
2067OS <<'\n';
2068}
2069
2070boolMachineInstr::addRegisterKilled(Register IncomingReg,
2071constTargetRegisterInfo *RegInfo,
2072bool AddIfNotFound) {
2073bool isPhysReg = IncomingReg.isPhysical();
2074bool hasAliases = isPhysReg &&
2075MCRegAliasIterator(IncomingReg, RegInfo,false).isValid();
2076bool Found =false;
2077SmallVector<unsigned,4> DeadOps;
2078for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
2079MachineOperand &MO =getOperand(i);
2080if (!MO.isReg() || !MO.isUse() || MO.isUndef())
2081continue;
2082
2083// DEBUG_VALUE nodes do not contribute to code generation and should
2084// always be ignored. Failure to do so may result in trying to modify
2085// KILL flags on DEBUG_VALUE nodes.
2086if (MO.isDebug())
2087continue;
2088
2089Register Reg = MO.getReg();
2090if (!Reg)
2091continue;
2092
2093if (Reg == IncomingReg) {
2094if (!Found) {
2095if (MO.isKill())
2096// The register is already marked kill.
2097returntrue;
2098if (isPhysReg &&isRegTiedToDefOperand(i))
2099// Two-address uses of physregs must not be marked kill.
2100returntrue;
2101 MO.setIsKill();
2102 Found =true;
2103 }
2104 }elseif (hasAliases && MO.isKill() && Reg.isPhysical()) {
2105// A super-register kill already exists.
2106if (RegInfo->isSuperRegister(IncomingReg, Reg))
2107returntrue;
2108if (RegInfo->isSubRegister(IncomingReg, Reg))
2109 DeadOps.push_back(i);
2110 }
2111 }
2112
2113// Trim unneeded kill operands.
2114while (!DeadOps.empty()) {
2115unsigned OpIdx = DeadOps.back();
2116if (getOperand(OpIdx).isImplicit() &&
2117 (!isInlineAsm() ||findInlineAsmFlagIdx(OpIdx) < 0))
2118removeOperand(OpIdx);
2119else
2120getOperand(OpIdx).setIsKill(false);
2121 DeadOps.pop_back();
2122 }
2123
2124// If not found, this means an alias of one of the operands is killed. Add a
2125// new implicit operand if required.
2126if (!Found && AddIfNotFound) {
2127addOperand(MachineOperand::CreateReg(IncomingReg,
2128false/*IsDef*/,
2129true/*IsImp*/,
2130true/*IsKill*/));
2131returntrue;
2132 }
2133return Found;
2134}
2135
2136voidMachineInstr::clearRegisterKills(Register Reg,
2137constTargetRegisterInfo *RegInfo) {
2138if (!Reg.isPhysical())
2139 RegInfo =nullptr;
2140for (MachineOperand &MO :operands()) {
2141if (!MO.isReg() || !MO.isUse() || !MO.isKill())
2142continue;
2143Register OpReg = MO.getReg();
2144if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)
2145 MO.setIsKill(false);
2146 }
2147}
2148
2149boolMachineInstr::addRegisterDead(Register Reg,
2150constTargetRegisterInfo *RegInfo,
2151bool AddIfNotFound) {
2152bool isPhysReg = Reg.isPhysical();
2153bool hasAliases = isPhysReg &&
2154MCRegAliasIterator(Reg, RegInfo,false).isValid();
2155bool Found =false;
2156SmallVector<unsigned,4> DeadOps;
2157for (unsigned i = 0, e =getNumOperands(); i != e; ++i) {
2158MachineOperand &MO =getOperand(i);
2159if (!MO.isReg() || !MO.isDef())
2160continue;
2161Register MOReg = MO.getReg();
2162if (!MOReg)
2163continue;
2164
2165if (MOReg == Reg) {
2166 MO.setIsDead();
2167 Found =true;
2168 }elseif (hasAliases && MO.isDead() && MOReg.isPhysical()) {
2169// There exists a super-register that's marked dead.
2170if (RegInfo->isSuperRegister(Reg, MOReg))
2171returntrue;
2172if (RegInfo->isSubRegister(Reg, MOReg))
2173 DeadOps.push_back(i);
2174 }
2175 }
2176
2177// Trim unneeded dead operands.
2178while (!DeadOps.empty()) {
2179unsigned OpIdx = DeadOps.back();
2180if (getOperand(OpIdx).isImplicit() &&
2181 (!isInlineAsm() ||findInlineAsmFlagIdx(OpIdx) < 0))
2182removeOperand(OpIdx);
2183else
2184getOperand(OpIdx).setIsDead(false);
2185 DeadOps.pop_back();
2186 }
2187
2188// If not found, this means an alias of one of the operands is dead. Add a
2189// new implicit operand if required.
2190if (Found || !AddIfNotFound)
2191return Found;
2192
2193addOperand(MachineOperand::CreateReg(Reg,
2194true/*IsDef*/,
2195true/*IsImp*/,
2196false/*IsKill*/,
2197true/*IsDead*/));
2198returntrue;
2199}
2200
2201voidMachineInstr::clearRegisterDeads(Register Reg) {
2202for (MachineOperand &MO :all_defs())
2203if (MO.getReg() == Reg)
2204 MO.setIsDead(false);
2205}
2206
2207voidMachineInstr::setRegisterDefReadUndef(Register Reg,bool IsUndef) {
2208for (MachineOperand &MO :all_defs())
2209if (MO.getReg() == Reg && MO.getSubReg() != 0)
2210 MO.setIsUndef(IsUndef);
2211}
2212
2213voidMachineInstr::addRegisterDefined(Register Reg,
2214constTargetRegisterInfo *RegInfo) {
2215if (Reg.isPhysical()) {
2216MachineOperand *MO =findRegisterDefOperand(Reg, RegInfo,false,false);
2217if (MO)
2218return;
2219 }else {
2220for (constMachineOperand &MO :all_defs()) {
2221if (MO.getReg() == Reg && MO.getSubReg() == 0)
2222return;
2223 }
2224 }
2225addOperand(MachineOperand::CreateReg(Reg,
2226true/*IsDef*/,
2227true/*IsImp*/));
2228}
2229
2230voidMachineInstr::setPhysRegsDeadExcept(ArrayRef<Register> UsedRegs,
2231constTargetRegisterInfo &TRI) {
2232bool HasRegMask =false;
2233for (MachineOperand &MO :operands()) {
2234if (MO.isRegMask()) {
2235 HasRegMask =true;
2236continue;
2237 }
2238if (!MO.isReg() || !MO.isDef())continue;
2239Register Reg = MO.getReg();
2240if (!Reg.isPhysical())
2241continue;
2242// If there are no uses, including partial uses, the def is dead.
2243if (llvm::none_of(UsedRegs,
2244 [&](MCRegisterUse) {returnTRI.regsOverlap(Use, Reg); }))
2245 MO.setIsDead();
2246 }
2247
2248// This is a call with a register mask operand.
2249// Mask clobbers are always dead, so add defs for the non-dead defines.
2250if (HasRegMask)
2251for (constRegister &UsedReg : UsedRegs)
2252addRegisterDefined(UsedReg, &TRI);
2253}
2254
2255unsigned
2256MachineInstrExpressionTrait::getHashValue(constMachineInstr*const &MI) {
2257// Build up a buffer of hash code components.
2258SmallVector<size_t, 16> HashComponents;
2259 HashComponents.reserve(MI->getNumOperands() + 1);
2260 HashComponents.push_back(MI->getOpcode());
2261for (constMachineOperand &MO :MI->operands()) {
2262if (MO.isReg() && MO.isDef() && MO.getReg().isVirtual())
2263continue;// Skip virtual register defs.
2264
2265 HashComponents.push_back(hash_value(MO));
2266 }
2267returnhash_combine_range(HashComponents.begin(), HashComponents.end());
2268}
2269
2270constMDNode *MachineInstr::getLocCookieMD() const{
2271// Find the source location cookie.
2272constMDNode *LocMD =nullptr;
2273for (unsigned i =getNumOperands(); i != 0; --i) {
2274if (getOperand(i-1).isMetadata() &&
2275 (LocMD =getOperand(i-1).getMetadata()) &&
2276 LocMD->getNumOperands() != 0) {
2277if (mdconst::hasa<ConstantInt>(LocMD->getOperand(0)))
2278return LocMD;
2279 }
2280 }
2281
2282returnnullptr;
2283}
2284
2285voidMachineInstr::emitInlineAsmError(constTwine &Msg) const{
2286assert(isInlineAsm());
2287constMDNode *LocMD =getLocCookieMD();
2288uint64_t LocCookie =
2289 LocMD
2290 ? mdconst::extract<ConstantInt>(LocMD->getOperand(0))->getZExtValue()
2291 : 0;
2292LLVMContext &Ctx =getMF()->getFunction().getContext();
2293 Ctx.diagnose(DiagnosticInfoInlineAsm(LocCookie, Msg));
2294}
2295
2296voidMachineInstr::emitGenericError(constTwine &Msg) const{
2297constFunction &Fn =getMF()->getFunction();
2298 Fn.getContext().diagnose(
2299DiagnosticInfoGenericWithLoc(Msg, Fn,getDebugLoc()));
2300}
2301
2302MachineInstrBuilderllvm::BuildMI(MachineFunction &MF,constDebugLoc &DL,
2303constMCInstrDesc &MCID,bool IsIndirect,
2304Register Reg,constMDNode *Variable,
2305constMDNode *Expr) {
2306assert(isa<DILocalVariable>(Variable) &&"not a variable");
2307assert(cast<DIExpression>(Expr)->isValid() &&"not an expression");
2308assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2309"Expected inlined-at fields to agree");
2310auto MIB =BuildMI(MF,DL, MCID).addReg(Reg);
2311if (IsIndirect)
2312 MIB.addImm(0U);
2313else
2314 MIB.addReg(0U);
2315return MIB.addMetadata(Variable).addMetadata(Expr);
2316}
2317
2318MachineInstrBuilderllvm::BuildMI(MachineFunction &MF,constDebugLoc &DL,
2319constMCInstrDesc &MCID,bool IsIndirect,
2320ArrayRef<MachineOperand> DebugOps,
2321constMDNode *Variable,constMDNode *Expr) {
2322assert(isa<DILocalVariable>(Variable) &&"not a variable");
2323assert(cast<DIExpression>(Expr)->isValid() &&"not an expression");
2324assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2325"Expected inlined-at fields to agree");
2326if (MCID.Opcode == TargetOpcode::DBG_VALUE) {
2327assert(DebugOps.size() == 1 &&
2328"DBG_VALUE must contain exactly one debug operand");
2329MachineOperand DebugOp = DebugOps[0];
2330if (DebugOp.isReg())
2331returnBuildMI(MF,DL, MCID, IsIndirect, DebugOp.getReg(), Variable,
2332 Expr);
2333
2334auto MIB =BuildMI(MF,DL, MCID).add(DebugOp);
2335if (IsIndirect)
2336 MIB.addImm(0U);
2337else
2338 MIB.addReg(0U);
2339return MIB.addMetadata(Variable).addMetadata(Expr);
2340 }
2341
2342auto MIB =BuildMI(MF,DL, MCID);
2343 MIB.addMetadata(Variable).addMetadata(Expr);
2344for (constMachineOperand &DebugOp : DebugOps)
2345if (DebugOp.isReg())
2346 MIB.addReg(DebugOp.getReg());
2347else
2348 MIB.add(DebugOp);
2349return MIB;
2350}
2351
2352MachineInstrBuilderllvm::BuildMI(MachineBasicBlock &BB,
2353MachineBasicBlock::iteratorI,
2354constDebugLoc &DL,constMCInstrDesc &MCID,
2355bool IsIndirect,Register Reg,
2356constMDNode *Variable,constMDNode *Expr) {
2357MachineFunction &MF = *BB.getParent();
2358MachineInstr *MI =BuildMI(MF,DL, MCID, IsIndirect, Reg, Variable, Expr);
2359 BB.insert(I,MI);
2360returnMachineInstrBuilder(MF,MI);
2361}
2362
2363MachineInstrBuilderllvm::BuildMI(MachineBasicBlock &BB,
2364MachineBasicBlock::iteratorI,
2365constDebugLoc &DL,constMCInstrDesc &MCID,
2366bool IsIndirect,
2367ArrayRef<MachineOperand> DebugOps,
2368constMDNode *Variable,constMDNode *Expr) {
2369MachineFunction &MF = *BB.getParent();
2370MachineInstr *MI =
2371BuildMI(MF,DL, MCID, IsIndirect, DebugOps, Variable, Expr);
2372 BB.insert(I,MI);
2373returnMachineInstrBuilder(MF, *MI);
2374}
2375
2376/// Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
2377/// This prepends DW_OP_deref when spilling an indirect DBG_VALUE.
2378staticconstDIExpression *computeExprForSpill(
2379constMachineInstr &MI,
2380constSmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2381assert(MI.getDebugVariable()->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
2382"Expected inlined-at fields to agree");
2383
2384constDIExpression *Expr =MI.getDebugExpression();
2385if (MI.isIndirectDebugValue()) {
2386assert(MI.getDebugOffset().getImm() == 0 &&
2387"DBG_VALUE with nonzero offset");
2388 Expr =DIExpression::prepend(Expr,DIExpression::DerefBefore);
2389 }elseif (MI.isDebugValueList()) {
2390// We will replace the spilled register with a frame index, so
2391// immediately deref all references to the spilled register.
2392 std::array<uint64_t, 1> Ops{{dwarf::DW_OP_deref}};
2393for (constMachineOperand *Op : SpilledOperands) {
2394unsigned OpIdx =MI.getDebugOperandIndex(Op);
2395 Expr =DIExpression::appendOpsToArg(Expr, Ops, OpIdx);
2396 }
2397 }
2398return Expr;
2399}
2400staticconstDIExpression *computeExprForSpill(constMachineInstr &MI,
2401Register SpillReg) {
2402assert(MI.hasDebugOperandForReg(SpillReg) &&"Spill Reg is not used in MI.");
2403SmallVector<const MachineOperand *> SpillOperands;
2404for (constMachineOperand &Op :MI.getDebugOperandsForReg(SpillReg))
2405 SpillOperands.push_back(&Op);
2406returncomputeExprForSpill(MI, SpillOperands);
2407}
2408
2409MachineInstr *llvm::buildDbgValueForSpill(MachineBasicBlock &BB,
2410MachineBasicBlock::iteratorI,
2411constMachineInstr &Orig,
2412int FrameIndex,Register SpillReg) {
2413assert(!Orig.isDebugRef() &&
2414"DBG_INSTR_REF should not reference a virtual register.");
2415constDIExpression *Expr =computeExprForSpill(Orig, SpillReg);
2416MachineInstrBuilder NewMI =
2417BuildMI(BB,I, Orig.getDebugLoc(), Orig.getDesc());
2418// Non-Variadic Operands: Location, Offset, Variable, Expression
2419// Variadic Operands: Variable, Expression, Locations...
2420if (Orig.isNonListDebugValue())
2421 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2422 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2423if (Orig.isDebugValueList()) {
2424for (constMachineOperand &Op : Orig.debug_operands())
2425if (Op.isReg() &&Op.getReg() == SpillReg)
2426 NewMI.addFrameIndex(FrameIndex);
2427else
2428 NewMI.add(MachineOperand(Op));
2429 }
2430return NewMI;
2431}
2432MachineInstr *llvm::buildDbgValueForSpill(
2433MachineBasicBlock &BB,MachineBasicBlock::iteratorI,
2434constMachineInstr &Orig,int FrameIndex,
2435constSmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2436constDIExpression *Expr =computeExprForSpill(Orig, SpilledOperands);
2437MachineInstrBuilder NewMI =
2438BuildMI(BB,I, Orig.getDebugLoc(), Orig.getDesc());
2439// Non-Variadic Operands: Location, Offset, Variable, Expression
2440// Variadic Operands: Variable, Expression, Locations...
2441if (Orig.isNonListDebugValue())
2442 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2443 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2444if (Orig.isDebugValueList()) {
2445for (constMachineOperand &Op : Orig.debug_operands())
2446if (is_contained(SpilledOperands, &Op))
2447 NewMI.addFrameIndex(FrameIndex);
2448else
2449 NewMI.add(MachineOperand(Op));
2450 }
2451return NewMI;
2452}
2453
2454voidllvm::updateDbgValueForSpill(MachineInstr &Orig,int FrameIndex,
2455Register Reg) {
2456constDIExpression *Expr =computeExprForSpill(Orig, Reg);
2457if (Orig.isNonListDebugValue())
2458 Orig.getDebugOffset().ChangeToImmediate(0U);
2459for (MachineOperand &Op : Orig.getDebugOperandsForReg(Reg))
2460Op.ChangeToFrameIndex(FrameIndex);
2461 Orig.getDebugExpressionOp().setMetadata(Expr);
2462}
2463
2464voidMachineInstr::collectDebugValues(
2465SmallVectorImpl<MachineInstr *> &DbgValues) {
2466MachineInstr &MI = *this;
2467if (!MI.getOperand(0).isReg())
2468return;
2469
2470MachineBasicBlock::iterator DI =MI; ++DI;
2471for (MachineBasicBlock::iterator DE =MI.getParent()->end();
2472 DI != DE; ++DI) {
2473if (!DI->isDebugValue())
2474return;
2475if (DI->hasDebugOperandForReg(MI.getOperand(0).getReg()))
2476 DbgValues.push_back(&*DI);
2477 }
2478}
2479
2480voidMachineInstr::changeDebugValuesDefReg(Register Reg) {
2481// Collect matching debug values.
2482SmallVector<MachineInstr *, 2> DbgValues;
2483
2484if (!getOperand(0).isReg())
2485return;
2486
2487Register DefReg =getOperand(0).getReg();
2488auto *MRI = getRegInfo();
2489for (auto &MO :MRI->use_operands(DefReg)) {
2490auto *DI = MO.getParent();
2491if (!DI->isDebugValue())
2492continue;
2493if (DI->hasDebugOperandForReg(DefReg)) {
2494 DbgValues.push_back(DI);
2495 }
2496 }
2497
2498// Propagate Reg to debug value instructions.
2499for (auto *DBI : DbgValues)
2500for (MachineOperand &Op : DBI->getDebugOperandsForReg(DefReg))
2501Op.setReg(Reg);
2502}
2503
2504usingMMOList =SmallVector<const MachineMemOperand *, 2>;
2505
2506staticLocationSizegetSpillSlotSize(constMMOList &Accesses,
2507constMachineFrameInfo &MFI) {
2508uint64_tSize = 0;
2509for (constauto *A : Accesses) {
2510if (MFI.isSpillSlotObjectIndex(
2511 cast<FixedStackPseudoSourceValue>(A->getPseudoValue())
2512 ->getFrameIndex())) {
2513LocationSize S =A->getSize();
2514if (!S.hasValue())
2515returnLocationSize::beforeOrAfterPointer();
2516Size += S.getValue();
2517 }
2518 }
2519returnSize;
2520}
2521
2522std::optional<LocationSize>
2523MachineInstr::getSpillSize(constTargetInstrInfo *TII) const{
2524int FI;
2525if (TII->isStoreToStackSlotPostFE(*this, FI)) {
2526constMachineFrameInfo &MFI =getMF()->getFrameInfo();
2527if (MFI.isSpillSlotObjectIndex(FI))
2528return (*memoperands_begin())->getSize();
2529 }
2530return std::nullopt;
2531}
2532
2533std::optional<LocationSize>
2534MachineInstr::getFoldedSpillSize(constTargetInstrInfo *TII) const{
2535MMOList Accesses;
2536if (TII->hasStoreToStackSlot(*this, Accesses))
2537returngetSpillSlotSize(Accesses,getMF()->getFrameInfo());
2538return std::nullopt;
2539}
2540
2541std::optional<LocationSize>
2542MachineInstr::getRestoreSize(constTargetInstrInfo *TII) const{
2543int FI;
2544if (TII->isLoadFromStackSlotPostFE(*this, FI)) {
2545constMachineFrameInfo &MFI =getMF()->getFrameInfo();
2546if (MFI.isSpillSlotObjectIndex(FI))
2547return (*memoperands_begin())->getSize();
2548 }
2549return std::nullopt;
2550}
2551
2552std::optional<LocationSize>
2553MachineInstr::getFoldedRestoreSize(constTargetInstrInfo *TII) const{
2554MMOList Accesses;
2555if (TII->hasLoadFromStackSlot(*this, Accesses))
2556returngetSpillSlotSize(Accesses,getMF()->getFrameInfo());
2557return std::nullopt;
2558}
2559
2560unsignedMachineInstr::getDebugInstrNum() {
2561if (DebugInstrNum == 0)
2562 DebugInstrNum =getParent()->getParent()->getNewDebugInstrNum();
2563return DebugInstrNum;
2564}
2565
2566unsignedMachineInstr::getDebugInstrNum(MachineFunction &MF) {
2567if (DebugInstrNum == 0)
2568 DebugInstrNum = MF.getNewDebugInstrNum();
2569return DebugInstrNum;
2570}
2571
2572std::tuple<LLT, LLT>MachineInstr::getFirst2LLTs() const{
2573return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2574 getRegInfo()->getType(getOperand(1).getReg()));
2575}
2576
2577std::tuple<LLT, LLT, LLT>MachineInstr::getFirst3LLTs() const{
2578return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2579 getRegInfo()->getType(getOperand(1).getReg()),
2580 getRegInfo()->getType(getOperand(2).getReg()));
2581}
2582
2583std::tuple<LLT, LLT, LLT, LLT>MachineInstr::getFirst4LLTs() const{
2584return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2585 getRegInfo()->getType(getOperand(1).getReg()),
2586 getRegInfo()->getType(getOperand(2).getReg()),
2587 getRegInfo()->getType(getOperand(3).getReg()));
2588}
2589
2590std::tuple<LLT, LLT, LLT, LLT, LLT>MachineInstr::getFirst5LLTs() const{
2591return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2592 getRegInfo()->getType(getOperand(1).getReg()),
2593 getRegInfo()->getType(getOperand(2).getReg()),
2594 getRegInfo()->getType(getOperand(3).getReg()),
2595 getRegInfo()->getType(getOperand(4).getReg()));
2596}
2597
2598std::tuple<Register, LLT, Register, LLT>
2599MachineInstr::getFirst2RegLLTs() const{
2600Register Reg0 =getOperand(0).getReg();
2601Register Reg1 =getOperand(1).getReg();
2602return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2603 getRegInfo()->getType(Reg1));
2604}
2605
2606std::tuple<Register, LLT, Register, LLT, Register, LLT>
2607MachineInstr::getFirst3RegLLTs() const{
2608Register Reg0 =getOperand(0).getReg();
2609Register Reg1 =getOperand(1).getReg();
2610Register Reg2 =getOperand(2).getReg();
2611return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2612 getRegInfo()->getType(Reg1), Reg2,
2613 getRegInfo()->getType(Reg2));
2614}
2615
2616std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>
2617MachineInstr::getFirst4RegLLTs() const{
2618Register Reg0 =getOperand(0).getReg();
2619Register Reg1 =getOperand(1).getReg();
2620Register Reg2 =getOperand(2).getReg();
2621Register Reg3 =getOperand(3).getReg();
2622return std::tuple(
2623 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2624 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3));
2625}
2626
2627std::tuple<Register,LLT,Register,LLT,Register,LLT,Register,LLT,Register,
2628LLT>
2629MachineInstr::getFirst5RegLLTs() const{
2630Register Reg0 =getOperand(0).getReg();
2631Register Reg1 =getOperand(1).getReg();
2632Register Reg2 =getOperand(2).getReg();
2633Register Reg3 =getOperand(3).getReg();
2634Register Reg4 =getOperand(4).getReg();
2635return std::tuple(
2636 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2637 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3),
2638 Reg4, getRegInfo()->getType(Reg4));
2639}
2640
2641voidMachineInstr::insert(mop_iterator InsertBefore,
2642ArrayRef<MachineOperand> Ops) {
2643assert(InsertBefore !=nullptr &&"invalid iterator");
2644assert(InsertBefore->getParent() ==this &&
2645"iterator points to operand of other inst");
2646if (Ops.empty())
2647return;
2648
2649// Do one pass to untie operands.
2650SmallDenseMap<unsigned, unsigned> TiedOpIndices;
2651for (constMachineOperand &MO :operands()) {
2652if (MO.isReg() && MO.isTied()) {
2653unsigned OpNo =getOperandNo(&MO);
2654unsigned TiedTo =findTiedOperandIdx(OpNo);
2655 TiedOpIndices[OpNo] = TiedTo;
2656untieRegOperand(OpNo);
2657 }
2658 }
2659
2660unsigned OpIdx =getOperandNo(InsertBefore);
2661unsigned NumOperands =getNumOperands();
2662unsigned OpsToMove = NumOperands - OpIdx;
2663
2664SmallVector<MachineOperand> MovingOps;
2665 MovingOps.reserve(OpsToMove);
2666
2667for (unsignedI = 0;I < OpsToMove; ++I) {
2668 MovingOps.emplace_back(getOperand(OpIdx));
2669removeOperand(OpIdx);
2670 }
2671for (constMachineOperand &MO : Ops)
2672addOperand(MO);
2673for (constMachineOperand &OpMoved : MovingOps)
2674addOperand(OpMoved);
2675
2676// Re-tie operands.
2677for (auto [Tie1, Tie2] : TiedOpIndices) {
2678if (Tie1 >= OpIdx)
2679 Tie1 += Ops.size();
2680if (Tie2 >= OpIdx)
2681 Tie2 += Ops.size();
2682tieOperands(Tie1, Tie2);
2683 }
2684}
2685
2686boolMachineInstr::mayFoldInlineAsmRegOp(unsigned OpId) const{
2687assert(OpId &&"expected non-zero operand id");
2688assert(isInlineAsm() &&"should only be used on inline asm");
2689
2690if (!getOperand(OpId).isReg())
2691returnfalse;
2692
2693constMachineOperand &MD =getOperand(OpId - 1);
2694if (!MD.isImm())
2695returnfalse;
2696
2697InlineAsm::FlagF(MD.getImm());
2698if (F.isRegUseKind() ||F.isRegDefKind() ||F.isRegDefEarlyClobberKind())
2699returnF.getRegMayBeFolded();
2700returnfalse;
2701}
MRI
unsigned const MachineRegisterInfo * MRI
Definition:AArch64AdvSIMDScalarPass.cpp:105
SelectTypeKind::FP
@ FP
MBB
MachineBasicBlock & MBB
Definition:ARMSLSHardening.cpp:71
DL
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Definition:ARMSLSHardening.cpp:73
AliasAnalysis.h
ArrayRef.h
A
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Info
Analysis containing CSE Info
Definition:CSEInfo.cpp:27
Casting.h
Compiler.h
LLVM_DUMP_METHOD
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition:Compiler.h:622
Constants.h
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DebugInfoMetadata.h
DebugLoc.h
Debug.h
Size
uint64_t Size
Definition:ELFObjHandler.cpp:81
FormattedStream.h
Check
#define Check(C,...)
Definition:GenericConvergenceVerifierImpl.h:34
Hashing.h
GEP
Hexagon Common GEP
Definition:HexagonCommonGEP.cpp:170
TII
const HexagonInstrInfo * TII
Definition:HexagonCopyToCombine.cpp:125
MI
IRTranslator LLVM IR MI
Definition:IRTranslator.cpp:112
Function.h
Module.h
Module.h This file contains the declarations for the Module class.
Operator.h
InlineAsm.h
Instructions.h
LLVMContext.h
LiveRegUnits.h
A set of register units.
LowLevelType.h
Implement a low-level type suitable for MachineInstr level instruction selection.
MCInstrDesc.h
MCRegisterInfo.h
F
#define F(x, y, z)
Definition:MD5.cpp:55
I
#define I(x, y, z)
Definition:MD5.cpp:58
MachineBasicBlock.h
MachineFrameInfo.h
MachineFunction.h
MachineInstrBuilder.h
getDebugLoc
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first found DebugLoc that has a DILocation, given a range of instructions.
Definition:MachineInstrBundle.cpp:109
MachineInstrBundle.h
TiedMax
const unsigned TiedMax
Definition:MachineInstr.cpp:1154
moveOperands
static void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps, MachineRegisterInfo *MRI)
Move NumOps MachineOperands from Src to Dst, with support for overlapping ranges.
Definition:MachineInstr.cpp:192
getSpillSlotSize
static LocationSize getSpillSlotSize(const MMOList &Accesses, const MachineFrameInfo &MFI)
Definition:MachineInstr.cpp:2506
computeExprForSpill
static const DIExpression * computeExprForSpill(const MachineInstr &MI, const SmallVectorImpl< const MachineOperand * > &SpilledOperands)
Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
Definition:MachineInstr.cpp:2378
MemOperandsHaveAlias
static bool MemOperandsHaveAlias(const MachineFrameInfo &MFI, BatchAAResults *AA, bool UseTBAA, const MachineMemOperand *MMOa, const MachineMemOperand *MMOb)
Definition:MachineInstr.cpp:1391
tryToGetTargetInfo
static void tryToGetTargetInfo(const MachineInstr &MI, const TargetRegisterInfo *&TRI, const MachineRegisterInfo *&MRI, const TargetIntrinsicInfo *&IntrinsicInfo, const TargetInstrInfo *&TII)
Definition:MachineInstr.cpp:75
getMFIfAvailable
static const MachineFunction * getMFIfAvailable(const MachineInstr &MI)
Definition:MachineInstr.cpp:66
hasIdenticalMMOs
static bool hasIdenticalMMOs(ArrayRef< MachineMemOperand * > LHS, ArrayRef< MachineMemOperand * > RHS)
Check to see if the MMOs pointed to by the two MemRefs arrays are identical.
Definition:MachineInstr.cpp:415
MachineInstr.h
MachineMemOperand.h
MachineModuleInfo.h
MachineOperand.h
MachineRegisterInfo.h
TRI
unsigned const TargetRegisterInfo * TRI
Definition:MachineSink.cpp:2029
MemoryLocation.h
This file provides utility analysis objects describing memory locations.
Metadata.h
This file contains the declarations for metadata subclasses.
getReg
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
Definition:MipsDisassembler.cpp:520
isReg
static bool isReg(const MCInst &MI, unsigned OpNo)
Definition:MipsInstPrinter.cpp:31
ModuleSlotTracker.h
PseudoSourceValue.h
Register.h
isValid
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Definition:RustDemangle.cpp:181
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
isDead
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
Definition:SPIRVInstructionSelector.cpp:420
STLExtras.h
This file contains some templates that are useful if you are working with the STL at all.
OS
raw_pwrite_stream & OS
Definition:SampleProfWriter.cpp:51
UseTBAA
static cl::opt< bool > UseTBAA("use-tbaa-in-sched-mi", cl::Hidden, cl::init(true), cl::desc("Enable use of TBAA during MI DAG construction"))
SmallBitVector.h
This file implements the SmallBitVector class.
SmallVector.h
This file defines the SmallVector class.
StackMaps.h
getType
static SymbolRef::Type getType(const Symbol *Sym)
Definition:TapiFile.cpp:39
TargetInstrInfo.h
TargetRegisterInfo.h
TargetSubtargetInfo.h
getOpcode
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition:VPlanSLP.cpp:191
RHS
Value * RHS
Definition:X86PartialReduction.cpp:74
LHS
Value * LHS
Definition:X86PartialReduction.cpp:73
llvm::AAResults
Definition:AliasAnalysis.h:314
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition:ArrayRef.h:41
llvm::ArrayRef::size
size_t size() const
size - Get the array size.
Definition:ArrayRef.h:168
llvm::ArrayRef::empty
bool empty() const
empty - Check if the array is empty.
Definition:ArrayRef.h:163
llvm::ArrayRef::slice
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition:ArrayRef.h:198
llvm::BatchAAResults
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
Definition:AliasAnalysis.h:630
llvm::BatchAAResults::isNoAlias
bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB)
Definition:AliasAnalysis.h:674
llvm::ConstMIBundleOperands
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
Definition:MachineInstrBundle.h:186
llvm::DIExpression
DWARF expression.
Definition:DebugInfoMetadata.h:2763
llvm::DIExpression::isEntryValue
bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
Definition:DebugInfoMetadata.cpp:1375
llvm::DIExpression::isEqualExpression
static bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
Definition:DebugInfoMetadata.cpp:1664
llvm::DIExpression::appendOpsToArg
static DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
Definition:DebugInfoMetadata.cpp:1858
llvm::DIExpression::DerefBefore
@ DerefBefore
Definition:DebugInfoMetadata.h:3045
llvm::DIExpression::prepend
static DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
Definition:DebugInfoMetadata.cpp:1842
llvm::DILabel
Label.
Definition:DebugInfoMetadata.h:3551
llvm::DILocalVariable
Local variable.
Definition:DebugInfoMetadata.h:3460
llvm::DWARFExpression::Operation
This class represents an Operation in the Expression.
Definition:DWARFExpression.h:32
llvm::DWARFExpression::Operation::print
bool print(raw_ostream &OS, DIDumpOptions DumpOpts, const DWARFExpression *Expr, DWARFUnit *U) const
Definition:DWARFExpression.cpp:302
llvm::DebugLoc
A debug info location.
Definition:DebugLoc.h:33
llvm::DebugLoc::hasTrivialDestructor
bool hasTrivialDestructor() const
Check whether this has a trivial destructor.
Definition:DebugLoc.h:69
llvm::DiagnosticInfoGenericWithLoc
Definition:DiagnosticInfo.h:378
llvm::DiagnosticInfoInlineAsm
Diagnostic information for inline asm reporting.
Definition:DiagnosticInfo.h:169
llvm::FPMathOperator
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition:Operator.h:205
llvm::FastMathFlags
Convenience struct for specifying and reasoning about fast-math flags.
Definition:FMF.h:20
llvm::Function
Definition:Function.h:63
llvm::Function::getContext
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition:Function.cpp:369
llvm::GetElementPtrInst
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition:Instructions.h:933
llvm::HexagonInstrInfo::hasStoreToStackSlot
bool hasStoreToStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const override
Check if the instruction or the bundle of instructions has store to stack slots.
Definition:HexagonInstrInfo.cpp:404
llvm::HexagonInstrInfo::areMemAccessesTriviallyDisjoint
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
Definition:HexagonInstrInfo.cpp:1989
llvm::HexagonInstrInfo::hasLoadFromStackSlot
bool hasLoadFromStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const override
Check if the instruction or the bundle of instructions has load from stack slots.
Definition:HexagonInstrInfo.cpp:386
llvm::ICmpInst
This instruction compares its operands according to the predicate given to the constructor.
Definition:Instructions.h:1158
llvm::InlineAsm::Flag
Definition:InlineAsm.h:303
llvm::InlineAsm::AsmDialect
AsmDialect
Definition:InlineAsm.h:36
llvm::InlineAsm::AD_Intel
@ AD_Intel
Definition:InlineAsm.h:38
llvm::InlineAsm::AD_ATT
@ AD_ATT
Definition:InlineAsm.h:37
llvm::InlineAsm::Extra_HasSideEffects
@ Extra_HasSideEffects
Definition:InlineAsm.h:214
llvm::InlineAsm::Extra_IsConvergent
@ Extra_IsConvergent
Definition:InlineAsm.h:219
llvm::InlineAsm::Extra_MayLoad
@ Extra_MayLoad
Definition:InlineAsm.h:217
llvm::InlineAsm::MIOp_AsmString
@ MIOp_AsmString
Definition:InlineAsm.h:209
llvm::InlineAsm::Extra_MayStore
@ Extra_MayStore
Definition:InlineAsm.h:218
llvm::InlineAsm::MIOp_ExtraInfo
@ MIOp_ExtraInfo
Definition:InlineAsm.h:210
llvm::InlineAsm::Extra_AsmDialect
@ Extra_AsmDialect
Definition:InlineAsm.h:216
llvm::InlineAsm::MIOp_FirstOperand
@ MIOp_FirstOperand
Definition:InlineAsm.h:211
llvm::InlineAsm::Extra_IsAlignStack
@ Extra_IsAlignStack
Definition:InlineAsm.h:215
llvm::InlineAsm::getMemConstraintName
static StringRef getMemConstraintName(ConstraintCode C)
Definition:InlineAsm.h:467
llvm::InlineAsm::ConstraintCode
ConstraintCode
Definition:InlineAsm.h:239
llvm::Instruction
Definition:Instruction.h:68
llvm::LLT
Definition:LowLevelType.h:39
llvm::LLT::isValid
constexpr bool isValid() const
Definition:LowLevelType.h:145
llvm::LLVMContext
This is an important class for using LLVM in a threaded context.
Definition:LLVMContext.h:67
llvm::LLVMContext::diagnose
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
Definition:LLVMContext.cpp:245
llvm::LivePhysRegs
A set of physical registers with utility functions to track liveness when walking backward/forward th...
Definition:LivePhysRegs.h:52
llvm::LivePhysRegs::available
bool available(const MachineRegisterInfo &MRI, MCPhysReg Reg) const
Returns true if register Reg and no aliasing register is in the set.
Definition:LivePhysRegs.cpp:141
llvm::LiveRegUnits
A set of register units used to track register liveness.
Definition:LiveRegUnits.h:30
llvm::LocationSize
Definition:MemoryLocation.h:68
llvm::LocationSize::hasValue
bool hasValue() const
Definition:MemoryLocation.h:165
llvm::LocationSize::precise
static LocationSize precise(uint64_t Value)
Definition:MemoryLocation.h:108
llvm::LocationSize::beforeOrAfterPointer
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
Definition:MemoryLocation.h:137
llvm::LocationSize::isScalable
bool isScalable() const
Definition:MemoryLocation.h:168
llvm::LocationSize::getValue
TypeSize getValue() const
Definition:MemoryLocation.h:170
llvm::MCInstrDesc
Describe properties that are true of each instruction in the target description file.
Definition:MCInstrDesc.h:198
llvm::MCInstrDesc::getNumOperands
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
Definition:MCInstrDesc.h:237
llvm::MCInstrDesc::operands
ArrayRef< MCOperandInfo > operands() const
Definition:MCInstrDesc.h:239
llvm::MCInstrDesc::getNumDefs
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Definition:MCInstrDesc.h:248
llvm::MCInstrDesc::getOperandConstraint
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specified operand constraint if it is present.
Definition:MCInstrDesc.h:219
llvm::MCInstrDesc::implicit_defs
ArrayRef< MCPhysReg > implicit_defs() const
Return a list of registers that are potentially written by any instance of this machine instruction.
Definition:MCInstrDesc.h:579
llvm::MCInstrDesc::isPredicable
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution.
Definition:MCInstrDesc.h:338
llvm::MCInstrDesc::Opcode
unsigned short Opcode
Definition:MCInstrDesc.h:205
llvm::MCInstrDesc::isVariadic
bool isVariadic() const
Return true if this instruction can have a variable number of operands.
Definition:MCInstrDesc.h:261
llvm::MCInstrDesc::implicit_uses
ArrayRef< MCPhysReg > implicit_uses() const
Return a list of registers that are potentially read by any instance of this machine instruction.
Definition:MCInstrDesc.h:565
llvm::MCRegAliasIterator
MCRegAliasIterator enumerates all registers aliasing Reg.
Definition:MCRegisterInfo.h:747
llvm::MCRegAliasIterator::isValid
bool isValid() const
Definition:MCRegisterInfo.h:763
llvm::MCRegisterInfo::isSubRegister
bool isSubRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a sub-register of RegA.
Definition:MCRegisterInfo.h:483
llvm::MCRegisterInfo::isSuperRegister
bool isSuperRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register of RegA.
Definition:MCRegisterInfo.h:625
llvm::MCRegister
Wrapper class representing physical registers. Should be passed by value.
Definition:MCRegister.h:33
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition:MCSymbol.h:41
llvm::MDNode
Metadata node.
Definition:Metadata.h:1073
llvm::MDNode::getOperand
const MDOperand & getOperand(unsigned I) const
Definition:Metadata.h:1434
llvm::MDNode::getNumOperands
unsigned getNumOperands() const
Return number of MDNode operands.
Definition:Metadata.h:1440
llvm::MIBundleOperandIteratorBase::isValid
bool isValid() const
isValid - Returns true until all the operands have been visited.
Definition:MachineInstrBundle.h:136
llvm::MachineBasicBlock
Definition:MachineBasicBlock.h:125
llvm::MachineBasicBlock::remove_instr
MachineInstr * remove_instr(MachineInstr *I)
Remove the possibly bundled instruction from the instruction list without deleting it.
Definition:MachineBasicBlock.cpp:1448
llvm::MachineBasicBlock::insert
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
Definition:MachineBasicBlock.cpp:1456
llvm::MachineBasicBlock::erase_instr
instr_iterator erase_instr(MachineInstr *I)
Remove an instruction from the instruction list and delete it.
Definition:MachineBasicBlock.h:1060
llvm::MachineBasicBlock::printAsOperand
void printAsOperand(raw_ostream &OS, bool PrintType=true) const
Definition:MachineBasicBlock.cpp:594
llvm::MachineBasicBlock::remove
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
Definition:MachineBasicBlock.h:1089
llvm::MachineBasicBlock::print
void print(raw_ostream &OS, const SlotIndexes *=nullptr, bool IsStandalone=true) const
Definition:MachineBasicBlock.cpp:345
llvm::MachineBasicBlock::instr_iterator
Instructions::iterator instr_iterator
Definition:MachineBasicBlock.h:314
llvm::MachineBasicBlock::const_instr_iterator
Instructions::const_iterator const_instr_iterator
Definition:MachineBasicBlock.h:315
llvm::MachineBasicBlock::getParent
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
Definition:MachineBasicBlock.h:311
llvm::MachineBasicBlock::erase
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
Definition:MachineBasicBlock.cpp:1443
llvm::MachineBasicBlock::splice
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
Definition:MachineBasicBlock.h:1109
llvm::MachineFrameInfo
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Definition:MachineFrameInfo.h:106
llvm::MachineFrameInfo::isSpillSlotObjectIndex
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
Definition:MachineFrameInfo.h:737
llvm::MachineFunction
Definition:MachineFunction.h:267
llvm::MachineFunction::createMIExtraInfo
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
Definition:MachineFunction.cpp:609
llvm::MachineFunction::getSubtarget
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Definition:MachineFunction.h:733
llvm::MachineFunction::getNewDebugInstrNum
unsigned getNewDebugInstrNum()
Definition:MachineFunction.h:1425
llvm::MachineFunction::getFrameInfo
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Definition:MachineFunction.h:749
llvm::MachineFunction::deallocateOperandArray
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
Definition:MachineFunction.h:1137
llvm::MachineFunction::allocateOperandArray
MachineOperand * allocateOperandArray(OperandCapacity Cap)
Allocate an array of MachineOperands.
Definition:MachineFunction.h:1130
llvm::MachineFunction::getRegInfo
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Definition:MachineFunction.h:743
llvm::MachineFunction::handleChangeDesc
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
Definition:MachineFunction.cpp:182
llvm::MachineFunction::getFunction
Function & getFunction()
Return the LLVM function that this machine code represents.
Definition:MachineFunction.h:704
llvm::MachineInstrBuilder
Definition:MachineInstrBuilder.h:71
llvm::MachineInstrBuilder::addImm
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Definition:MachineInstrBuilder.h:133
llvm::MachineInstrBuilder::add
const MachineInstrBuilder & add(const MachineOperand &MO) const
Definition:MachineInstrBuilder.h:226
llvm::MachineInstrBuilder::addMetadata
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
Definition:MachineInstrBuilder.h:238
llvm::MachineInstrBuilder::addFrameIndex
const MachineInstrBuilder & addFrameIndex(int Idx) const
Definition:MachineInstrBuilder.h:154
llvm::MachineInstrBuilder::addReg
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Definition:MachineInstrBuilder.h:99
llvm::MachineInstrBundleIterator< MachineInstr >
llvm::MachineInstr
Representation of each machine instruction.
Definition:MachineInstr.h:71
llvm::MachineInstr::mayRaiseFPException
bool mayRaiseFPException() const
Return true if this instruction could possibly raise a floating-point exception.
Definition:MachineInstr.h:1178
llvm::MachineInstr::getOpcode
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Definition:MachineInstr.h:577
llvm::MachineInstr::setRegisterDefReadUndef
void setRegisterDefReadUndef(Register Reg, bool IsUndef=true)
Mark all subregister defs of register Reg with the undef flag.
Definition:MachineInstr.cpp:2207
llvm::MachineInstr::getDebugOperandsForReg
static iterator_range< filter_iterator< Operand *, std::function< bool(Operand &Op)> > > getDebugOperandsForReg(Instruction *MI, Register Reg)
Returns a range of all of the operands that correspond to a debug use of Reg.
Definition:MachineInstr.h:618
llvm::MachineInstr::isDebugValueList
bool isDebugValueList() const
Definition:MachineInstr.h:1359
llvm::MachineInstr::bundleWithPred
void bundleWithPred()
Bundle this instruction with its predecessor.
Definition:MachineInstr.cpp:829
llvm::MachineInstr::isPosition
bool isPosition() const
Definition:MachineInstr.h:1354
llvm::MachineInstr::isTerminator
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
Definition:MachineInstr.h:983
llvm::MachineInstr::getFirst5RegLLTs
std::tuple< Register, LLT, Register, LLT, Register, LLT, Register, LLT, Register, LLT > getFirst5RegLLTs() const
Definition:MachineInstr.cpp:2629
llvm::MachineInstr::mayLoadOrStore
bool mayLoadOrStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read or modify memory.
Definition:MachineInstr.h:1168
llvm::MachineInstr::setCFIType
void setCFIType(MachineFunction &MF, uint32_t Type)
Set the CFI type for the instruction.
Definition:MachineInstr.cpp:528
llvm::MachineInstr::removeFromParent
MachineInstr * removeFromParent()
Unlink 'this' from the containing basic block, and return it without deleting it.
Definition:MachineInstr.cpp:757
llvm::MachineInstr::debug_operands
iterator_range< mop_iterator > debug_operands()
Returns a range over all operands that are used to determine the variable location for this DBG_VALUE...
Definition:MachineInstr.h:715
llvm::MachineInstr::getParent
const MachineBasicBlock * getParent() const
Definition:MachineInstr.h:349
llvm::MachineInstr::getMMRAMetadata
MDNode * getMMRAMetadata() const
Helper to extract mmra.op metadata.
Definition:MachineInstr.h:873
llvm::MachineInstr::bundleWithSucc
void bundleWithSucc()
Bundle this instruction with its successor.
Definition:MachineInstr.cpp:838
llvm::MachineInstr::getCFIType
uint32_t getCFIType() const
Helper to extract a CFI type hash if one has been added.
Definition:MachineInstr.h:882
llvm::MachineInstr::isDebugLabel
bool isDebugLabel() const
Definition:MachineInstr.h:1365
llvm::MachineInstr::setPreInstrSymbol
void setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just prior to the instruction itself.
Definition:MachineInstr.cpp:477
llvm::MachineInstr::hasProperty
bool hasProperty(unsigned MCFlag, QueryType Type=AnyInBundle) const
Return true if the instruction (or in the case of a bundle, the instructions inside the bundle) has t...
Definition:MachineInstr.h:905
llvm::MachineInstr::isDereferenceableInvariantLoad
bool isDereferenceableInvariantLoad() const
Return true if this load instruction never traps and points to a memory location whose value doesn't ...
Definition:MachineInstr.cpp:1555
llvm::MachineInstr::setFlags
void setFlags(unsigned flags)
Definition:MachineInstr.h:412
llvm::MachineInstr::QueryType
QueryType
API for querying MachineInstr properties.
Definition:MachineInstr.h:894
llvm::MachineInstr::AnyInBundle
@ AnyInBundle
Definition:MachineInstr.h:896
llvm::MachineInstr::AllInBundle
@ AllInBundle
Definition:MachineInstr.h:897
llvm::MachineInstr::addImplicitDefUseOperands
void addImplicitDefUseOperands(MachineFunction &MF)
Add all implicit def and use operands to this instruction.
Definition:MachineInstr.cpp:89
llvm::MachineInstr::getFirst5LLTs
std::tuple< LLT, LLT, LLT, LLT, LLT > getFirst5LLTs() const
Definition:MachineInstr.cpp:2590
llvm::MachineInstr::isCall
bool isCall(QueryType Type=AnyInBundle) const
Definition:MachineInstr.h:958
llvm::MachineInstr::getFirst3RegLLTs
std::tuple< Register, LLT, Register, LLT, Register, LLT > getFirst3RegLLTs() const
Definition:MachineInstr.cpp:2607
llvm::MachineInstr::getFlag
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
Definition:MachineInstr.h:399
llvm::MachineInstr::mergeFlagsWith
uint32_t mergeFlagsWith(const MachineInstr &Other) const
Return the MIFlags which represent both MachineInstrs.
Definition:MachineInstr.cpp:562
llvm::MachineInstr::getDebugExpressionOp
const MachineOperand & getDebugExpressionOp() const
Return the operand for the complex address expression referenced by this DBG_VALUE instruction.
Definition:MachineInstr.cpp:930
llvm::MachineInstr::readsWritesVirtualRegister
std::pair< bool, bool > readsWritesVirtualRegister(Register Reg, SmallVectorImpl< unsigned > *Ops=nullptr) const
Return a pair of bools (reads, writes) indicating if this instruction reads or writes Reg.
Definition:MachineInstr.cpp:1081
llvm::MachineInstr::isConstantValuePHI
Register isConstantValuePHI() const
If the specified instruction is a PHI that always merges together the same virtual register,...
Definition:MachineInstr.cpp:1591
llvm::MachineInstr::isRegTiedToDefOperand
bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx=nullptr) const
Return true if the use operand of the specified index is tied to a def operand.
Definition:MachineInstr.h:1681
llvm::MachineInstr::allImplicitDefsAreDead
bool allImplicitDefsAreDead() const
Return true if all the implicit defs of this instruction are dead.
Definition:MachineInstr.cpp:1633
llvm::MachineInstr::cloneMemRefs
void cloneMemRefs(MachineFunction &MF, const MachineInstr &MI)
Clone another MachineInstr's memory reference descriptor list and replace ours with it.
Definition:MachineInstr.cpp:390
llvm::MachineInstr::getRegClassConstraintEffectForVReg
const TargetRegisterClass * getRegClassConstraintEffectForVReg(Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ExploreBundle=false) const
Applies the constraints (def/use) implied by this MI on Reg to the given CurRC.
Definition:MachineInstr.cpp:988
llvm::MachineInstr::isSafeToMove
bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
Definition:MachineInstr.cpp:1302
llvm::MachineInstr::mayAlias
bool mayAlias(BatchAAResults *AA, const MachineInstr &Other, bool UseTBAA) const
Returns true if this instruction's memory access aliases the memory access of Other.
Definition:MachineInstr.cpp:1476
llvm::MachineInstr::isBundle
bool isBundle() const
Definition:MachineInstr.h:1436
llvm::MachineInstr::isDebugInstr
bool isDebugInstr() const
Definition:MachineInstr.h:1369
llvm::MachineInstr::getNumDebugOperands
unsigned getNumDebugOperands() const
Returns the total number of operands which are debug locations.
Definition:MachineInstr.h:583
llvm::MachineInstr::getNumOperands
unsigned getNumOperands() const
Retuns the total number of operands.
Definition:MachineInstr.h:580
llvm::MachineInstr::addOperand
void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
Definition:MachineInstr.cpp:205
llvm::MachineInstr::removeFromBundle
MachineInstr * removeFromBundle()
Unlink this instruction from its basic block and return it without deleting it.
Definition:MachineInstr.cpp:762
llvm::MachineInstr::dumpr
void dumpr(const MachineRegisterInfo &MRI, unsigned MaxDepth=UINT_MAX) const
Print on dbgs() the current instruction and the instructions defining its operands and so on until we...
Definition:MachineInstr.cpp:1725
llvm::MachineInstr::copyIRFlags
void copyIRFlags(const Instruction &I)
Copy all flags to MachineInst MIFlags.
Definition:MachineInstr.cpp:635
llvm::MachineInstr::isDebugValueLike
bool isDebugValueLike() const
Definition:MachineInstr.h:1367
llvm::MachineInstr::isInlineAsm
bool isInlineAsm() const
Definition:MachineInstr.h:1412
llvm::MachineInstr::memoperands_empty
bool memoperands_empty() const
Return true if we don't have any memory operands which described the memory access done by this instr...
Definition:MachineInstr.h:820
llvm::MachineInstr::memoperands_end
mmo_iterator memoperands_end() const
Access to memory operands of the instruction.
Definition:MachineInstr.h:815
llvm::MachineInstr::isDebugRef
bool isDebugRef() const
Definition:MachineInstr.h:1366
llvm::MachineInstr::collectDebugValues
void collectDebugValues(SmallVectorImpl< MachineInstr * > &DbgValues)
Scan instructions immediately following MI and collect any matching DBG_VALUEs.
Definition:MachineInstr.cpp:2464
llvm::MachineInstr::getRestoreSize
std::optional< LocationSize > getRestoreSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a restore instruction.
Definition:MachineInstr.cpp:2542
llvm::MachineInstr::getOperandNo
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
Definition:MachineInstr.h:783
llvm::MachineInstr::getNumExplicitOperands
unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
Definition:MachineInstr.cpp:796
llvm::MachineInstr::setMemRefs
void setMemRefs(MachineFunction &MF, ArrayRef< MachineMemOperand * > MemRefs)
Assign this MachineInstr's memory reference descriptor list.
Definition:MachineInstr.cpp:370
llvm::MachineInstr::wouldBeTriviallyDead
bool wouldBeTriviallyDead() const
Return true if this instruction would be trivially dead if all of its defined registers were dead.
Definition:MachineInstr.cpp:1332
llvm::MachineInstr::isBundledWithPred
bool isBundledWithPred() const
Return true if this instruction is part of a bundle, and it is not the first instruction in the bundl...
Definition:MachineInstr.h:480
llvm::MachineInstr::getFirst2LLTs
std::tuple< LLT, LLT > getFirst2LLTs() const
Definition:MachineInstr.cpp:2572
llvm::MachineInstr::getFoldedSpillSize
std::optional< LocationSize > getFoldedSpillSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a folded spill instruction.
Definition:MachineInstr.cpp:2534
llvm::MachineInstr::unbundleFromPred
void unbundleFromPred()
Break bundle above this instruction.
Definition:MachineInstr.cpp:847
llvm::MachineInstr::copyImplicitOps
void copyImplicitOps(MachineFunction &MF, const MachineInstr &MI)
Copy implicit register operands from specified instruction to this instruction.
Definition:MachineInstr.cpp:1645
llvm::MachineInstr::mayLoad
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
Definition:MachineInstr.h:1145
llvm::MachineInstr::isStackAligningInlineAsm
bool isStackAligningInlineAsm() const
Definition:MachineInstr.cpp:865
llvm::MachineInstr::dropMemRefs
void dropMemRefs(MachineFunction &MF)
Clear this MachineInstr's memory reference descriptor list.
Definition:MachineInstr.cpp:361
llvm::MachineInstr::findRegisterUseOperandIdx
int findRegisterUseOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isKill=false) const
Returns the operand index that is a use of the specific register or -1 if it is not found.
Definition:MachineInstr.cpp:1060
llvm::MachineInstr::getPCSections
MDNode * getPCSections() const
Helper to extract PCSections metadata target sections.
Definition:MachineInstr.h:863
llvm::MachineInstr::isCFIInstruction
bool isCFIInstruction() const
Definition:MachineInstr.h:1345
llvm::MachineInstr::findFirstPredOperandIdx
int findFirstPredOperandIdx() const
Find the index of the first operand in the operand list that is used to represent the predicate.
Definition:MachineInstr.cpp:1138
llvm::MachineInstr::getDesc
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
Definition:MachineInstr.h:574
llvm::MachineInstr::getBundleSize
unsigned getBundleSize() const
Return the number of instructions inside the MI bundle, excluding the bundle header.
Definition:MachineInstr.cpp:1037
llvm::MachineInstr::cloneMergedMemRefs
void cloneMergedMemRefs(MachineFunction &MF, ArrayRef< const MachineInstr * > MIs)
Clone the merge of multiple MachineInstrs' memory reference descriptors list and replace ours with it...
Definition:MachineInstr.cpp:426
llvm::MachineInstr::isCandidateForAdditionalCallInfo
bool isCandidateForAdditionalCallInfo(QueryType Type=IgnoreBundle) const
Return true if this is a call instruction that may have an additional information associated with it.
Definition:MachineInstr.cpp:777
llvm::MachineInstr::getFirst4RegLLTs
std::tuple< Register, LLT, Register, LLT, Register, LLT, Register, LLT > getFirst4RegLLTs() const
Definition:MachineInstr.cpp:2617
llvm::MachineInstr::getFirst2RegLLTs
std::tuple< Register, LLT, Register, LLT > getFirst2RegLLTs() const
Definition:MachineInstr.cpp:2599
llvm::MachineInstr::getNumMemOperands
unsigned getNumMemOperands() const
Return the number of memory operands.
Definition:MachineInstr.h:826
llvm::MachineInstr::clearFlag
void clearFlag(MIFlag Flag)
clearFlag - Clear a MI flag.
Definition:MachineInstr.h:421
llvm::MachineInstr::getFoldedRestoreSize
std::optional< LocationSize > getFoldedRestoreSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a folded restore instruction.
Definition:MachineInstr.cpp:2553
llvm::MachineInstr::getRegClassConstraintEffect
const TargetRegisterClass * getRegClassConstraintEffect(unsigned OpIdx, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Applies the constraints (def/use) implied by the OpIdx operand to the given CurRC.
Definition:MachineInstr.cpp:1017
llvm::MachineInstr::isOperandSubregIdx
bool isOperandSubregIdx(unsigned OpIdx) const
Return true if operand OpIdx is a subregister index.
Definition:MachineInstr.h:664
llvm::MachineInstr::getInlineAsmDialect
InlineAsm::AsmDialect getInlineAsmDialect() const
Definition:MachineInstr.cpp:874
llvm::MachineInstr::hasUnmodeledSideEffects
bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
Definition:MachineInstr.cpp:1604
llvm::MachineInstr::isEquivalentDbgInstr
bool isEquivalentDbgInstr(const MachineInstr &Other) const
Returns true if this instruction is a debug instruction that represents an identical debug value to O...
Definition:MachineInstr.cpp:734
llvm::MachineInstr::getDebugLabel
const DILabel * getDebugLabel() const
Return the debug label referenced by this DBG_LABEL instruction.
Definition:MachineInstr.cpp:909
llvm::MachineInstr::untieRegOperand
void untieRegOperand(unsigned OpIdx)
Break any tie involving OpIdx.
Definition:MachineInstr.h:1983
llvm::MachineInstr::copyFlagsFromInstruction
static uint32_t copyFlagsFromInstruction(const Instruction &I)
Definition:MachineInstr.cpp:568
llvm::MachineInstr::insert
void insert(mop_iterator InsertBefore, ArrayRef< MachineOperand > Ops)
Inserts Ops BEFORE It. Can untie/retie tied operands.
Definition:MachineInstr.cpp:2641
llvm::MachineInstr::setDesc
void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
Definition:MachineInstr.cpp:144
llvm::MachineInstr::isJumpTableDebugInfo
bool isJumpTableDebugInfo() const
Definition:MachineInstr.h:1402
llvm::MachineInstr::getNumExplicitDefs
unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
Definition:MachineInstr.cpp:815
llvm::MachineInstr::eraseFromBundle
void eraseFromBundle()
Unlink 'this' from its basic block and delete it.
Definition:MachineInstr.cpp:772
llvm::MachineInstr::operands
iterator_range< mop_iterator > operands()
Definition:MachineInstr.h:693
llvm::MachineInstr::setHeapAllocMarker
void setHeapAllocMarker(MachineFunction &MF, MDNode *MD)
Set a marker on instructions that denotes where we should create and emit heap alloc site labels.
Definition:MachineInstr.cpp:509
llvm::MachineInstr::getDebugVariable
const DILocalVariable * getDebugVariable() const
Return the debug variable referenced by this DBG_VALUE instruction.
Definition:MachineInstr.cpp:926
llvm::MachineInstr::hasComplexRegisterTies
bool hasComplexRegisterTies() const
Return true when an instruction has tied register that can't be determined by the instruction's descr...
Definition:MachineInstr.cpp:1653
llvm::MachineInstr::getTypeToPrint
LLT getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes, const MachineRegisterInfo &MRI) const
Debugging supportDetermine the generic type to be printed (if needed) on uses and defs.
Definition:MachineInstr.cpp:1670
llvm::MachineInstr::isLifetimeMarker
bool isLifetimeMarker() const
Definition:MachineInstr.h:1335
llvm::MachineInstr::substituteRegister
void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx, const TargetRegisterInfo &RegInfo)
Replace all occurrences of FromReg with ToReg:SubIdx, properly composing subreg indices where necessa...
Definition:MachineInstr.cpp:1279
llvm::MachineInstr::findTiedOperandIdx
unsigned findTiedOperandIdx(unsigned OpIdx) const
Given the index of a tied register operand, find the operand it is tied to.
Definition:MachineInstr.cpp:1195
llvm::MachineInstr::tieOperands
void tieOperands(unsigned DefIdx, unsigned UseIdx)
Add a tie between the register operands at DefIdx and UseIdx.
Definition:MachineInstr.cpp:1168
llvm::MachineInstr::memoperands_begin
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
Definition:MachineInstr.h:808
llvm::MachineInstr::cloneInstrSymbols
void cloneInstrSymbols(MachineFunction &MF, const MachineInstr &MI)
Clone another MachineInstr's pre- and post- instruction symbols and replace ours with it.
Definition:MachineInstr.cpp:546
llvm::MachineInstr::changeDebugValuesDefReg
void changeDebugValuesDefReg(Register Reg)
Find all DBG_VALUEs that point to the register def in this instruction and point them to Reg instead.
Definition:MachineInstr.cpp:2480
llvm::MachineInstr::isIdenticalTo
bool isIdenticalTo(const MachineInstr &Other, MICheckType Check=CheckDefs) const
Return true if this instruction is identical to Other.
Definition:MachineInstr.cpp:655
llvm::MachineInstr::hasOrderedMemoryRef
bool hasOrderedMemoryRef() const
Return true if this instruction may have an ordered or volatile memory reference, or if the informati...
Definition:MachineInstr.cpp:1533
llvm::MachineInstr::emitGenericError
void emitGenericError(const Twine &ErrMsg) const
Definition:MachineInstr.cpp:2296
llvm::MachineInstr::NoUWrap
@ NoUWrap
Definition:MachineInstr.h:107
llvm::MachineInstr::IsExact
@ IsExact
Definition:MachineInstr.h:111
llvm::MachineInstr::NoFPExcept
@ NoFPExcept
Definition:MachineInstr.h:113
llvm::MachineInstr::NoUSWrap
@ NoUSWrap
Definition:MachineInstr.h:122
llvm::MachineInstr::NonNeg
@ NonNeg
Definition:MachineInstr.h:120
llvm::MachineInstr::FmArcp
@ FmArcp
Definition:MachineInstr.h:99
llvm::MachineInstr::FmNoInfs
@ FmNoInfs
Definition:MachineInstr.h:95
llvm::MachineInstr::FmAfn
@ FmAfn
Definition:MachineInstr.h:103
llvm::MachineInstr::NoMerge
@ NoMerge
Definition:MachineInstr.h:115
llvm::MachineInstr::FrameDestroy
@ FrameDestroy
Definition:MachineInstr.h:89
llvm::MachineInstr::FrameSetup
@ FrameSetup
Definition:MachineInstr.h:87
llvm::MachineInstr::FmReassoc
@ FmReassoc
Definition:MachineInstr.h:105
llvm::MachineInstr::Unpredictable
@ Unpredictable
Definition:MachineInstr.h:118
llvm::MachineInstr::FmContract
@ FmContract
Definition:MachineInstr.h:101
llvm::MachineInstr::BundledPred
@ BundledPred
Definition:MachineInstr.h:91
llvm::MachineInstr::Disjoint
@ Disjoint
Definition:MachineInstr.h:121
llvm::MachineInstr::FmNoNans
@ FmNoNans
Definition:MachineInstr.h:93
llvm::MachineInstr::BundledSucc
@ BundledSucc
Definition:MachineInstr.h:92
llvm::MachineInstr::FmNsz
@ FmNsz
Definition:MachineInstr.h:97
llvm::MachineInstr::SameSign
@ SameSign
Definition:MachineInstr.h:124
llvm::MachineInstr::NoSWrap
@ NoSWrap
Definition:MachineInstr.h:109
llvm::MachineInstr::getMF
const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
Definition:MachineInstr.cpp:753
llvm::MachineInstr::getDebugExpression
const DIExpression * getDebugExpression() const
Return the complex address expression referenced by this DBG_VALUE instruction.
Definition:MachineInstr.cpp:942
llvm::MachineInstr::memoperands
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
Definition:MachineInstr.h:790
llvm::MachineInstr::print
void print(raw_ostream &OS, bool IsStandalone=true, bool SkipOpers=false, bool SkipDebugLoc=false, bool AddNewLine=true, const TargetInstrInfo *TII=nullptr) const
Print this MI to OS.
Definition:MachineInstr.cpp:1732
llvm::MachineInstr::isNonListDebugValue
bool isNonListDebugValue() const
Definition:MachineInstr.h:1356
llvm::MachineInstr::MICheckType
MICheckType
Definition:MachineInstr.h:1280
llvm::MachineInstr::IgnoreDefs
@ IgnoreDefs
Definition:MachineInstr.h:1283
llvm::MachineInstr::IgnoreVRegDefs
@ IgnoreVRegDefs
Definition:MachineInstr.h:1284
llvm::MachineInstr::CheckKillDead
@ CheckKillDead
Definition:MachineInstr.h:1282
llvm::MachineInstr::isLoadFoldBarrier
bool isLoadFoldBarrier() const
Returns true if it is illegal to fold a load across this instruction.
Definition:MachineInstr.cpp:1616
llvm::MachineInstr::mayStore
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
Definition:MachineInstr.h:1158
llvm::MachineInstr::setFlag
void setFlag(MIFlag Flag)
Set a MI flag.
Definition:MachineInstr.h:406
llvm::MachineInstr::getDebugLoc
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Definition:MachineInstr.h:501
llvm::MachineInstr::isDead
bool isDead(const MachineRegisterInfo &MRI, LiveRegUnits *LivePhysRegs=nullptr) const
Check whether an MI is dead.
Definition:MachineInstr.cpp:1354
llvm::MachineInstr::getFirst3LLTs
std::tuple< LLT, LLT, LLT > getFirst3LLTs() const
Definition:MachineInstr.cpp:2577
llvm::MachineInstr::getDebugVariableOp
const MachineOperand & getDebugVariableOp() const
Return the operand for the debug variable referenced by this DBG_VALUE instruction.
Definition:MachineInstr.cpp:914
llvm::MachineInstr::eraseFromParent
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
Definition:MachineInstr.cpp:767
llvm::MachineInstr::setPhysRegsDeadExcept
void setPhysRegsDeadExcept(ArrayRef< Register > UsedRegs, const TargetRegisterInfo &TRI)
Mark every physreg used by this instruction as dead except those in the UsedRegs list.
Definition:MachineInstr.cpp:2230
llvm::MachineInstr::removeOperand
void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
Definition:MachineInstr.cpp:295
llvm::MachineInstr::getPreInstrSymbol
MCSymbol * getPreInstrSymbol() const
Helper to extract a pre-instruction symbol if one has been added.
Definition:MachineInstr.h:829
llvm::MachineInstr::addRegisterKilled
bool addRegisterKilled(Register IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI kills a register.
Definition:MachineInstr.cpp:2070
llvm::MachineInstr::setPostInstrSymbol
void setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just after the instruction itself.
Definition:MachineInstr.cpp:493
llvm::MachineInstr::isDebugValue
bool isDebugValue() const
Definition:MachineInstr.h:1362
llvm::MachineInstr::dump
void dump() const
Definition:MachineInstr.cpp:1695
llvm::MachineInstr::getDebugOffset
const MachineOperand & getDebugOffset() const
Return the operand containing the offset to be used if this DBG_VALUE instruction is indirect; will b...
Definition:MachineInstr.h:506
llvm::MachineInstr::getDebugOperand
MachineOperand & getDebugOperand(unsigned Index)
Definition:MachineInstr.h:596
llvm::MachineInstr::getSpillSize
std::optional< LocationSize > getSpillSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a spill instruction.
Definition:MachineInstr.cpp:2523
llvm::MachineInstr::implicit_operands
iterator_range< mop_iterator > implicit_operands()
Definition:MachineInstr.h:707
llvm::MachineInstr::isBundledWithSucc
bool isBundledWithSucc() const
Return true if this instruction is part of a bundle, and it is not the last instruction in the bundle...
Definition:MachineInstr.h:484
llvm::MachineInstr::addRegisterDefined
void addRegisterDefined(Register Reg, const TargetRegisterInfo *RegInfo=nullptr)
We have determined MI defines a register.
Definition:MachineInstr.cpp:2213
llvm::MachineInstr::getHeapAllocMarker
MDNode * getHeapAllocMarker() const
Helper to extract a heap alloc marker if one has been added.
Definition:MachineInstr.h:853
llvm::MachineInstr::getDebugInstrNum
unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
Definition:MachineInstr.cpp:2560
llvm::MachineInstr::getFirst4LLTs
std::tuple< LLT, LLT, LLT, LLT > getFirst4LLTs() const
Definition:MachineInstr.cpp:2583
llvm::MachineInstr::isPHI
bool isPHI() const
Definition:MachineInstr.h:1406
llvm::MachineInstr::clearRegisterDeads
void clearRegisterDeads(Register Reg)
Clear all dead flags on operands defining register Reg.
Definition:MachineInstr.cpp:2201
llvm::MachineInstr::clearRegisterKills
void clearRegisterKills(Register Reg, const TargetRegisterInfo *RegInfo)
Clear all kill flags affecting Reg.
Definition:MachineInstr.cpp:2136
llvm::MachineInstr::getOperand
const MachineOperand & getOperand(unsigned i) const
Definition:MachineInstr.h:587
llvm::MachineInstr::emitInlineAsmError
void emitInlineAsmError(const Twine &ErrMsg) const
Emit an error referring to the source location of this instruction.
Definition:MachineInstr.cpp:2285
llvm::MachineInstr::getFlags
uint32_t getFlags() const
Return the MI flags bitvector.
Definition:MachineInstr.h:394
llvm::MachineInstr::isPseudoProbe
bool isPseudoProbe() const
Definition:MachineInstr.h:1349
llvm::MachineInstr::hasRegisterImplicitUseOperand
bool hasRegisterImplicitUseOperand(Register Reg) const
Returns true if the MachineInstr has an implicit-use operand of exactly the given register (not consi...
Definition:MachineInstr.cpp:1049
llvm::MachineInstr::shouldUpdateAdditionalCallInfo
bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
Definition:MachineInstr.cpp:790
llvm::MachineInstr::getPostInstrSymbol
MCSymbol * getPostInstrSymbol() const
Helper to extract a post-instruction symbol if one has been added.
Definition:MachineInstr.h:841
llvm::MachineInstr::unbundleFromSucc
void unbundleFromSucc()
Break bundle below this instruction.
Definition:MachineInstr.cpp:856
llvm::MachineInstr::all_defs
iterator_range< filtered_mop_iterator > all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
Definition:MachineInstr.h:764
llvm::MachineInstr::clearKillInfo
void clearKillInfo()
Clears kill flags on all operands.
Definition:MachineInstr.cpp:1272
llvm::MachineInstr::isDebugEntryValue
bool isDebugEntryValue() const
A DBG_VALUE is an entry value iff its debug expression contains the DW_OP_LLVM_entry_value operation.
Definition:MachineInstr.cpp:946
llvm::MachineInstr::isIndirectDebugValue
bool isIndirectDebugValue() const
A DBG_VALUE is indirect iff the location operand is a register and the offset operand is an immediate...
Definition:MachineInstr.h:1382
llvm::MachineInstr::getNumDefs
unsigned getNumDefs() const
Returns the total number of definitions.
Definition:MachineInstr.h:646
llvm::MachineInstr::setPCSections
void setPCSections(MachineFunction &MF, MDNode *MD)
Definition:MachineInstr.cpp:518
llvm::MachineInstr::isKill
bool isKill() const
Definition:MachineInstr.h:1410
llvm::MachineInstr::getLocCookieMD
const MDNode * getLocCookieMD() const
For inline asm, get the !srcloc metadata node if we have it, and decode the loc cookie from it.
Definition:MachineInstr.cpp:2270
llvm::MachineInstr::findRegisterDefOperandIdx
int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
Definition:MachineInstr.cpp:1109
llvm::MachineInstr::isFakeUse
bool isFakeUse() const
Definition:MachineInstr.h:1452
llvm::MachineInstr::isVariadic
bool isVariadic(QueryType Type=IgnoreBundle) const
Return true if this instruction can have a variable number of operands.
Definition:MachineInstr.h:926
llvm::MachineInstr::findInlineAsmFlagIdx
int findInlineAsmFlagIdx(unsigned OpIdx, unsigned *GroupNo=nullptr) const
Find the index of the flag word operand that corresponds to operand OpIdx on an inline asm instructio...
Definition:MachineInstr.cpp:880
llvm::MachineInstr::allDefsAreDead
bool allDefsAreDead() const
Return true if all the defs of this instruction are dead.
Definition:MachineInstr.cpp:1623
llvm::MachineInstr::setMMRAMetadata
void setMMRAMetadata(MachineFunction &MF, MDNode *MMRAs)
Definition:MachineInstr.cpp:537
llvm::MachineInstr::getRegClassConstraint
const TargetRegisterClass * getRegClassConstraint(unsigned OpIdx, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Compute the static register class constraint for operand OpIdx.
Definition:MachineInstr.cpp:951
llvm::MachineInstr::moveBefore
void moveBefore(MachineInstr *MovePos)
Move the instruction before MovePos.
Definition:MachineInstr.cpp:151
llvm::MachineInstr::findRegisterDefOperand
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
Definition:MachineInstr.h:1580
llvm::MachineInstr::addMemOperand
void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
Add a MachineMemOperand to the machine instruction.
Definition:MachineInstr.cpp:382
llvm::MachineInstr::addRegisterDead
bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
Definition:MachineInstr.cpp:2149
llvm::MachineInstr::mayFoldInlineAsmRegOp
bool mayFoldInlineAsmRegOp(unsigned OpId) const
Returns true if the register operand can be folded with a load or store into a frame index.
Definition:MachineInstr.cpp:2686
llvm::MachineMemOperand
A description of a memory reference used in the backend.
Definition:MachineMemOperand.h:129
llvm::MachineMemOperand::getSize
LocationSize getSize() const
Return the size in bytes of the memory reference.
Definition:MachineMemOperand.h:240
llvm::MachineMemOperand::getPseudoValue
const PseudoSourceValue * getPseudoValue() const
Definition:MachineMemOperand.h:217
llvm::MachineMemOperand::isUnordered
bool isUnordered() const
Returns true if this memory operation doesn't have any ordering constraints other than normal aliasin...
Definition:MachineMemOperand.h:312
llvm::MachineMemOperand::getAAInfo
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
Definition:MachineMemOperand.h:266
llvm::MachineMemOperand::getValue
const Value * getValue() const
Return the base address of the memory access.
Definition:MachineMemOperand.h:213
llvm::MachineMemOperand::getOffset
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
Definition:MachineMemOperand.h:231
llvm::MachineOperand
MachineOperand class - Representation of each machine instruction operand.
Definition:MachineOperand.h:48
llvm::MachineOperand::getSubReg
unsigned getSubReg() const
Definition:MachineOperand.h:374
llvm::MachineOperand::isUndef
bool isUndef() const
Definition:MachineOperand.h:404
llvm::MachineOperand::substVirtReg
void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo &)
substVirtReg - Substitute the current register with the virtual subregister Reg:SubReg.
Definition:MachineOperand.cpp:83
llvm::MachineOperand::printSubRegIdx
static void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
Definition:MachineOperand.cpp:569
llvm::MachineOperand::getImm
int64_t getImm() const
Definition:MachineOperand.h:556
llvm::MachineOperand::isImplicit
bool isImplicit() const
Definition:MachineOperand.h:389
llvm::MachineOperand::isKill
bool isKill() const
Definition:MachineOperand.h:399
llvm::MachineOperand::isReg
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Definition:MachineOperand.h:329
llvm::MachineOperand::isRegMask
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
Definition:MachineOperand.h:353
llvm::MachineOperand::getMetadata
const MDNode * getMetadata() const
Definition:MachineOperand.h:676
llvm::MachineOperand::setIsDead
void setIsDead(bool Val=true)
Definition:MachineOperand.h:525
llvm::MachineOperand::isUse
bool isUse() const
Definition:MachineOperand.h:379
llvm::MachineOperand::setMetadata
void setMetadata(const MDNode *MD)
Definition:MachineOperand.h:714
llvm::MachineOperand::isDef
bool isDef() const
Definition:MachineOperand.h:384
llvm::MachineOperand::isImm
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
Definition:MachineOperand.h:331
llvm::MachineOperand::ChangeToImmediate
void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
Definition:MachineOperand.cpp:162
llvm::MachineOperand::isMetadata
bool isMetadata() const
isMetadata - Tests if this is a MO_Metadata operand.
Definition:MachineOperand.h:357
llvm::MachineOperand::isTied
bool isTied() const
Definition:MachineOperand.h:450
llvm::MachineOperand::setIsKill
void setIsKill(bool Val=true)
Definition:MachineOperand.h:519
llvm::MachineOperand::getParent
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
Definition:MachineOperand.h:243
llvm::MachineOperand::substPhysReg
void substPhysReg(MCRegister Reg, const TargetRegisterInfo &)
substPhysReg - Substitute the current register with the physical register Reg, taking any existing Su...
Definition:MachineOperand.cpp:93
llvm::MachineOperand::setIsEarlyClobber
void setIsEarlyClobber(bool Val=true)
Definition:MachineOperand.h:542
llvm::MachineOperand::isDebug
bool isDebug() const
Definition:MachineOperand.h:455
llvm::MachineOperand::isDead
bool isDead() const
Definition:MachineOperand.h:394
llvm::MachineOperand::setIsUndef
void setIsUndef(bool Val=true)
Definition:MachineOperand.h:530
llvm::MachineOperand::setIsDebug
void setIsDebug(bool Val=true)
Definition:MachineOperand.h:547
llvm::MachineOperand::getReg
Register getReg() const
getReg - Returns the register number.
Definition:MachineOperand.h:369
llvm::MachineOperand::isIdenticalTo
bool isIdenticalTo(const MachineOperand &Other) const
Returns true if this operand is identical to the specified operand except for liveness related flags ...
Definition:MachineOperand.cpp:319
llvm::MachineOperand::clobbersPhysReg
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
Definition:MachineOperand.h:646
llvm::MachineOperand::print
void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr, const TargetIntrinsicInfo *IntrinsicInfo=nullptr) const
Print the MachineOperand to os.
Definition:MachineOperand.cpp:784
llvm::MachineOperand::printSymbol
static void printSymbol(raw_ostream &OS, MCSymbol &Sym)
Print a MCSymbol as an operand.
Definition:MachineOperand.cpp:630
llvm::MachineOperand::CreateReg
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
Definition:MachineOperand.h:838
llvm::MachineRegisterInfo
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Definition:MachineRegisterInfo.h:51
llvm::MemoryLocation
Representation for a specific memory location.
Definition:MemoryLocation.h:227
llvm::MemoryLocation::UnknownSize
@ UnknownSize
Definition:MemoryLocation.h:232
llvm::Metadata::printAsOperand
void printAsOperand(raw_ostream &OS, const Module *M=nullptr) const
Print as operand.
Definition:AsmWriter.cpp:5250
llvm::ModuleSlotTracker
Manage lifetime of a slot tracker for printing IR.
Definition:ModuleSlotTracker.h:44
llvm::ModuleSlotTracker::incorporateFunction
void incorporateFunction(const Function &F)
Incorporate the given function.
Definition:AsmWriter.cpp:904
llvm::Module
A Module instance is used to store all the information related to an LLVM module.
Definition:Module.h:65
llvm::OverflowingBinaryOperator
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition:Operator.h:77
llvm::PossiblyDisjointInst
An or instruction, which can be marked as "disjoint", indicating that the inputs don't have a 1 in th...
Definition:InstrTypes.h:400
llvm::PossiblyExactOperator
A udiv or sdiv instruction, which can be marked as "exact", indicating that no bits are destroyed.
Definition:Operator.h:155
llvm::PossiblyNonNegInst
Instruction that can have a nneg flag (zext/uitofp).
Definition:InstrTypes.h:636
llvm::PseudoSourceValue
Special value supplied for machine level alias analysis.
Definition:PseudoSourceValue.h:31
llvm::PseudoSourceValue::mayAlias
virtual bool mayAlias(const MachineFrameInfo *) const
Return true if the memory pointed to by this PseudoSourceValue can ever alias an LLVM IR Value.
Definition:PseudoSourceValue.cpp:55
llvm::Register
Wrapper class representing virtual and physical registers.
Definition:Register.h:19
llvm::Register::isVirtual
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition:Register.h:91
llvm::Register::isPhysical
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition:Register.h:95
llvm::SmallBitVector
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
Definition:SmallBitVector.h:35
llvm::SmallBitVector::set
SmallBitVector & set()
Definition:SmallBitVector.h:366
llvm::SmallDenseMap
Definition:DenseMap.h:883
llvm::SmallPtrSetImpl
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition:SmallPtrSet.h:363
llvm::SmallPtrSetImpl::insert
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition:SmallPtrSet.h:384
llvm::SmallPtrSet
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition:SmallPtrSet.h:519
llvm::SmallVectorBase::empty
bool empty() const
Definition:SmallVector.h:81
llvm::SmallVectorBase::size
size_t size() const
Definition:SmallVector.h:78
llvm::SmallVectorImpl
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition:SmallVector.h:573
llvm::SmallVectorImpl::emplace_back
reference emplace_back(ArgTypes &&... Args)
Definition:SmallVector.h:937
llvm::SmallVectorImpl::reserve
void reserve(size_type N)
Definition:SmallVector.h:663
llvm::SmallVectorImpl::append
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition:SmallVector.h:683
llvm::SmallVectorTemplateBase::pop_back
void pop_back()
Definition:SmallVector.h:425
llvm::SmallVectorTemplateBase::push_back
void push_back(const T &Elt)
Definition:SmallVector.h:413
llvm::SmallVectorTemplateCommon::end
iterator end()
Definition:SmallVector.h:269
llvm::SmallVectorTemplateCommon::begin
iterator begin()
Definition:SmallVector.h:267
llvm::SmallVectorTemplateCommon::back
reference back()
Definition:SmallVector.h:308
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm::StackMaps::getNextMetaArgIdx
static unsigned getNextMetaArgIdx(const MachineInstr *MI, unsigned CurIdx)
Get index of next meta operand.
Definition:StackMaps.cpp:170
llvm::StatepointOpers
MI-level Statepoint operands.
Definition:StackMaps.h:158
llvm::StatepointOpers::getFirstGCPtrIdx
int getFirstGCPtrIdx()
Get index of first GC pointer operand of -1 if there are none.
Definition:StackMaps.cpp:124
llvm::TargetInstrInfo
TargetInstrInfo - Interface to description of machine instruction set.
Definition:TargetInstrInfo.h:112
llvm::TargetIntrinsicInfo
TargetIntrinsicInfo - Interface to description of machine instruction set.
Definition:TargetIntrinsicInfo.h:29
llvm::TargetRegisterClass
Definition:TargetRegisterInfo.h:44
llvm::TargetRegisterInfo
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Definition:TargetRegisterInfo.h:235
llvm::TargetRegisterInfo::getSubReg
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Definition:TargetRegisterInfo.h:1217
llvm::TargetRegisterInfo::regsOverlap
bool regsOverlap(Register RegA, Register RegB) const
Returns true if the two registers are equal or alias each other.
Definition:TargetRegisterInfo.h:460
llvm::TargetSubtargetInfo::getInstrInfo
virtual const TargetInstrInfo * getInstrInfo() const
Definition:TargetSubtargetInfo.h:97
llvm::TruncInst
This class represents a truncation of integer types.
Definition:Instructions.h:4503
llvm::Twine
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition:Twine.h:81
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition:Type.h:45
llvm::Use
A Use represents the edge between a Value definition and its users.
Definition:Use.h:43
llvm::Value
LLVM Value Representation.
Definition:Value.h:74
llvm::details::FixedOrScalableQuantity::getKnownMinValue
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition:TypeSize.h:168
llvm::formatted_raw_ostream::PadToColumn
formatted_raw_ostream & PadToColumn(unsigned NewCol)
PadToColumn - Align the output to some column number.
Definition:FormattedStream.cpp:125
llvm::ilist_node_impl< ilist_detail::compute_node_options< T, Options... >::type >::getIterator
self_iterator getIterator()
Definition:ilist_node.h:132
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition:raw_ostream.h:52
uint16_t
uint32_t
uint64_t
ErrorHandling.h
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition:ErrorHandling.h:143
TargetMachine.h
llvm::HexagonMCInstrInfo::getDesc
MCInstrDesc const & getDesc(MCInstrInfo const &MCII, MCInst const &MCI)
Definition:HexagonMCInstrInfo.cpp:255
llvm::MCID::UnmodeledSideEffects
@ UnmodeledSideEffects
Definition:MCInstrDesc.h:173
llvm::MCOI::EARLY_CLOBBER
@ EARLY_CLOBBER
Definition:MCInstrDesc.h:37
llvm::MCOI::TIED_TO
@ TIED_TO
Definition:MCInstrDesc.h:36
llvm::numbers::e
constexpr double e
Definition:MathExtras.h:47
llvm::omp::RTLDependInfoFields::Flags
@ Flags
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::drop_begin
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition:STLExtras.h:329
llvm::hash_value
hash_code hash_value(const FixedPointSemantics &Val)
Definition:APFixedPoint.h:136
llvm::fdbgs
formatted_raw_ostream & fdbgs()
fdbgs() - This returns a reference to a formatted_raw_ostream for debug output.
Definition:FormattedStream.cpp:162
llvm::BuildMI
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
Definition:MachineInstrBuilder.h:373
llvm::Depth
@ Depth
Definition:SIMachineScheduler.h:36
llvm::updateDbgValueForSpill
void updateDbgValueForSpill(MachineInstr &Orig, int FrameIndex, Register Reg)
Update a DBG_VALUE whose value has been spilled to FrameIndex.
Definition:MachineInstr.cpp:2454
llvm::any_of
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:1746
llvm::make_pointee_range
iterator_range< pointee_iterator< WrappedIteratorT > > make_pointee_range(RangeT &&Range)
Definition:iterator.h:336
llvm::dbgs
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition:Debug.cpp:163
llvm::none_of
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition:STLExtras.h:1753
llvm::IRMemLocation::Other
@ Other
Any other memory.
llvm::move
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition:STLExtras.h:1873
llvm::buildDbgValueForSpill
MachineInstr * buildDbgValueForSpill(MachineBasicBlock &BB, MachineBasicBlock::iterator I, const MachineInstr &Orig, int FrameIndex, Register SpillReg)
Clone a DBG_VALUE whose value has been spilled to FrameIndex.
Definition:MachineInstr.cpp:2409
llvm::is_contained
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition:STLExtras.h:1903
llvm::hash_combine_range
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition:Hashing.h:468
std
Implement std::hash so that hash_code can be used in STL containers.
Definition:BitVector.h:858
raw_ostream.h
N
#define N
llvm::AAMDNodes
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition:Metadata.h:764
llvm::MachineInstrExpressionTrait::getHashValue
static unsigned getHashValue(const MachineInstr *const &MI)
Definition:MachineInstr.cpp:2256

Generated on Thu Jul 17 2025 11:31:31 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp