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