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