LLVM 24.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
382 MachineMemOperand *MO) {
383 if (memoperands_empty()) {
384 setMemRefs(MF, {MO});
385 return;
386 }
387
390 MMOs.push_back(MO);
391 setMemRefs(MF, MMOs);
392}
393
394void MachineInstr::cloneMemRefs(MachineFunction &MF, const MachineInstr &MI) {
395 if (this == &MI)
396 // Nothing to do for a self-clone!
397 return;
398
399 assert(&MF == MI.getMF() &&
400 "Invalid machine functions when cloning memory refrences!");
401 // See if we can just steal the extra info already allocated for the
402 // instruction. We can do this whenever the pre- and post-instruction symbols
403 // are the same (including null).
404 if (getPreInstrSymbol() == MI.getPreInstrSymbol() &&
405 getPostInstrSymbol() == MI.getPostInstrSymbol() &&
406 getHeapAllocMarker() == MI.getHeapAllocMarker() &&
407 getPCSections() == MI.getPCSections() && getMMRAMetadata() &&
408 MI.getMMRAMetadata()) {
409 Info = MI.Info;
410 return;
411 }
412
413 // Otherwise, fall back on a copy-based clone.
414 setMemRefs(MF, MI.memoperands());
415}
416
417/// Check to see if the MMOs pointed to by the two MemRefs arrays are
418/// identical.
421 if (LHS.size() != RHS.size())
422 return false;
423
424 auto LHSPointees = make_pointee_range(LHS);
425 auto RHSPointees = make_pointee_range(RHS);
426 return std::equal(LHSPointees.begin(), LHSPointees.end(),
427 RHSPointees.begin());
428}
429
432 // Try handling easy numbers of MIs with simpler mechanisms.
433 if (MIs.empty()) {
434 dropMemRefs(MF);
435 return;
436 }
437 if (MIs.size() == 1) {
438 cloneMemRefs(MF, *MIs[0]);
439 return;
440 }
441 // Because an empty memoperands list provides *no* information and must be
442 // handled conservatively (assuming the instruction can do anything), the only
443 // way to merge with it is to drop all other memoperands.
444 if (MIs[0]->memoperands_empty()) {
445 dropMemRefs(MF);
446 return;
447 }
448
449 // Handle the general case.
451 // Start with the first instruction.
452 assert(&MF == MIs[0]->getMF() &&
453 "Invalid machine functions when cloning memory references!");
454 MergedMMOs.append(MIs[0]->memoperands_begin(), MIs[0]->memoperands_end());
455 // Now walk all the other instructions and accumulate any different MMOs.
456 for (const MachineInstr &MI : make_pointee_range(MIs.slice(1))) {
457 assert(&MF == MI.getMF() &&
458 "Invalid machine functions when cloning memory references!");
459
460 // Skip MIs with identical operands to the first. This is a somewhat
461 // arbitrary hack but will catch common cases without being quadratic.
462 // TODO: We could fully implement merge semantics here if needed.
463 if (hasIdenticalMMOs(MIs[0]->memoperands(), MI.memoperands()))
464 continue;
465
466 // Because an empty memoperands list provides *no* information and must be
467 // handled conservatively (assuming the instruction can do anything), the
468 // only way to merge with it is to drop all other memoperands.
469 if (MI.memoperands_empty()) {
470 dropMemRefs(MF);
471 return;
472 }
473
474 // Otherwise accumulate these into our temporary buffer of the merged state.
475 MergedMMOs.append(MI.memoperands_begin(), MI.memoperands_end());
476 }
477
478 setMemRefs(MF, MergedMMOs);
479}
480
482 // Do nothing if old and new symbols are the same.
483 if (Symbol == getPreInstrSymbol())
484 return;
485
486 // If there was only one symbol and we're removing it, just clear info.
487 if (!Symbol && Info.is<EIIK_PreInstrSymbol>()) {
488 Info.clear();
489 return;
490 }
491
492 setExtraInfo(MF, memoperands(), Symbol, getPostInstrSymbol(),
495}
496
498 // Do nothing if old and new symbols are the same.
499 if (Symbol == getPostInstrSymbol())
500 return;
501
502 // If there was only one symbol and we're removing it, just clear info.
503 if (!Symbol && Info.is<EIIK_PostInstrSymbol>()) {
504 Info.clear();
505 return;
506 }
507
508 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), Symbol,
511}
512
514 // Do nothing if old and new symbols are the same.
515 if (Marker == getHeapAllocMarker())
516 return;
517
518 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
521}
522
524 // Do nothing if old and new symbols are the same.
525 if (PCSections == getPCSections())
526 return;
527
528 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
529 getHeapAllocMarker(), PCSections, getCFIType(),
531}
532
534 // Do nothing if old and new types are the same.
535 if (Type == getCFIType())
536 return;
537
538 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
541}
542
544 // Do nothing if old and new symbols are the same.
545 if (MMRAs == getMMRAMetadata())
546 return;
547
548 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
551}
552
554 // Do nothing if old and new symbols are the same.
555 if (DS == getDeactivationSymbol())
556 return;
557
558 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
560 getMMRAMetadata(), DS);
561}
562
564 const MachineInstr &MI) {
565 if (this == &MI)
566 // Nothing to do for a self-clone!
567 return;
568
569 assert(&MF == MI.getMF() &&
570 "Invalid machine functions when cloning instruction symbols!");
571
572 setPreInstrSymbol(MF, MI.getPreInstrSymbol());
573 setPostInstrSymbol(MF, MI.getPostInstrSymbol());
574 setHeapAllocMarker(MF, MI.getHeapAllocMarker());
575 setPCSections(MF, MI.getPCSections());
576 setMMRAMetadata(MF, MI.getMMRAMetadata());
577}
578
579uint32_t MachineInstr::mergeFlagsWith(const MachineInstr &Other) const {
580 // For now, the just return the union of the flags. If the flags get more
581 // complicated over time, we might need more logic here.
582 return getFlags() | Other.getFlags();
583}
584
586 uint32_t MIFlags = 0;
587 // Copy the wrapping flags.
588 if (const OverflowingBinaryOperator *OB =
590 if (OB->hasNoSignedWrap())
592 if (OB->hasNoUnsignedWrap())
594 } else if (const TruncInst *TI = dyn_cast<TruncInst>(&I)) {
595 if (TI->hasNoSignedWrap())
597 if (TI->hasNoUnsignedWrap())
599 } else if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(&I)) {
600 if (GEP->hasNoUnsignedSignedWrap())
602 if (GEP->hasNoUnsignedWrap())
604 if (GEP->isInBounds())
606 }
607
608 // Copy the nonneg flag.
610 if (PNI->hasNonNeg())
612 // Copy the disjoint flag.
613 } else if (const PossiblyDisjointInst *PD =
615 if (PD->isDisjoint())
617 }
618
619 // Copy the samesign flag.
620 if (const ICmpInst *ICmp = dyn_cast<ICmpInst>(&I))
621 if (ICmp->hasSameSign())
623
624 // Copy the nonnull flag.
625 if (const auto *ASC = dyn_cast<AddrSpaceCastInst>(&I))
626 if (ASC->hasNonNull())
628
629 // Copy the exact flag.
631 if (PE->isExact())
633
634 // Copy the fast-math flags.
636 const FastMathFlags Flags = FP->getFastMathFlags();
637 if (Flags.noNaNs())
639 if (Flags.noInfs())
641 if (Flags.noSignedZeros())
643 if (Flags.allowReciprocal())
645 if (Flags.allowContract())
647 if (Flags.approxFunc())
649 if (Flags.allowReassoc())
651 }
652
653 if (I.getMetadata(LLVMContext::MD_unpredictable))
655
656 return MIFlags;
657}
658
662
663bool MachineInstr::hasPropertyInBundle(uint64_t Mask, QueryType Type) const {
664 assert(!isBundledWithPred() && "Must be called on bundle header");
666 if (MII->getDesc().getFlags() & Mask) {
667 if (Type == AnyInBundle)
668 return true;
669 } else {
670 if (Type == AllInBundle && !MII->isBundle())
671 return false;
672 }
673 // This was the last instruction in the bundle.
674 if (!MII->isBundledWithSucc())
675 return Type == AllInBundle;
676 }
677}
678
679bool MachineInstr::isIdenticalTo(const MachineInstr &Other,
680 MICheckType Check) const {
681 // If opcodes or number of operands are not the same then the two
682 // instructions are obviously not identical.
683 if (Other.getOpcode() != getOpcode() ||
684 Other.getNumOperands() != getNumOperands())
685 return false;
686
687 if (isBundle()) {
688 // We have passed the test above that both instructions have the same
689 // opcode, so we know that both instructions are bundles here. Let's compare
690 // MIs inside the bundle.
691 assert(Other.isBundle() && "Expected that both instructions are bundles.");
694 // Loop until we analysed the last intruction inside at least one of the
695 // bundles.
696 while (I1->isBundledWithSucc() && I2->isBundledWithSucc()) {
697 ++I1;
698 ++I2;
699 if (!I1->isIdenticalTo(*I2, Check))
700 return false;
701 }
702 // If we've reached the end of just one of the two bundles, but not both,
703 // the instructions are not identical.
704 if (I1->isBundledWithSucc() || I2->isBundledWithSucc())
705 return false;
706 }
707
708 // Check operands to make sure they match.
709 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
710 const MachineOperand &MO = getOperand(i);
711 const MachineOperand &OMO = Other.getOperand(i);
712 if (!MO.isReg()) {
713 if (!MO.isIdenticalTo(OMO))
714 return false;
715 continue;
716 }
717
718 // Clients may or may not want to ignore defs when testing for equality.
719 // For example, machine CSE pass only cares about finding common
720 // subexpressions, so it's safe to ignore virtual register defs.
721 if (MO.isDef()) {
722 if (Check == IgnoreDefs)
723 continue;
724 else if (Check == IgnoreVRegDefs) {
725 if (!MO.getReg().isVirtual() || !OMO.getReg().isVirtual())
726 if (!MO.isIdenticalTo(OMO))
727 return false;
728 } else {
729 if (!MO.isIdenticalTo(OMO))
730 return false;
731 if (Check == CheckKillDead && MO.isDead() != OMO.isDead())
732 return false;
733 }
734 } else {
735 if (!MO.isIdenticalTo(OMO))
736 return false;
737 if (Check == CheckKillDead && MO.isKill() != OMO.isKill())
738 return false;
739 }
740 }
741 // If DebugLoc does not match then two debug instructions are not identical.
742 if (isDebugInstr())
743 if (getDebugLoc() && Other.getDebugLoc() &&
744 getDebugLoc() != Other.getDebugLoc())
745 return false;
746 // If pre- or post-instruction symbols do not match then the two instructions
747 // are not identical.
748 if (getPreInstrSymbol() != Other.getPreInstrSymbol() ||
749 getPostInstrSymbol() != Other.getPostInstrSymbol())
750 return false;
751 if (isCall()) {
752 // Call instructions with different CFI types are not identical.
753 if (getCFIType() != Other.getCFIType())
754 return false;
755 // Even if the call instructions have the same ops, they are not identical
756 // if they are for different globals (this may happen with indirect calls).
761 Other.getParent()->getParent()->tryGetCalledGlobal(&Other);
762 if (ThisCGI.Callee != OtherCGI.Callee ||
763 ThisCGI.TargetFlags != OtherCGI.TargetFlags)
764 return false;
765 }
766 }
767 if (getDeactivationSymbol() != Other.getDeactivationSymbol())
768 return false;
769
770 return true;
771}
772
773bool MachineInstr::isEquivalentDbgInstr(const MachineInstr &Other) const {
774 if (!isDebugValueLike() || !Other.isDebugValueLike())
775 return false;
776 if (getDebugLoc() != Other.getDebugLoc())
777 return false;
778 if (getDebugVariable() != Other.getDebugVariable())
779 return false;
780 if (getNumDebugOperands() != Other.getNumDebugOperands())
781 return false;
782 for (unsigned OpIdx = 0; OpIdx < getNumDebugOperands(); ++OpIdx)
783 if (!getDebugOperand(OpIdx).isIdenticalTo(Other.getDebugOperand(OpIdx)))
784 return false;
787 Other.getDebugExpression(), Other.isIndirectDebugValue()))
788 return false;
789 return true;
790}
791
793 return getParent()->getParent();
794}
795
797 assert(getParent() && "Not embedded in a basic block!");
798 return getParent()->remove(this);
799}
800
802 assert(getParent() && "Not embedded in a basic block!");
803 return getParent()->remove_instr(this);
804}
805
807 assert(getParent() && "Not embedded in a basic block!");
808 return getParent()->erase(this);
809}
810
812 assert(getParent() && "Not embedded in a basic block!");
813 getParent()->erase_instr(this);
814}
815
817 if (!isCall(Type))
818 return false;
819 switch (getOpcode()) {
820 case TargetOpcode::PATCHPOINT:
821 case TargetOpcode::STACKMAP:
822 case TargetOpcode::STATEPOINT:
823 case TargetOpcode::FENTRY_CALL:
824 return false;
825 }
826 return true;
827}
828
834
835template <typename Operand, typename Instruction>
836static iterator_range<
837 filter_iterator<Operand *, std::function<bool(Operand &Op)>>>
839 std::function<bool(Operand & Op)> OpUsesReg(
840 [Reg](Operand &Op) { return Op.isReg() && Op.getReg() == Reg; });
841 return make_filter_range(MI->debug_operands(), OpUsesReg);
842}
843
845 std::function<bool(const MachineOperand &Op)>>>
850
856
858 unsigned NumOperands = MCID->getNumOperands();
859 if (!MCID->isVariadic())
860 return NumOperands;
861
862 for (const MachineOperand &MO : operands_impl().drop_front(NumOperands)) {
863 // The operands must always be in the following order:
864 // - explicit reg defs,
865 // - other explicit operands (reg uses, immediates, etc.),
866 // - implicit reg defs
867 // - implicit reg uses
868 if (MO.isReg() && MO.isImplicit())
869 break;
870 ++NumOperands;
871 }
872 return NumOperands;
873}
874
876 unsigned NumDefs = MCID->getNumDefs();
877 if (!MCID->isVariadic())
878 return NumDefs;
879
880 for (const MachineOperand &MO : operands_impl().drop_front(NumDefs)) {
881 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
882 break;
883 ++NumDefs;
884 }
885 return NumDefs;
886}
887
889 assert(!isBundledWithPred() && "MI is already bundled with its predecessor");
892 --Pred;
893 assert(!Pred->isBundledWithSucc() && "Inconsistent bundle flags");
894 Pred->setFlag(BundledSucc);
895}
896
898 assert(!isBundledWithSucc() && "MI is already bundled with its successor");
901 ++Succ;
902 assert(!Succ->isBundledWithPred() && "Inconsistent bundle flags");
903 Succ->setFlag(BundledPred);
904}
905
907 assert(isBundledWithPred() && "MI isn't bundled with its predecessor");
910 --Pred;
911 assert(Pred->isBundledWithSucc() && "Inconsistent bundle flags");
912 Pred->clearFlag(BundledSucc);
913}
914
916 assert(isBundledWithSucc() && "MI isn't bundled with its successor");
919 ++Succ;
920 assert(Succ->isBundledWithPred() && "Inconsistent bundle flags");
921 Succ->clearFlag(BundledPred);
922}
923
925 if (isInlineAsm()) {
926 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
927 if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
928 return true;
929 }
930 return false;
931}
932
934 assert(isInlineAsm() && "getInlineAsmDialect() only works for inline asms!");
935 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
936 return InlineAsm::getDialect(ExtraInfo);
937}
938
940 unsigned *GroupNo) const {
941 assert(isInlineAsm() && "Expected an inline asm instruction");
942 assert(OpIdx < getNumOperands() && "OpIdx out of range");
943
944 // Ignore queries about the initial operands.
946 return -1;
947
948 unsigned Group = 0;
949 unsigned NumOps;
950 for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;
951 i += NumOps) {
952 const MachineOperand &FlagMO = getOperand(i);
953 // If we reach the implicit register operands, stop looking.
954 if (!FlagMO.isImm())
955 return -1;
956 const InlineAsm::Flag F(FlagMO.getImm());
957 NumOps = 1 + F.getNumOperandRegisters();
958 if (i + NumOps > OpIdx) {
959 if (GroupNo)
960 *GroupNo = Group;
961 return i;
962 }
963 ++Group;
964 }
965 return -1;
966}
967
969 assert(isDebugLabel() && "not a DBG_LABEL");
970 return cast<DILabel>(getOperand(0).getMetadata());
971}
972
974 assert((isDebugValueLike()) && "not a DBG_VALUE*");
975 unsigned VariableOp = isNonListDebugValue() ? 2 : 0;
976 return getOperand(VariableOp);
977}
978
980 assert((isDebugValueLike()) && "not a DBG_VALUE*");
981 unsigned VariableOp = isNonListDebugValue() ? 2 : 0;
982 return getOperand(VariableOp);
983}
984
988
990 assert((isDebugValueLike()) && "not a DBG_VALUE*");
991 unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;
992 return getOperand(ExpressionOp);
993}
994
996 assert((isDebugValueLike()) && "not a DBG_VALUE*");
997 unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;
998 return getOperand(ExpressionOp);
999}
1000
1004
1008
1011 const TargetInstrInfo *TII,
1012 const TargetRegisterInfo *TRI) const {
1013 assert(getParent() && "Can't have an MBB reference here!");
1014 assert(getMF() && "Can't have an MF reference here!");
1015 // Most opcodes have fixed constraints in their MCInstrDesc.
1016 if (!isInlineAsm())
1017 return TII->getRegClass(getDesc(), OpIdx);
1018
1019 if (!getOperand(OpIdx).isReg())
1020 return nullptr;
1021
1022 // For tied uses on inline asm, get the constraint from the def.
1023 unsigned DefIdx;
1024 if (getOperand(OpIdx).isUse() && isRegTiedToDefOperand(OpIdx, &DefIdx))
1025 OpIdx = DefIdx;
1026
1027 // Inline asm stores register class constraints in the flag word.
1028 int FlagIdx = findInlineAsmFlagIdx(OpIdx);
1029 if (FlagIdx < 0)
1030 return nullptr;
1031
1032 const InlineAsm::Flag F(getOperand(FlagIdx).getImm());
1033 unsigned RCID;
1034 if ((F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind()) &&
1035 F.hasRegClassConstraint(RCID))
1036 return TRI->getRegClass(RCID);
1037
1038 // Assume that all registers in a memory operand are pointers.
1039 if (F.isMemKind())
1040 return TII->getInlineAsmMemoryOperandRegClass(F.getMemoryConstraintID());
1041
1042 return nullptr;
1043}
1044
1046 Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII,
1047 const TargetRegisterInfo *TRI, bool ExploreBundle) const {
1048 // Check every operands inside the bundle if we have
1049 // been asked to.
1050 if (ExploreBundle)
1051 for (ConstMIBundleOperands OpndIt(*this); OpndIt.isValid() && CurRC;
1052 ++OpndIt)
1053 CurRC = OpndIt->getParent()->getRegClassConstraintEffectForVRegImpl(
1054 OpndIt.getOperandNo(), Reg, CurRC, TII, TRI);
1055 else
1056 // Otherwise, just check the current operands.
1057 for (unsigned i = 0, e = NumOperands; i < e && CurRC; ++i)
1058 CurRC = getRegClassConstraintEffectForVRegImpl(i, Reg, CurRC, TII, TRI);
1059 return CurRC;
1060}
1061
1062const TargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVRegImpl(
1063 unsigned OpIdx, Register Reg, const TargetRegisterClass *CurRC,
1064 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {
1065 assert(CurRC && "Invalid initial register class");
1066 // Check if Reg is constrained by some of its use/def from MI.
1067 const MachineOperand &MO = getOperand(OpIdx);
1068 if (!MO.isReg() || MO.getReg() != Reg)
1069 return CurRC;
1070 // If yes, accumulate the constraints through the operand.
1071 return getRegClassConstraintEffect(OpIdx, CurRC, TII, TRI);
1072}
1073
1075 unsigned OpIdx, const TargetRegisterClass *CurRC,
1076 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {
1077 const TargetRegisterClass *OpRC = getRegClassConstraint(OpIdx, TII, TRI);
1078 const MachineOperand &MO = getOperand(OpIdx);
1079 assert(MO.isReg() &&
1080 "Cannot get register constraints for non-register operand");
1081 assert(CurRC && "Invalid initial register class");
1082 if (unsigned SubIdx = MO.getSubReg()) {
1083 if (OpRC)
1084 CurRC = TRI->getMatchingSuperRegClass(CurRC, OpRC, SubIdx);
1085 else
1086 CurRC = TRI->getSubClassWithSubReg(CurRC, SubIdx);
1087 } else if (OpRC)
1088 CurRC = TRI->getCommonSubClass(CurRC, OpRC);
1089 return CurRC;
1090}
1091
1092/// Return the number of instructions inside the MI bundle, not counting the
1093/// header instruction.
1096 unsigned Size = 0;
1097 while (I->isBundledWithSucc()) {
1098 ++Size;
1099 ++I;
1100 }
1101 return Size;
1102}
1103
1104/// Returns true if the MachineInstr has an implicit-use operand of exactly
1105/// the given register (not considering sub/super-registers).
1107 for (const MachineOperand &MO : implicit_operands()) {
1108 if (MO.isReg() && MO.isUse() && MO.getReg() == Reg)
1109 return true;
1110 }
1111 return false;
1112}
1113
1114/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of
1115/// the specific register or -1 if it is not found. It further tightens
1116/// the search criteria to a use that kills the register if isKill is true.
1118 const TargetRegisterInfo *TRI,
1119 bool isKill) const {
1120 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1121 const MachineOperand &MO = getOperand(i);
1122 if (!MO.isReg() || !MO.isUse())
1123 continue;
1124 Register MOReg = MO.getReg();
1125 if (!MOReg)
1126 continue;
1127 if (MOReg == Reg || (TRI && Reg && MOReg && TRI->regsOverlap(MOReg, Reg)))
1128 if (!isKill || MO.isKill())
1129 return i;
1130 }
1131 return -1;
1132}
1133
1134bool MachineInstr::hasTiedAndOtherReadOf(Register Reg, unsigned SubReg) const {
1135 bool Tied = false;
1136 unsigned Reads = 0;
1137 for (const MachineOperand &MO : all_uses()) {
1138 if (MO.getReg() != Reg || MO.getSubReg() != SubReg)
1139 continue;
1140 ++Reads;
1141 // A tie its def already satisfies is not rewritten.
1142 Tied |= MO.isTied() &&
1144 }
1145 return Tied && Reads > 1;
1146}
1147
1148/// readsWritesVirtualRegister - Return a pair of bools (reads, writes)
1149/// indicating if this instruction reads or writes Reg. This also considers
1150/// partial defines.
1151std::pair<bool,bool>
1154 bool PartDef = false; // Partial redefine.
1155 bool FullDef = false; // Full define.
1156 bool Use = false;
1157
1158 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1159 const MachineOperand &MO = getOperand(i);
1160 if (!MO.isReg() || MO.getReg() != Reg)
1161 continue;
1162 if (Ops)
1163 Ops->push_back(i);
1164 if (MO.isUse())
1165 Use |= !MO.isUndef();
1166 else if (MO.getSubReg() && !MO.isUndef())
1167 // A partial def undef doesn't count as reading the register.
1168 PartDef = true;
1169 else
1170 FullDef = true;
1171 }
1172 // A partial redefine uses Reg unless there is also a full define.
1173 return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef);
1174}
1175
1176/// findRegisterDefOperandIdx() - Returns the operand index that is a def of
1177/// the specified register or -1 if it is not found. If isDead is true, defs
1178/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
1179/// also checks if there is a def of a super-register.
1181 const TargetRegisterInfo *TRI,
1182 bool isDead, bool Overlap) const {
1183 bool isPhys = Reg.isPhysical();
1184 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1185 const MachineOperand &MO = getOperand(i);
1186 // Accept regmask operands when Overlap is set.
1187 // Ignore them when looking for a specific def operand (Overlap == false).
1188 if (isPhys && Overlap && MO.isRegMask() && MO.clobbersPhysReg(Reg))
1189 return i;
1190 if (!MO.isReg() || !MO.isDef())
1191 continue;
1192 Register MOReg = MO.getReg();
1193 bool Found = (MOReg == Reg);
1194 if (!Found && TRI && isPhys && MOReg.isPhysical()) {
1195 if (Overlap)
1196 Found = TRI->regsOverlap(MOReg, Reg);
1197 else
1198 Found = TRI->isSubRegister(MOReg, Reg);
1199 }
1200 if (Found && (!isDead || MO.isDead()))
1201 return i;
1202 }
1203 return -1;
1204}
1205
1206/// findFirstPredOperandIdx() - Find the index of the first operand in the
1207/// operand list that is used to represent the predicate. It returns -1 if
1208/// none is found.
1210 // Don't call MCID.findFirstPredOperandIdx() because this variant
1211 // is sometimes called on an instruction that's not yet complete, and
1212 // so the number of operands is less than the MCID indicates. In
1213 // particular, the PTX target does this.
1214 const MCInstrDesc &MCID = getDesc();
1215 if (MCID.isPredicable()) {
1216 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1217 if (MCID.operands()[i].isPredicate())
1218 return i;
1219 }
1220
1221 return -1;
1222}
1223
1224// MachineOperand::TiedTo is 4 bits wide.
1225const unsigned TiedMax = 15;
1226
1227/// tieOperands - Mark operands at DefIdx and UseIdx as tied to each other.
1228///
1229/// Use and def operands can be tied together, indicated by a non-zero TiedTo
1230/// field. TiedTo can have these values:
1231///
1232/// 0: Operand is not tied to anything.
1233/// 1 to TiedMax-1: Tied to getOperand(TiedTo-1).
1234/// TiedMax: Tied to an operand >= TiedMax-1.
1235///
1236/// The tied def must be one of the first TiedMax operands on a normal
1237/// instruction. INLINEASM instructions allow more tied defs.
1238///
1239void MachineInstr::tieOperands(unsigned DefIdx, unsigned UseIdx) {
1240 MachineOperand &DefMO = getOperand(DefIdx);
1241 MachineOperand &UseMO = getOperand(UseIdx);
1242 assert(DefMO.isDef() && "DefIdx must be a def operand");
1243 assert(UseMO.isUse() && "UseIdx must be a use operand");
1244 assert(!DefMO.isTied() && "Def is already tied to another use");
1245 assert(!UseMO.isTied() && "Use is already tied to another def");
1246
1247 if (DefIdx < TiedMax) {
1248 UseMO.TiedTo = DefIdx + 1;
1249 } else {
1250 // Inline asm can use the group descriptors to find tied operands,
1251 // statepoint tied operands are trivial to match (1-1 reg def with reg use),
1252 // but on normal instruction, the tied def must be within the first TiedMax
1253 // operands.
1254 assert((isInlineAsm() || getOpcode() == TargetOpcode::STATEPOINT) &&
1255 "DefIdx out of range");
1256 UseMO.TiedTo = TiedMax;
1257 }
1258
1259 // UseIdx can be out of range, we'll search for it in findTiedOperandIdx().
1260 DefMO.TiedTo = std::min(UseIdx + 1, TiedMax);
1261}
1262
1263/// Given the index of a tied register operand, find the operand it is tied to.
1264/// Defs are tied to uses and vice versa. Returns the index of the tied operand
1265/// which must exist.
1266unsigned MachineInstr::findTiedOperandIdx(unsigned OpIdx) const {
1267 const MachineOperand &MO = getOperand(OpIdx);
1268 assert(MO.isTied() && "Operand isn't tied");
1269
1270 // Normally TiedTo is in range.
1271 if (MO.TiedTo < TiedMax)
1272 return MO.TiedTo - 1;
1273
1274 // Uses on normal instructions can be out of range.
1275 if (!isInlineAsm() && getOpcode() != TargetOpcode::STATEPOINT) {
1276 // Normal tied defs must be in the 0..TiedMax-1 range.
1277 if (MO.isUse())
1278 return TiedMax - 1;
1279 // MO is a def. Search for the tied use.
1280 for (unsigned i = TiedMax - 1, e = getNumOperands(); i != e; ++i) {
1281 const MachineOperand &UseMO = getOperand(i);
1282 if (UseMO.isReg() && UseMO.isUse() && UseMO.TiedTo == OpIdx + 1)
1283 return i;
1284 }
1285 llvm_unreachable("Can't find tied use");
1286 }
1287
1288 if (getOpcode() == TargetOpcode::STATEPOINT) {
1289 // In STATEPOINT defs correspond 1-1 to GC pointer operands passed
1290 // on registers.
1291 StatepointOpers SO(this);
1292 unsigned CurUseIdx = SO.getFirstGCPtrIdx();
1293 assert(CurUseIdx != -1U && "only gc pointer statepoint operands can be tied");
1294 unsigned NumDefs = getNumDefs();
1295 for (unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {
1296 while (!getOperand(CurUseIdx).isReg())
1297 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1298 if (OpIdx == CurDefIdx)
1299 return CurUseIdx;
1300 if (OpIdx == CurUseIdx)
1301 return CurDefIdx;
1302 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1303 }
1304 llvm_unreachable("Can't find tied use");
1305 }
1306
1307 // Now deal with inline asm by parsing the operand group descriptor flags.
1308 // Find the beginning of each operand group.
1309 SmallVector<unsigned, 8> GroupIdx;
1310 unsigned OpIdxGroup = ~0u;
1311 unsigned NumOps;
1312 for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;
1313 i += NumOps) {
1314 const MachineOperand &FlagMO = getOperand(i);
1315 assert(FlagMO.isImm() && "Invalid tied operand on inline asm");
1316 unsigned CurGroup = GroupIdx.size();
1317 GroupIdx.push_back(i);
1318 const InlineAsm::Flag F(FlagMO.getImm());
1319 NumOps = 1 + F.getNumOperandRegisters();
1320 // OpIdx belongs to this operand group.
1321 if (OpIdx > i && OpIdx < i + NumOps)
1322 OpIdxGroup = CurGroup;
1323 unsigned TiedGroup;
1324 if (!F.isUseOperandTiedToDef(TiedGroup))
1325 continue;
1326 // Operands in this group are tied to operands in TiedGroup which must be
1327 // earlier. Find the number of operands between the two groups.
1328 unsigned Delta = i - GroupIdx[TiedGroup];
1329
1330 // OpIdx is a use tied to TiedGroup.
1331 if (OpIdxGroup == CurGroup)
1332 return OpIdx - Delta;
1333
1334 // OpIdx is a def tied to this use group.
1335 if (OpIdxGroup == TiedGroup)
1336 return OpIdx + Delta;
1337 }
1338 llvm_unreachable("Invalid tied operand on inline asm");
1339}
1340
1341/// clearKillInfo - Clears kill flags on all operands.
1342///
1344 for (MachineOperand &MO : operands()) {
1345 if (MO.isReg() && MO.isUse())
1346 MO.setIsKill(false);
1347 }
1348}
1349
1351 unsigned SubIdx,
1352 const TargetRegisterInfo &RegInfo) {
1353 if (ToReg.isPhysical()) {
1354 if (SubIdx)
1355 ToReg = RegInfo.getSubReg(ToReg, SubIdx);
1356 for (MachineOperand &MO : operands()) {
1357 if (!MO.isReg() || MO.getReg() != FromReg)
1358 continue;
1359 MO.substPhysReg(ToReg, RegInfo);
1360 }
1361 } else {
1362 for (MachineOperand &MO : operands()) {
1363 if (!MO.isReg() || MO.getReg() != FromReg)
1364 continue;
1365 MO.substVirtReg(ToReg, SubIdx, RegInfo);
1366 }
1367 }
1368}
1369
1370/// isSafeToMove - Return true if it is safe to move this instruction. If
1371/// SawStore is set to true, it means that there is a store (or call) between
1372/// the instruction's location and its intended destination.
1373bool MachineInstr::isSafeToMove(bool &SawStore) const {
1374 // Ignore stuff that we obviously can't move.
1375 //
1376 // Treat volatile loads as stores. This is not strictly necessary for
1377 // volatiles, but it is required for atomic loads. It is not allowed to move
1378 // a load across an atomic load with Ordering > Monotonic.
1379 if (mayStore() || isCall() || isPHI() || hasOrderedMemoryRef()) {
1380 SawStore = true;
1381 return false;
1382 }
1383
1384 // Don't touch instructions that have non-trivial invariants. For example,
1385 // terminators have to be at the end of a basic block.
1386 if (isPosition() || isDebugInstr() || isTerminator() ||
1388 return false;
1389
1390 // Don't touch instructions which can have non-load/store effects.
1391 //
1392 // Inline asm has a "sideeffect" marker to indicate whether the asm has
1393 // intentional side-effects. Even if an inline asm is not "sideeffect",
1394 // though, it still can't be speculatively executed: the operation might
1395 // not be valid on the current target, or for some combinations of operands.
1396 // (Some transforms that move an instruction don't speculatively execute it;
1397 // we currently don't try to handle that distinction here.)
1398 //
1399 // Other instructions handled here include those that can raise FP
1400 // exceptions, x86 "DIV" instructions which trap on divide by zero, and
1401 // stack adjustments.
1403 isInlineAsm())
1404 return false;
1405
1406 // See if this instruction does a load. If so, we have to guarantee that the
1407 // loaded value doesn't change between the load and the its intended
1408 // destination. The check for isInvariantLoad gives the target the chance to
1409 // classify the load as always returning a constant, e.g. a constant pool
1410 // load.
1412 // Otherwise, this is a real load. If there is a store between the load and
1413 // end of block, we can't move it.
1414 return !SawStore;
1415
1416 return true;
1417}
1418
1420 // Don't delete frame allocation labels.
1421 // FIXME: Why is LOCAL_ESCAPE not considered in MachineInstr::isLabel?
1422 if (getOpcode() == TargetOpcode::LOCAL_ESCAPE)
1423 return false;
1424
1425 // Don't delete FAKE_USE.
1426 // FIXME: Why is FAKE_USE not considered in MachineInstr::isPosition?
1427 if (isFakeUse())
1428 return false;
1429
1430 // If we can move an instruction, we can remove it. Otherwise, it has
1431 // a side-effect of some sort.
1432 bool SawStore = false;
1433 return isPHI() || isSafeToMove(SawStore);
1434}
1435
1437 LiveRegUnits *LivePhysRegs) const {
1438 // Instructions without side-effects are dead iff they only define dead regs.
1439 // This function is hot and this loop returns early in the common case,
1440 // so only perform additional checks before this if absolutely necessary.
1441 for (const MachineOperand &MO : all_defs()) {
1442 Register Reg = MO.getReg();
1443 if (Reg.isPhysical()) {
1444 // Don't delete live physreg defs, or any reserved register defs.
1445 if (!LivePhysRegs || !LivePhysRegs->available(Reg) || MRI.isReserved(Reg))
1446 return false;
1447 } else {
1448 if (MO.isDead())
1449 continue;
1450 for (const MachineInstr &Use : MRI.use_nodbg_instructions(Reg)) {
1451 if (&Use != this)
1452 // This def has a non-debug use. Don't delete the instruction!
1453 return false;
1454 }
1455 }
1456 }
1457
1458 // Technically speaking inline asm without side effects and no defs can still
1459 // be deleted. But there is so much bad inline asm code out there, we should
1460 // let them be.
1461 if (isInlineAsm())
1462 return false;
1463
1464 // FIXME: See issue #105950 for why LIFETIME markers are considered dead here.
1465 if (isLifetimeMarker())
1466 return true;
1467
1468 // If there are no defs with uses, then we call the instruction dead so long
1469 // as we do not suspect it may have sideeffects.
1470 return wouldBeTriviallyDead();
1471}
1472
1474 BatchAAResults *AA, bool UseTBAA,
1475 const MachineMemOperand *MMOa,
1476 const MachineMemOperand *MMOb) {
1477 // The following interface to AA is fashioned after DAGCombiner::isAlias and
1478 // operates with MachineMemOperand offset with some important assumptions:
1479 // - LLVM fundamentally assumes flat address spaces.
1480 // - MachineOperand offset can *only* result from legalization and cannot
1481 // affect queries other than the trivial case of overlap checking.
1482 // - These offsets never wrap and never step outside of allocated objects.
1483 // - There should never be any negative offsets here.
1484 //
1485 // FIXME: Modify API to hide this math from "user"
1486 // Even before we go to AA we can reason locally about some memory objects. It
1487 // can save compile time, and possibly catch some corner cases not currently
1488 // covered.
1489
1490 int64_t OffsetA = MMOa->getOffset();
1491 int64_t OffsetB = MMOb->getOffset();
1492 int64_t MinOffset = std::min(OffsetA, OffsetB);
1493
1494 LocationSize WidthA = MMOa->getSize();
1495 LocationSize WidthB = MMOb->getSize();
1496 bool KnownWidthA = WidthA.hasValue();
1497 bool KnownWidthB = WidthB.hasValue();
1498 bool BothMMONonScalable = !WidthA.isScalable() && !WidthB.isScalable();
1499
1500 const Value *ValA = MMOa->getValue();
1501 const Value *ValB = MMOb->getValue();
1502 bool SameVal = (ValA && ValB && (ValA == ValB));
1503 if (!SameVal) {
1504 const PseudoSourceValue *PSVa = MMOa->getPseudoValue();
1505 const PseudoSourceValue *PSVb = MMOb->getPseudoValue();
1506 if (PSVa && ValB && !PSVa->mayAlias(&MFI))
1507 return false;
1508 if (PSVb && ValA && !PSVb->mayAlias(&MFI))
1509 return false;
1510 if (PSVa && PSVb && (PSVa == PSVb))
1511 SameVal = true;
1512 }
1513
1514 if (SameVal && BothMMONonScalable) {
1515 if (!KnownWidthA || !KnownWidthB)
1516 return true;
1517 int64_t MaxOffset = std::max(OffsetA, OffsetB);
1518 int64_t LowWidth = (MinOffset == OffsetA)
1519 ? WidthA.getValue().getKnownMinValue()
1520 : WidthB.getValue().getKnownMinValue();
1521 return (MinOffset + LowWidth > MaxOffset);
1522 }
1523
1524 if (!AA)
1525 return true;
1526
1527 if (!ValA || !ValB)
1528 return true;
1529
1530 assert((OffsetA >= 0) && "Negative MachineMemOperand offset");
1531 assert((OffsetB >= 0) && "Negative MachineMemOperand offset");
1532
1533 // If Scalable Location Size has non-zero offset, Width + Offset does not work
1534 // at the moment
1535 if ((WidthA.isScalable() && OffsetA > 0) ||
1536 (WidthB.isScalable() && OffsetB > 0))
1537 return true;
1538
1539 int64_t OverlapA =
1540 KnownWidthA ? WidthA.getValue().getKnownMinValue() + OffsetA - MinOffset
1542 int64_t OverlapB =
1543 KnownWidthB ? WidthB.getValue().getKnownMinValue() + OffsetB - MinOffset
1545
1546 LocationSize LocA = (WidthA.isScalable() || !KnownWidthA)
1547 ? WidthA
1548 : LocationSize::precise(OverlapA);
1549 LocationSize LocB = (WidthB.isScalable() || !KnownWidthB)
1550 ? WidthB
1551 : LocationSize::precise(OverlapB);
1552
1553 return !AA->isNoAlias(
1554 MemoryLocation(ValA, LocA, UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
1555 MemoryLocation(ValB, LocB, UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
1556}
1557
1559 bool UseTBAA) const {
1560 const MachineFunction *MF = getMF();
1562 const MachineFrameInfo &MFI = MF->getFrameInfo();
1563
1564 // Exclude call instruction which may alter the memory but can not be handled
1565 // by this function.
1566 if (isCall() || Other.isCall())
1567 return true;
1568
1569 // If neither instruction stores to memory, they can't alias in any
1570 // meaningful way, even if they read from the same address.
1571 if (!mayStore() && !Other.mayStore())
1572 return false;
1573
1574 // Both instructions must be memory operations to be able to alias.
1575 if (!mayLoadOrStore() || !Other.mayLoadOrStore())
1576 return false;
1577
1578 // Let the target decide if memory accesses cannot possibly overlap.
1579 if (TII->areMemAccessesTriviallyDisjoint(*this, Other))
1580 return false;
1581
1582 // Memory operations without memory operands may access anything. Be
1583 // conservative and assume `MayAlias`.
1584 if (memoperands_empty() || Other.memoperands_empty())
1585 return true;
1586
1587 // Skip if there are too many memory operands.
1588 auto NumChecks = getNumMemOperands() * Other.getNumMemOperands();
1589 if (NumChecks > TII->getMemOperandAACheckLimit())
1590 return true;
1591
1592 // Check each pair of memory operands from both instructions, which can't
1593 // alias only if all pairs won't alias.
1594 for (auto *MMOa : memoperands()) {
1595 for (auto *MMOb : Other.memoperands()) {
1596 if (!MMOa->isStore() && !MMOb->isStore())
1597 continue;
1598 if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb))
1599 return true;
1600 }
1601 }
1602
1603 return false;
1604}
1605
1606bool MachineInstr::mayAlias(AAResults *AA, const MachineInstr &Other,
1607 bool UseTBAA) const {
1608 if (AA) {
1609 BatchAAResults BAA(*AA);
1610 return mayAlias(&BAA, Other, UseTBAA);
1611 }
1612 return mayAlias(static_cast<BatchAAResults *>(nullptr), Other, UseTBAA);
1613}
1614
1615/// hasOrderedMemoryRef - Return true if this instruction may have an ordered
1616/// or volatile memory reference, or if the information describing the memory
1617/// reference is not available. Return false if it is known to have no ordered
1618/// memory references.
1620 // An instruction known never to access memory won't have a volatile access.
1621 if (!mayStore() &&
1622 !mayLoad() &&
1623 !isCall() &&
1625 return false;
1626
1627 // Otherwise, if the instruction has no memory reference information,
1628 // conservatively assume it wasn't preserved.
1629 if (memoperands_empty())
1630 return true;
1631
1632 // Check if any of our memory operands are ordered.
1633 return llvm::any_of(memoperands(), [](const MachineMemOperand *MMO) {
1634 return !MMO->isUnordered();
1635 });
1636}
1637
1638/// isDereferenceableInvariantLoad - Return true if this instruction will never
1639/// trap and is loading from a location whose value is invariant across a run of
1640/// this function.
1642 // If the instruction doesn't load at all, it isn't an invariant load.
1643 if (!mayLoad())
1644 return false;
1645
1646 // If the instruction has lost its memoperands, conservatively assume that
1647 // it may not be an invariant load.
1648 if (memoperands_empty())
1649 return false;
1650
1651 const MachineFrameInfo &MFI = getParent()->getParent()->getFrameInfo();
1652
1653 for (MachineMemOperand *MMO : memoperands()) {
1654 if (!MMO->isUnordered())
1655 // If the memory operand has ordering side effects, we can't move the
1656 // instruction. Such an instruction is technically an invariant load,
1657 // but the caller code would need updated to expect that.
1658 return false;
1659 if (MMO->isStore()) return false;
1660 if (MMO->isInvariant() && MMO->isDereferenceable())
1661 continue;
1662
1663 // A load from a constant PseudoSourceValue is invariant.
1664 if (const PseudoSourceValue *PSV = MMO->getPseudoValue()) {
1665 if (PSV->isConstant(&MFI))
1666 continue;
1667 }
1668
1669 // Otherwise assume conservatively.
1670 return false;
1671 }
1672
1673 // Everything checks out.
1674 return true;
1675}
1676
1678 if (!isPHI())
1679 return {};
1680 assert(getNumOperands() >= 3 &&
1681 "It's illegal to have a PHI without source operands");
1682
1683 Register Reg = getOperand(1).getReg();
1684 for (unsigned i = 3, e = getNumOperands(); i < e; i += 2)
1685 if (getOperand(i).getReg() != Reg)
1686 return {};
1687 return Reg;
1688}
1689
1692 return true;
1693 if (isInlineAsm()) {
1694 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1695 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1696 return true;
1697 }
1698
1699 return false;
1700}
1701
1703 return mayStore() || isCall() ||
1705}
1706
1707/// allDefsAreDead - Return true if all the defs of this instruction are dead.
1708///
1710 for (const MachineOperand &MO : operands()) {
1711 if (!MO.isReg() || MO.isUse())
1712 continue;
1713 if (!MO.isDead())
1714 return false;
1715 }
1716 return true;
1717}
1718
1720 for (const MachineOperand &MO : implicit_operands()) {
1721 if (!MO.isReg() || MO.isUse())
1722 continue;
1723 if (!MO.isDead())
1724 return false;
1725 }
1726 return true;
1727}
1728
1729/// copyImplicitOps - Copy implicit register operands from specified
1730/// instruction to this instruction.
1732 const MachineInstr &MI) {
1733 for (const MachineOperand &MO :
1734 llvm::drop_begin(MI.operands(), MI.getDesc().getNumOperands()))
1735 if ((MO.isReg() && MO.isImplicit()) || MO.isRegMask())
1736 addOperand(MF, MO);
1737}
1738
1740 const MCInstrDesc &MCID = getDesc();
1741 if (MCID.Opcode == TargetOpcode::STATEPOINT)
1742 return true;
1743 for (unsigned I = 0, E = getNumOperands(); I < E; ++I) {
1744 const auto &Operand = getOperand(I);
1745 if (!Operand.isReg() || Operand.isDef())
1746 // Ignore the defined registers as MCID marks only the uses as tied.
1747 continue;
1748 int ExpectedTiedIdx = MCID.getOperandConstraint(I, MCOI::TIED_TO);
1749 int TiedIdx = Operand.isTied() ? int(findTiedOperandIdx(I)) : -1;
1750 if (ExpectedTiedIdx != TiedIdx)
1751 return true;
1752 }
1753 return false;
1754}
1755
1757 const MachineRegisterInfo &MRI) const {
1758 const MachineOperand &Op = getOperand(OpIdx);
1759 if (!Op.isReg())
1760 return LLT{};
1761
1762 if (isVariadic() || OpIdx >= getNumExplicitOperands())
1763 return MRI.getType(Op.getReg());
1764
1765 auto &OpInfo = getDesc().operands()[OpIdx];
1766 if (!OpInfo.isGenericType())
1767 return MRI.getType(Op.getReg());
1768
1769 if (PrintedTypes[OpInfo.getGenericTypeIndex()])
1770 return LLT{};
1771
1772 LLT TypeToPrint = MRI.getType(Op.getReg());
1773 // Don't mark the type index printed if it wasn't actually printed: maybe
1774 // another operand with the same type index has an actual type attached:
1775 if (TypeToPrint.isValid())
1776 PrintedTypes.set(OpInfo.getGenericTypeIndex());
1777 return TypeToPrint;
1778}
1779
1780#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1782 dbgs() << " ";
1783 print(dbgs());
1784}
1785
1786LLVM_DUMP_METHOD void MachineInstr::dumprImpl(
1787 const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
1788 SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const {
1789 if (Depth >= MaxDepth)
1790 return;
1791 if (!AlreadySeenInstrs.insert(this).second)
1792 return;
1793 // PadToColumn always inserts at least one space.
1794 // Don't mess up the alignment if we don't want any space.
1795 if (Depth)
1796 fdbgs().PadToColumn(Depth * 2);
1797 print(fdbgs());
1798 for (const MachineOperand &MO : operands()) {
1799 if (!MO.isReg() || MO.isDef())
1800 continue;
1801 Register Reg = MO.getReg();
1802 if (Reg.isPhysical())
1803 continue;
1804 const MachineInstr *NewMI = MRI.getUniqueVRegDef(Reg);
1805 if (NewMI == nullptr)
1806 continue;
1807 NewMI->dumprImpl(MRI, Depth + 1, MaxDepth, AlreadySeenInstrs);
1808 }
1809}
1810
1812 unsigned MaxDepth) const {
1813 SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;
1814 dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
1815}
1816#endif
1817
1818void MachineInstr::print(raw_ostream &OS, bool IsStandalone, bool SkipOpers,
1819 bool SkipDebugLoc, bool AddNewLine,
1820 const TargetInstrInfo *TII) const {
1821 const Module *M = nullptr;
1822 const Function *F = nullptr;
1823 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
1824 F = &MF->getFunction();
1825 M = F->getParent();
1826 if (!TII)
1827 TII = MF->getSubtarget().getInstrInfo();
1828 }
1829
1830 ModuleSlotTracker MST(M);
1831 if (F)
1832 MST.incorporateFunction(*F);
1833 print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine, TII);
1834}
1835
1837 bool IsStandalone, bool SkipOpers, bool SkipDebugLoc,
1838 bool AddNewLine, const TargetInstrInfo *TII) const {
1839 // We can be a bit tidier if we know the MachineFunction.
1840 const TargetRegisterInfo *TRI = nullptr;
1841 const MachineRegisterInfo *MRI = nullptr;
1842 tryToGetTargetInfo(*this, TRI, MRI, TII);
1843
1844 if (isCFIInstruction())
1845 assert(getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
1846
1847 SmallBitVector PrintedTypes(8);
1848 bool ShouldPrintRegisterTies = IsStandalone || hasComplexRegisterTies();
1849 auto GetTiedOperandIdx = [&](unsigned OpIdx) {
1850 if (!ShouldPrintRegisterTies)
1851 return 0U;
1852 const MachineOperand &MO = getOperand(OpIdx);
1853 if (MO.isReg() && MO.isTied() && !MO.isDef())
1854 return findTiedOperandIdx(OpIdx);
1855 return 0U;
1856 };
1857 unsigned StartOp = 0;
1858 unsigned e = getNumOperands();
1859
1860 // Print explicitly defined operands on the left of an assignment syntax.
1861 while (StartOp < e) {
1862 const MachineOperand &MO = getOperand(StartOp);
1863 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
1864 break;
1865
1866 if (StartOp != 0)
1867 OS << ", ";
1868
1869 LLT TypeToPrint = MRI ? getTypeToPrint(StartOp, PrintedTypes, *MRI) : LLT{};
1870 // tied operands are not printed for defs.
1871 MO.print(OS, MST, TypeToPrint, StartOp, /*PrintDef=*/false, IsStandalone,
1872 /*ShouldPrintRegisterTies=*/false, /*TiedOperandIdx=*/0, TRI);
1873 ++StartOp;
1874 }
1875
1876 if (StartOp != 0)
1877 OS << " = ";
1878
1880 OS << "frame-setup ";
1882 OS << "frame-destroy ";
1884 OS << "nnan ";
1886 OS << "ninf ";
1888 OS << "nsz ";
1890 OS << "arcp ";
1892 OS << "contract ";
1894 OS << "afn ";
1896 OS << "reassoc ";
1898 OS << "nuw ";
1900 OS << "nsw ";
1902 OS << "exact ";
1904 OS << "nofpexcept ";
1906 OS << "nomerge ";
1908 OS << "noconvergent ";
1910 OS << "nneg ";
1912 OS << "disjoint ";
1914 OS << "nusw ";
1916 OS << "samesign ";
1918 OS << "inbounds ";
1920 OS << "lr-split ";
1922 OS << "nonnull ";
1923
1924 // Print the opcode name.
1925 if (TII)
1926 OS << TII->getName(getOpcode());
1927 else
1928 OS << "UNKNOWN";
1929
1930 if (SkipOpers)
1931 return;
1932
1933 // Print the rest of the operands.
1934 bool FirstOp = true;
1935 unsigned AsmDescOp = ~0u;
1936 unsigned AsmOpCount = 0;
1937
1939 // Print asm string.
1940 OS << " ";
1941 const unsigned OpIdx = InlineAsm::MIOp_AsmString;
1942 LLT TypeToPrint = MRI ? getTypeToPrint(OpIdx, PrintedTypes, *MRI) : LLT{};
1943 unsigned TiedOperandIdx = GetTiedOperandIdx(OpIdx);
1944 getOperand(OpIdx).print(OS, MST, TypeToPrint, OpIdx, /*PrintDef=*/true,
1945 IsStandalone, ShouldPrintRegisterTies,
1946 TiedOperandIdx, TRI);
1947
1948 // Print HasSideEffects, MayLoad, MayStore, IsAlignStack
1949 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1950 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1951 OS << " [sideeffect]";
1952 if (ExtraInfo & InlineAsm::Extra_MayLoad)
1953 OS << " [mayload]";
1954 if (ExtraInfo & InlineAsm::Extra_MayStore)
1955 OS << " [maystore]";
1956 if (ExtraInfo & InlineAsm::Extra_IsConvergent)
1957 OS << " [isconvergent]";
1958 if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
1959 OS << " [alignstack]";
1960 if (ExtraInfo & InlineAsm::Extra_MayUnwind)
1961 OS << " [unwind]";
1963 OS << " [attdialect]";
1965 OS << " [inteldialect]";
1966
1967 StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;
1968 FirstOp = false;
1969 }
1970
1971 for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
1972 const MachineOperand &MO = getOperand(i);
1973
1974 if (FirstOp) FirstOp = false; else OS << ",";
1975 OS << " ";
1976
1977 if (isDebugValueLike() && MO.isMetadata()) {
1978 // Pretty print DBG_VALUE* instructions.
1979 auto *DIV = dyn_cast<DILocalVariable>(MO.getMetadata());
1980 if (DIV && !DIV->getName().empty())
1981 OS << "!\"" << DIV->getName() << '\"';
1982 else {
1983 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1984 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
1985 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1986 ShouldPrintRegisterTies, TiedOperandIdx, TRI);
1987 }
1988 } else if (isDebugLabel() && MO.isMetadata()) {
1989 // Pretty print DBG_LABEL instructions.
1990 auto *DIL = dyn_cast<DILabel>(MO.getMetadata());
1991 if (DIL && !DIL->getName().empty())
1992 OS << "\"" << DIL->getName() << '\"';
1993 else {
1994 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1995 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
1996 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1997 ShouldPrintRegisterTies, TiedOperandIdx, TRI);
1998 }
1999 } else if (i == AsmDescOp && MO.isImm()) {
2000 // Pretty print the inline asm operand descriptor.
2001 OS << '$' << AsmOpCount++;
2002 unsigned Flag = MO.getImm();
2003 const InlineAsm::Flag F(Flag);
2004 OS << ":[";
2005 OS << F.getKindName();
2006
2007 unsigned RCID;
2008 if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {
2009 if (TRI) {
2010 OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));
2011 } else
2012 OS << ":RC" << RCID;
2013 }
2014
2015 if (F.isMemKind()) {
2016 const InlineAsm::ConstraintCode MCID = F.getMemoryConstraintID();
2017 OS << ":" << InlineAsm::getMemConstraintName(MCID);
2018 }
2019
2020 unsigned TiedTo;
2021 if (F.isUseOperandTiedToDef(TiedTo))
2022 OS << " tiedto:$" << TiedTo;
2023
2024 if ((F.isRegDefKind() || F.isRegDefEarlyClobberKind() ||
2025 F.isRegUseKind()) &&
2026 F.getRegMayBeFolded()) {
2027 OS << " foldable";
2028 }
2029
2030 OS << ']';
2031
2032 // Compute the index of the next operand descriptor.
2033 AsmDescOp += 1 + F.getNumOperandRegisters();
2034 } else if (MO.isImm() && isOperandSubregIdx(i)) {
2036 } else {
2037 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
2038 unsigned TiedOperandIdx = GetTiedOperandIdx(i);
2039 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
2040 ShouldPrintRegisterTies, TiedOperandIdx, TRI);
2041 }
2042 }
2043
2044 // Print any optional symbols attached to this instruction as-if they were
2045 // operands.
2046 if (MCSymbol *PreInstrSymbol = getPreInstrSymbol()) {
2047 if (!FirstOp) {
2048 OS << ',';
2049 }
2050 OS << " pre-instr-symbol ";
2051 MachineOperand::printSymbol(OS, *PreInstrSymbol);
2052 }
2053 if (MCSymbol *PostInstrSymbol = getPostInstrSymbol()) {
2054 if (!FirstOp) {
2055 OS << ',';
2056 }
2057 OS << " post-instr-symbol ";
2058 MachineOperand::printSymbol(OS, *PostInstrSymbol);
2059 }
2060 if (MDNode *HeapAllocMarker = getHeapAllocMarker()) {
2061 if (!FirstOp) {
2062 OS << ',';
2063 }
2064 OS << " heap-alloc-marker ";
2065 HeapAllocMarker->printAsOperand(OS, MST);
2066 }
2067 if (MDNode *PCSections = getPCSections()) {
2068 if (!FirstOp) {
2069 OS << ',';
2070 }
2071 OS << " pcsections ";
2072 PCSections->printAsOperand(OS, MST);
2073 }
2074 if (MDNode *MMRA = getMMRAMetadata()) {
2075 if (!FirstOp) {
2076 OS << ',';
2077 }
2078 OS << " mmra ";
2079 MMRA->printAsOperand(OS, MST);
2080 }
2081 if (uint32_t CFIType = getCFIType()) {
2082 if (!FirstOp)
2083 OS << ',';
2084 OS << " cfi-type " << CFIType;
2085 }
2087 OS << ", deactivation-symbol " << getDeactivationSymbol()->getName();
2088
2089 if (DebugInstrNum) {
2090 if (!FirstOp)
2091 OS << ",";
2092 OS << " debug-instr-number " << DebugInstrNum;
2093 }
2094
2095 if (!SkipDebugLoc) {
2096 if (const DebugLoc &DL = getDebugLoc()) {
2097 if (!FirstOp)
2098 OS << ',';
2099 OS << " debug-location ";
2100 DL->printAsOperand(OS, MST);
2101 }
2102 }
2103
2104 if (!memoperands_empty()) {
2106 const LLVMContext *Context = nullptr;
2107 std::unique_ptr<LLVMContext> CtxPtr;
2108 const MachineFrameInfo *MFI = nullptr;
2109 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
2110 MFI = &MF->getFrameInfo();
2111 Context = &MF->getFunction().getContext();
2112 } else {
2113 CtxPtr = std::make_unique<LLVMContext>();
2114 Context = CtxPtr.get();
2115 }
2116
2117 OS << " :: ";
2118 bool NeedComma = false;
2119 for (const MachineMemOperand *Op : memoperands()) {
2120 if (NeedComma)
2121 OS << ", ";
2122 Op->print(OS, MST, SSNs, *Context, MFI, TII);
2123 NeedComma = true;
2124 }
2125 }
2126
2127 if (SkipDebugLoc)
2128 return;
2129
2130 bool HaveSemi = false;
2131
2132 // Print debug location information.
2133 if (const DebugLoc &DL = getDebugLoc()) {
2134 if (!HaveSemi) {
2135 OS << ';';
2136 HaveSemi = true;
2137 }
2138 OS << ' ';
2139 DL.print(OS);
2140 }
2141
2142 // Print extra comments for DEBUG_VALUE and friends if they are well-formed.
2143 if ((isNonListDebugValue() && getNumOperands() >= 4) ||
2144 (isDebugValueList() && getNumOperands() >= 2) ||
2145 (isDebugRef() && getNumOperands() >= 3)) {
2146 if (getDebugVariableOp().isMetadata()) {
2147 if (!HaveSemi) {
2148 OS << ";";
2149 HaveSemi = true;
2150 }
2151 auto *DV = getDebugVariable();
2152 OS << " line no:" << DV->getLine();
2154 OS << " indirect";
2155 }
2156 }
2157 // TODO: DBG_LABEL
2158
2159 if (PrintMIAddrs)
2160 OS << " ; " << this;
2161
2162 if (AddNewLine)
2163 OS << '\n';
2164}
2165
2167 const TargetRegisterInfo *RegInfo,
2168 bool AddIfNotFound) {
2169 bool isPhysReg = IncomingReg.isPhysical();
2170 bool hasAliases = isPhysReg &&
2171 MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();
2172 bool Found = false;
2174 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2175 MachineOperand &MO = getOperand(i);
2176 if (!MO.isReg() || !MO.isUse() || MO.isUndef())
2177 continue;
2178
2179 // DEBUG_VALUE nodes do not contribute to code generation and should
2180 // always be ignored. Failure to do so may result in trying to modify
2181 // KILL flags on DEBUG_VALUE nodes.
2182 if (MO.isDebug())
2183 continue;
2184
2185 Register Reg = MO.getReg();
2186 if (!Reg)
2187 continue;
2188
2189 if (Reg == IncomingReg) {
2190 if (!Found) {
2191 if (MO.isKill())
2192 // The register is already marked kill.
2193 return true;
2194 if (isPhysReg && isRegTiedToDefOperand(i))
2195 // Two-address uses of physregs must not be marked kill.
2196 return true;
2197 MO.setIsKill();
2198 Found = true;
2199 }
2200 } else if (hasAliases && MO.isKill() && Reg.isPhysical()) {
2201 // A super-register kill already exists.
2202 if (RegInfo->isSuperRegister(IncomingReg, Reg))
2203 return true;
2204 if (RegInfo->isSubRegister(IncomingReg, Reg))
2205 DeadOps.push_back(i);
2206 }
2207 }
2208
2209 // Trim unneeded kill operands.
2210 while (!DeadOps.empty()) {
2211 unsigned OpIdx = DeadOps.back();
2212 if (getOperand(OpIdx).isImplicit() &&
2213 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2214 removeOperand(OpIdx);
2215 else
2216 getOperand(OpIdx).setIsKill(false);
2217 DeadOps.pop_back();
2218 }
2219
2220 // If not found, this means an alias of one of the operands is killed. Add a
2221 // new implicit operand if required.
2222 if (!Found && AddIfNotFound) {
2224 false /*IsDef*/,
2225 true /*IsImp*/,
2226 true /*IsKill*/));
2227 return true;
2228 }
2229 return Found;
2230}
2231
2233 const TargetRegisterInfo *RegInfo) {
2234 if (!Reg.isPhysical())
2235 RegInfo = nullptr;
2236 for (MachineOperand &MO : operands()) {
2237 if (!MO.isReg() || !MO.isUse() || !MO.isKill())
2238 continue;
2239 Register OpReg = MO.getReg();
2240 if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)
2241 MO.setIsKill(false);
2242 }
2243}
2244
2246 const TargetRegisterInfo *RegInfo,
2247 bool AddIfNotFound) {
2248 bool isPhysReg = Reg.isPhysical();
2249 bool hasAliases = isPhysReg &&
2250 MCRegAliasIterator(Reg, RegInfo, false).isValid();
2251 bool Found = false;
2253 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2254 MachineOperand &MO = getOperand(i);
2255 if (!MO.isReg() || !MO.isDef())
2256 continue;
2257 Register MOReg = MO.getReg();
2258 if (!MOReg)
2259 continue;
2260
2261 if (MOReg == Reg) {
2262 MO.setIsDead();
2263 Found = true;
2264 } else if (hasAliases && MO.isDead() && MOReg.isPhysical()) {
2265 // There exists a super-register that's marked dead.
2266 if (RegInfo->isSuperRegister(Reg, MOReg))
2267 return true;
2268 if (RegInfo->isSubRegister(Reg, MOReg))
2269 DeadOps.push_back(i);
2270 }
2271 }
2272
2273 // Trim unneeded dead operands.
2274 while (!DeadOps.empty()) {
2275 unsigned OpIdx = DeadOps.back();
2276 if (getOperand(OpIdx).isImplicit() &&
2277 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2278 removeOperand(OpIdx);
2279 else
2280 getOperand(OpIdx).setIsDead(false);
2281 DeadOps.pop_back();
2282 }
2283
2284 // If not found, this means an alias of one of the operands is dead. Add a
2285 // new implicit operand if required.
2286 if (Found || !AddIfNotFound)
2287 return Found;
2288
2290 true /*IsDef*/,
2291 true /*IsImp*/,
2292 false /*IsKill*/,
2293 true /*IsDead*/));
2294 return true;
2295}
2296
2298 for (MachineOperand &MO : all_defs())
2299 if (MO.getReg() == Reg)
2300 MO.setIsDead(false);
2301}
2302
2304 for (MachineOperand &MO : all_defs())
2305 if (MO.getReg() == Reg && MO.getSubReg() != 0)
2306 MO.setIsUndef(IsUndef);
2307}
2308
2310 const TargetRegisterInfo *RegInfo) {
2311 if (Reg.isPhysical()) {
2312 MachineOperand *MO = findRegisterDefOperand(Reg, RegInfo, false, false);
2313 if (MO)
2314 return;
2315 } else {
2316 for (const MachineOperand &MO : all_defs()) {
2317 if (MO.getReg() == Reg && MO.getSubReg() == 0)
2318 return;
2319 }
2320 }
2322 true /*IsDef*/,
2323 true /*IsImp*/));
2324}
2325
2327 const TargetRegisterInfo &TRI) {
2328 bool HasRegMask = false;
2329 for (MachineOperand &MO : operands()) {
2330 if (MO.isRegMask()) {
2331 HasRegMask = true;
2332 continue;
2333 }
2334 if (!MO.isReg() || !MO.isDef()) continue;
2335 Register Reg = MO.getReg();
2336 if (!Reg.isPhysical())
2337 continue;
2338 // If there are no uses, including partial uses, the def is dead.
2339 if (llvm::none_of(UsedRegs,
2340 [&](MCRegister Use) { return TRI.regsOverlap(Use, Reg); }))
2341 MO.setIsDead();
2342 }
2343
2344 // This is a call with a register mask operand.
2345 // Mask clobbers are always dead, so add defs for the non-dead defines.
2346 if (HasRegMask)
2347 for (const Register &UsedReg : UsedRegs)
2348 addRegisterDefined(UsedReg, &TRI);
2349}
2350
2351unsigned
2353 // Build up a buffer of hash code components.
2354 SmallVector<size_t, 16> HashComponents;
2355 HashComponents.reserve(MI->getNumOperands() + 1);
2356 HashComponents.push_back(MI->getOpcode());
2357 for (const MachineOperand &MO : MI->operands()) {
2358 if (MO.isReg() && MO.isDef() && MO.getReg().isVirtual())
2359 continue; // Skip virtual register defs.
2360
2361 HashComponents.push_back(hash_value(MO));
2362 }
2363 return hash_combine_range(HashComponents);
2364}
2365
2367 // Find the source location cookie.
2368 const MDNode *LocMD = nullptr;
2369 for (unsigned i = getNumOperands(); i != 0; --i) {
2370 if (getOperand(i-1).isMetadata() &&
2371 (LocMD = getOperand(i-1).getMetadata()) &&
2372 LocMD->getNumOperands() != 0) {
2374 return LocMD;
2375 }
2376 }
2377
2378 return nullptr;
2379}
2380
2383 const MDNode *LocMD = getLocCookieMD();
2384 uint64_t LocCookie =
2385 LocMD
2386 ? mdconst::extract<ConstantInt>(LocMD->getOperand(0))->getZExtValue()
2387 : 0;
2389 Ctx.diagnose(DiagnosticInfoInlineAsm(LocCookie, Msg));
2390}
2391
2393 const Function &Fn = getMF()->getFunction();
2394 Fn.getContext().diagnose(
2396}
2397
2399 const MCInstrDesc &MCID, bool IsIndirect,
2400 Register Reg, const MDNode *Variable,
2401 const MDNode *Expr) {
2402 assert(isa<DILocalVariable>(Variable) && "not a variable");
2403 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2404 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2405 "Expected inlined-at fields to agree");
2406 auto MIB = BuildMI(MF, DL, MCID).addReg(Reg);
2407 if (IsIndirect)
2408 MIB.addImm(0U);
2409 else
2410 MIB.addReg(0U);
2411 return MIB.addMetadata(Variable).addMetadata(Expr);
2412}
2413
2415 const MCInstrDesc &MCID, bool IsIndirect,
2416 ArrayRef<MachineOperand> DebugOps,
2417 const MDNode *Variable, const MDNode *Expr) {
2418 assert(isa<DILocalVariable>(Variable) && "not a variable");
2419 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2420 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2421 "Expected inlined-at fields to agree");
2422 if (MCID.Opcode == TargetOpcode::DBG_VALUE) {
2423 assert(DebugOps.size() == 1 &&
2424 "DBG_VALUE must contain exactly one debug operand");
2425 MachineOperand DebugOp = DebugOps[0];
2426 if (DebugOp.isReg())
2427 return BuildMI(MF, DL, MCID, IsIndirect, DebugOp.getReg(), Variable,
2428 Expr);
2429
2430 auto MIB = BuildMI(MF, DL, MCID).add(DebugOp);
2431 if (IsIndirect)
2432 MIB.addImm(0U);
2433 else
2434 MIB.addReg(0U);
2435 return MIB.addMetadata(Variable).addMetadata(Expr);
2436 }
2437
2438 auto MIB = BuildMI(MF, DL, MCID);
2439 MIB.addMetadata(Variable).addMetadata(Expr);
2440 for (const MachineOperand &DebugOp : DebugOps)
2441 if (DebugOp.isReg())
2442 MIB.addReg(DebugOp.getReg());
2443 else
2444 MIB.add(DebugOp);
2445 return MIB;
2446}
2447
2450 const DebugLoc &DL, const MCInstrDesc &MCID,
2451 bool IsIndirect, Register Reg,
2452 const MDNode *Variable, const MDNode *Expr) {
2453 MachineFunction &MF = *BB.getParent();
2454 MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Variable, Expr);
2455 BB.insert(I, MI);
2456 return MachineInstrBuilder(MF, MI);
2457}
2458
2461 const DebugLoc &DL, const MCInstrDesc &MCID,
2462 bool IsIndirect,
2463 ArrayRef<MachineOperand> DebugOps,
2464 const MDNode *Variable, const MDNode *Expr) {
2465 MachineFunction &MF = *BB.getParent();
2466 MachineInstr *MI =
2467 BuildMI(MF, DL, MCID, IsIndirect, DebugOps, Variable, Expr);
2468 BB.insert(I, MI);
2469 return MachineInstrBuilder(MF, *MI);
2470}
2471
2472/// Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
2473/// This prepends DW_OP_deref when spilling an indirect DBG_VALUE.
2475 const MachineInstr &MI,
2476 const SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2477 assert(MI.getDebugVariable()->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
2478 "Expected inlined-at fields to agree");
2479
2480 const DIExpression *Expr = MI.getDebugExpression();
2481 if (MI.isIndirectDebugValue()) {
2482 assert(MI.getDebugOffset().getImm() == 0 &&
2483 "DBG_VALUE with nonzero offset");
2485 } else if (MI.isDebugValueList()) {
2486 // We will replace the spilled register with a frame index, so
2487 // immediately deref all references to the spilled register.
2488 std::array<uint64_t, 1> Ops{{dwarf::DW_OP_deref}};
2489 for (const MachineOperand *Op : SpilledOperands) {
2490 unsigned OpIdx = MI.getDebugOperandIndex(Op);
2491 Expr = DIExpression::appendOpsToArg(Expr, Ops, OpIdx);
2492 }
2493 }
2494 return Expr;
2495}
2497 Register SpillReg) {
2498 assert(MI.hasDebugOperandForReg(SpillReg) && "Spill Reg is not used in MI.");
2500 llvm::make_pointer_range(MI.getDebugOperandsForReg(SpillReg)));
2501 return computeExprForSpill(MI, SpillOperands);
2502}
2503
2506 const MachineInstr &Orig,
2507 int FrameIndex, Register SpillReg) {
2508 assert(!Orig.isDebugRef() &&
2509 "DBG_INSTR_REF should not reference a virtual register.");
2510 const DIExpression *Expr = computeExprForSpill(Orig, SpillReg);
2511 MachineInstrBuilder NewMI =
2512 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2513 // Non-Variadic Operands: Location, Offset, Variable, Expression
2514 // Variadic Operands: Variable, Expression, Locations...
2515 if (Orig.isNonListDebugValue())
2516 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2517 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2518 if (Orig.isDebugValueList()) {
2519 for (const MachineOperand &Op : Orig.debug_operands())
2520 if (Op.isReg() && Op.getReg() == SpillReg)
2521 NewMI.addFrameIndex(FrameIndex);
2522 else
2523 NewMI.add(MachineOperand(Op));
2524 }
2525 return NewMI;
2526}
2529 const MachineInstr &Orig, int FrameIndex,
2530 const SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2531 const DIExpression *Expr = computeExprForSpill(Orig, SpilledOperands);
2532 MachineInstrBuilder NewMI =
2533 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2534 // Non-Variadic Operands: Location, Offset, Variable, Expression
2535 // Variadic Operands: Variable, Expression, Locations...
2536 if (Orig.isNonListDebugValue())
2537 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2538 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2539 if (Orig.isDebugValueList()) {
2540 for (const MachineOperand &Op : Orig.debug_operands())
2541 if (is_contained(SpilledOperands, &Op))
2542 NewMI.addFrameIndex(FrameIndex);
2543 else
2544 NewMI.add(MachineOperand(Op));
2545 }
2546 return NewMI;
2547}
2548
2550 Register Reg) {
2551 const DIExpression *Expr = computeExprForSpill(Orig, Reg);
2552 if (Orig.isNonListDebugValue())
2554 for (MachineOperand &Op : Orig.getDebugOperandsForReg(Reg))
2555 Op.ChangeToFrameIndex(FrameIndex);
2556 Orig.getDebugExpressionOp().setMetadata(Expr);
2557}
2558
2561 MachineInstr &MI = *this;
2562 if (!MI.getOperand(0).isReg())
2563 return;
2564
2566 for (MachineBasicBlock::iterator DE = MI.getParent()->end();
2567 DI != DE; ++DI) {
2568 if (!DI->isDebugValue())
2569 return;
2570 if (DI->hasDebugOperandForReg(MI.getOperand(0).getReg()))
2571 DbgValues.push_back(&*DI);
2572 }
2573}
2574
2576 // Collect matching debug values.
2578
2579 if (!getOperand(0).isReg())
2580 return;
2581
2582 Register DefReg = getOperand(0).getReg();
2583 auto *MRI = getRegInfo();
2584 for (MachineInstr &DI : MRI->use_instructions(DefReg)) {
2585 if (!DI.isDebugValue())
2586 continue;
2587 if (DI.hasDebugOperandForReg(DefReg)) {
2588 DbgValues.push_back(&DI);
2589 }
2590 }
2591
2592 // Propagate Reg to debug value instructions.
2593 for (auto *DBI : DbgValues)
2594 for (MachineOperand &Op : DBI->getDebugOperandsForReg(DefReg))
2595 Op.setReg(Reg);
2596}
2597
2599
2601 const MachineFrameInfo &MFI) {
2602 std::optional<TypeSize> Size;
2603 for (const auto *A : Accesses) {
2604 if (MFI.isSpillSlotObjectIndex(
2605 cast<FixedStackPseudoSourceValue>(A->getPseudoValue())
2606 ->getFrameIndex())) {
2607 LocationSize S = A->getSize();
2608 if (!S.hasValue())
2610 if (!Size)
2611 Size = S.getValue();
2612 else
2613 Size = *Size + S.getValue();
2614 }
2615 }
2616 if (!Size)
2617 return LocationSize::precise(0);
2618 return LocationSize::precise(*Size);
2619}
2620
2621std::optional<LocationSize>
2623 int FI;
2624 if (TII->isStoreToStackSlotPostFE(*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>
2634 if (!mayStore())
2635 return std::nullopt;
2636
2638 if (TII->hasStoreToStackSlot(*this, Accesses))
2639 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2640 return std::nullopt;
2641}
2642
2643std::optional<LocationSize>
2645 int FI;
2646 if (TII->isLoadFromStackSlotPostFE(*this, FI)) {
2647 const MachineFrameInfo &MFI = getMF()->getFrameInfo();
2648 if (MFI.isSpillSlotObjectIndex(FI))
2649 return (*memoperands_begin())->getSize();
2650 }
2651 return std::nullopt;
2652}
2653
2654std::optional<LocationSize>
2657 if (TII->hasLoadFromStackSlot(*this, Accesses))
2658 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2659 return std::nullopt;
2660}
2661
2663 if (DebugInstrNum == 0)
2664 DebugInstrNum = getParent()->getParent()->getNewDebugInstrNum();
2665 return DebugInstrNum;
2666}
2667
2669 if (DebugInstrNum == 0)
2670 DebugInstrNum = MF.getNewDebugInstrNum();
2671 return DebugInstrNum;
2672}
2673
2674std::tuple<LLT, LLT> MachineInstr::getFirst2LLTs() const {
2675 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2676 getRegInfo()->getType(getOperand(1).getReg()));
2677}
2678
2679std::tuple<LLT, LLT, LLT> MachineInstr::getFirst3LLTs() const {
2680 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2681 getRegInfo()->getType(getOperand(1).getReg()),
2682 getRegInfo()->getType(getOperand(2).getReg()));
2683}
2684
2685std::tuple<LLT, LLT, LLT, LLT> MachineInstr::getFirst4LLTs() const {
2686 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2687 getRegInfo()->getType(getOperand(1).getReg()),
2688 getRegInfo()->getType(getOperand(2).getReg()),
2689 getRegInfo()->getType(getOperand(3).getReg()));
2690}
2691
2692std::tuple<LLT, LLT, LLT, LLT, LLT> MachineInstr::getFirst5LLTs() const {
2693 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2694 getRegInfo()->getType(getOperand(1).getReg()),
2695 getRegInfo()->getType(getOperand(2).getReg()),
2696 getRegInfo()->getType(getOperand(3).getReg()),
2697 getRegInfo()->getType(getOperand(4).getReg()));
2698}
2699
2700std::tuple<Register, LLT, Register, LLT>
2702 Register Reg0 = getOperand(0).getReg();
2703 Register Reg1 = getOperand(1).getReg();
2704 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2705 getRegInfo()->getType(Reg1));
2706}
2707
2708std::tuple<Register, LLT, Register, LLT, Register, LLT>
2710 Register Reg0 = getOperand(0).getReg();
2711 Register Reg1 = getOperand(1).getReg();
2712 Register Reg2 = getOperand(2).getReg();
2713 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2714 getRegInfo()->getType(Reg1), Reg2,
2715 getRegInfo()->getType(Reg2));
2716}
2717
2718std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>
2720 Register Reg0 = getOperand(0).getReg();
2721 Register Reg1 = getOperand(1).getReg();
2722 Register Reg2 = getOperand(2).getReg();
2723 Register Reg3 = getOperand(3).getReg();
2724 return std::tuple(
2725 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2726 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3));
2727}
2728
2730 LLT>
2732 Register Reg0 = getOperand(0).getReg();
2733 Register Reg1 = getOperand(1).getReg();
2734 Register Reg2 = getOperand(2).getReg();
2735 Register Reg3 = getOperand(3).getReg();
2736 Register Reg4 = getOperand(4).getReg();
2737 return std::tuple(
2738 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2739 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3),
2740 Reg4, getRegInfo()->getType(Reg4));
2741}
2742
2745 assert(InsertBefore != nullptr && "invalid iterator");
2746 assert(InsertBefore->getParent() == this &&
2747 "iterator points to operand of other inst");
2748 if (Ops.empty())
2749 return;
2750
2751 // Do one pass to untie operands.
2753 for (const MachineOperand &MO : operands()) {
2754 if (MO.isReg() && MO.isTied()) {
2755 unsigned OpNo = getOperandNo(&MO);
2756 unsigned TiedTo = findTiedOperandIdx(OpNo);
2757 TiedOpIndices[OpNo] = TiedTo;
2758 untieRegOperand(OpNo);
2759 }
2760 }
2761
2762 unsigned OpIdx = getOperandNo(InsertBefore);
2763 SmallVector<MachineOperand> MovingOps(InsertBefore, operands_end());
2764
2765 for (unsigned I = getNumOperands(); I > OpIdx; --I)
2766 removeOperand(I - 1);
2767 for (const MachineOperand &MO : Ops)
2768 addOperand(MO);
2769 for (const MachineOperand &OpMoved : MovingOps)
2770 addOperand(OpMoved);
2771
2772 // Re-tie operands.
2773 for (auto [Tie1, Tie2] : TiedOpIndices) {
2774 if (Tie1 >= OpIdx)
2775 Tie1 += Ops.size();
2776 if (Tie2 >= OpIdx)
2777 Tie2 += Ops.size();
2778 tieOperands(Tie1, Tie2);
2779 }
2780}
2781
2782bool MachineInstr::mayFoldInlineAsmRegOp(unsigned OpId) const {
2783 assert(OpId && "expected non-zero operand id");
2784 assert(isInlineAsm() && "should only be used on inline asm");
2785
2786 if (!getOperand(OpId).isReg())
2787 return false;
2788
2789 const MachineOperand &MD = getOperand(OpId - 1);
2790 if (!MD.isImm())
2791 return false;
2792
2793 InlineAsm::Flag F(MD.getImm());
2794 if (F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind())
2795 return F.getRegMayBeFolded();
2796 return false;
2797}
2798
2800 assert(isPHI());
2801
2802 // Phi might have multiple entries for MBB. Need to remove them all.
2803 unsigned RemovedCount = 0;
2804 for (unsigned N = getNumOperands(); N > 2; N -= 2) {
2805 if (getOperand(N - 1).getMBB() == &MBB) {
2806 removeOperand(N - 1);
2807 removeOperand(N - 2);
2808 RemovedCount += 2;
2809 }
2810 }
2811 return RemovedCount;
2812}
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:678
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.
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)
if(PassOpts->AAPipeline)
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
SI Fold Operands
const char * Msg
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:126
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:356
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:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1443
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.
mop_iterator operands_end()
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
filtered_mop_range all_uses()
Returns an iterator range over all operands that are (explicit or implicit) register uses.
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 bool hasTiedAndOtherReadOf(Register Reg, unsigned SubReg) const
Return true if two operands read (Reg, SubReg) and one is tied to a def of another register.
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_instr_iterator > use_instructions(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 LLVM_READONLY 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...
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:319
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:662
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
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:316
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:1762
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:1769
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
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:552
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:1933
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:1963
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:539
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h:287
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
static LLVM_ABI unsigned getHashValue(const MachineInstr *const &MI)