LLVM 20.0.0git
MachineInstr.cpp
Go to the documentation of this file.
1//===- lib/CodeGen/MachineInstr.cpp ---------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Methods common to all machine instructions.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/Hashing.h"
16#include "llvm/ADT/STLExtras.h"
37#include "llvm/IR/Constants.h"
39#include "llvm/IR/DebugLoc.h"
40#include "llvm/IR/Function.h"
41#include "llvm/IR/InlineAsm.h"
43#include "llvm/IR/LLVMContext.h"
44#include "llvm/IR/Metadata.h"
45#include "llvm/IR/Module.h"
47#include "llvm/IR/Operator.h"
48#include "llvm/MC/MCInstrDesc.h"
52#include "llvm/Support/Debug.h"
57#include <algorithm>
58#include <cassert>
59#include <cstdint>
60#include <cstring>
61#include <utility>
62
63using namespace llvm;
64
66 if (const MachineBasicBlock *MBB = MI.getParent())
67 if (const MachineFunction *MF = MBB->getParent())
68 return MF;
69 return nullptr;
70}
71
72// Try to crawl up to the machine function and get TRI and IntrinsicInfo from
73// it.
75 const TargetRegisterInfo *&TRI,
77 const TargetIntrinsicInfo *&IntrinsicInfo,
78 const TargetInstrInfo *&TII) {
79
80 if (const MachineFunction *MF = getMFIfAvailable(MI)) {
81 TRI = MF->getSubtarget().getRegisterInfo();
82 MRI = &MF->getRegInfo();
83 IntrinsicInfo = MF->getTarget().getIntrinsicInfo();
84 TII = MF->getSubtarget().getInstrInfo();
85 }
86}
87
89 for (MCPhysReg ImpDef : MCID->implicit_defs())
90 addOperand(MF, MachineOperand::CreateReg(ImpDef, true, true));
91 for (MCPhysReg ImpUse : MCID->implicit_uses())
92 addOperand(MF, MachineOperand::CreateReg(ImpUse, false, true));
93}
94
95/// MachineInstr ctor - This constructor creates a MachineInstr and adds the
96/// implicit operands. It reserves space for the number of operands specified by
97/// the MCInstrDesc.
98MachineInstr::MachineInstr(MachineFunction &MF, const MCInstrDesc &TID,
99 DebugLoc DL, bool NoImp)
100 : MCID(&TID), NumOperands(0), Flags(0), AsmPrinterFlags(0),
101 DbgLoc(std::move(DL)), DebugInstrNum(0), Opcode(TID.Opcode) {
102 assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");
103
104 // Reserve space for the expected number of operands.
105 if (unsigned NumOps = MCID->getNumOperands() + MCID->implicit_defs().size() +
106 MCID->implicit_uses().size()) {
107 CapOperands = OperandCapacity::get(NumOps);
108 Operands = MF.allocateOperandArray(CapOperands);
109 }
110
111 if (!NoImp)
113}
114
115/// MachineInstr ctor - Copies MachineInstr arg exactly.
116/// Does not copy the number from debug instruction numbering, to preserve
117/// uniqueness.
118MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)
119 : MCID(&MI.getDesc()), NumOperands(0), Flags(0), AsmPrinterFlags(0),
120 Info(MI.Info), DbgLoc(MI.getDebugLoc()), DebugInstrNum(0),
121 Opcode(MI.getOpcode()) {
122 assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");
123
124 CapOperands = OperandCapacity::get(MI.getNumOperands());
125 Operands = MF.allocateOperandArray(CapOperands);
126
127 // Copy operands.
128 for (const MachineOperand &MO : MI.operands())
129 addOperand(MF, MO);
130
131 // Replicate ties between the operands, which addOperand was not
132 // able to do reliably.
133 for (unsigned i = 0, e = getNumOperands(); i < e; ++i) {
134 MachineOperand &NewMO = getOperand(i);
135 const MachineOperand &OrigMO = MI.getOperand(i);
136 NewMO.TiedTo = OrigMO.TiedTo;
137 }
138
139 // Copy all the sensible flags.
140 setFlags(MI.Flags);
141}
142
144 if (getParent())
145 getMF()->handleChangeDesc(*this, TID);
146 MCID = &TID;
147 Opcode = TID.Opcode;
148}
149
151 MovePos->getParent()->splice(MovePos, getParent(), getIterator());
152}
153
154/// getRegInfo - If this instruction is embedded into a MachineFunction,
155/// return the MachineRegisterInfo object for the current function, otherwise
156/// return null.
157MachineRegisterInfo *MachineInstr::getRegInfo() {
159 return &MBB->getParent()->getRegInfo();
160 return nullptr;
161}
162
163const MachineRegisterInfo *MachineInstr::getRegInfo() const {
164 if (const MachineBasicBlock *MBB = getParent())
165 return &MBB->getParent()->getRegInfo();
166 return nullptr;
167}
168
169void MachineInstr::removeRegOperandsFromUseLists(MachineRegisterInfo &MRI) {
170 for (MachineOperand &MO : operands())
171 if (MO.isReg())
172 MRI.removeRegOperandFromUseList(&MO);
173}
174
175void MachineInstr::addRegOperandsToUseLists(MachineRegisterInfo &MRI) {
176 for (MachineOperand &MO : operands())
177 if (MO.isReg())
178 MRI.addRegOperandToUseList(&MO);
179}
180
183 assert(MBB && "Use MachineInstrBuilder to add operands to dangling instrs");
185 assert(MF && "Use MachineInstrBuilder to add operands to dangling instrs");
186 addOperand(*MF, Op);
187}
188
189/// Move NumOps MachineOperands from Src to Dst, with support for overlapping
190/// ranges. If MRI is non-null also update use-def chains.
192 unsigned NumOps, MachineRegisterInfo *MRI) {
193 if (MRI)
194 return MRI->moveOperands(Dst, Src, NumOps);
195 // MachineOperand is a trivially copyable type so we can just use memmove.
196 assert(Dst && Src && "Unknown operands");
197 std::memmove(Dst, Src, NumOps * sizeof(MachineOperand));
198}
199
200/// addOperand - Add the specified operand to the instruction. If it is an
201/// implicit operand, it is added to the end of the operand list. If it is
202/// an explicit operand it is added at the end of the explicit operand list
203/// (before the first implicit operand).
205 assert(isUInt<LLVM_MI_NUMOPERANDS_BITS>(NumOperands + 1) &&
206 "Cannot add more operands.");
207 assert(MCID && "Cannot add operands before providing an instr descriptor");
208
209 // Check if we're adding one of our existing operands.
210 if (&Op >= Operands && &Op < Operands + NumOperands) {
211 // This is unusual: MI->addOperand(MI->getOperand(i)).
212 // If adding Op requires reallocating or moving existing operands around,
213 // the Op reference could go stale. Support it by copying Op.
214 MachineOperand CopyOp(Op);
215 return addOperand(MF, CopyOp);
216 }
217
218 // Find the insert location for the new operand. Implicit registers go at
219 // the end, everything else goes before the implicit regs.
220 //
221 // FIXME: Allow mixed explicit and implicit operands on inline asm.
222 // InstrEmitter::EmitSpecialNode() is marking inline asm clobbers as
223 // implicit-defs, but they must not be moved around. See the FIXME in
224 // InstrEmitter.cpp.
225 unsigned OpNo = getNumOperands();
226 bool isImpReg = Op.isReg() && Op.isImplicit();
227 if (!isImpReg && !isInlineAsm()) {
228 while (OpNo && Operands[OpNo-1].isReg() && Operands[OpNo-1].isImplicit()) {
229 --OpNo;
230 assert(!Operands[OpNo].isTied() && "Cannot move tied operands");
231 }
232 }
233
234 // OpNo now points as the desired insertion point. Unless this is a variadic
235 // instruction, only implicit regs are allowed beyond MCID->getNumOperands().
236 // RegMask operands go between the explicit and implicit operands.
237 MachineRegisterInfo *MRI = getRegInfo();
238
239 // Determine if the Operands array needs to be reallocated.
240 // Save the old capacity and operand array.
241 OperandCapacity OldCap = CapOperands;
242 MachineOperand *OldOperands = Operands;
243 if (!OldOperands || OldCap.getSize() == getNumOperands()) {
244 CapOperands = OldOperands ? OldCap.getNext() : OldCap.get(1);
245 Operands = MF.allocateOperandArray(CapOperands);
246 // Move the operands before the insertion point.
247 if (OpNo)
248 moveOperands(Operands, OldOperands, OpNo, MRI);
249 }
250
251 // Move the operands following the insertion point.
252 if (OpNo != NumOperands)
253 moveOperands(Operands + OpNo + 1, OldOperands + OpNo, NumOperands - OpNo,
254 MRI);
255 ++NumOperands;
256
257 // Deallocate the old operand array.
258 if (OldOperands != Operands && OldOperands)
259 MF.deallocateOperandArray(OldCap, OldOperands);
260
261 // Copy Op into place. It still needs to be inserted into the MRI use lists.
262 MachineOperand *NewMO = new (Operands + OpNo) MachineOperand(Op);
263 NewMO->ParentMI = this;
264
265 // When adding a register operand, tell MRI about it.
266 if (NewMO->isReg()) {
267 // Ensure isOnRegUseList() returns false, regardless of Op's status.
268 NewMO->Contents.Reg.Prev = nullptr;
269 // Ignore existing ties. This is not a property that can be copied.
270 NewMO->TiedTo = 0;
271 // Add the new operand to MRI, but only for instructions in an MBB.
272 if (MRI)
273 MRI->addRegOperandToUseList(NewMO);
274 // The MCID operand information isn't accurate until we start adding
275 // explicit operands. The implicit operands are added first, then the
276 // explicits are inserted before them.
277 if (!isImpReg) {
278 // Tie uses to defs as indicated in MCInstrDesc.
279 if (NewMO->isUse()) {
280 int DefIdx = MCID->getOperandConstraint(OpNo, MCOI::TIED_TO);
281 if (DefIdx != -1)
282 tieOperands(DefIdx, OpNo);
283 }
284 // If the register operand is flagged as early, mark the operand as such.
285 if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)
286 NewMO->setIsEarlyClobber(true);
287 }
288 // Ensure debug instructions set debug flag on register uses.
289 if (NewMO->isUse() && isDebugInstr())
290 NewMO->setIsDebug();
291 }
292}
293
294void MachineInstr::removeOperand(unsigned OpNo) {
295 assert(OpNo < getNumOperands() && "Invalid operand number");
296 untieRegOperand(OpNo);
297
298#ifndef NDEBUG
299 // Moving tied operands would break the ties.
300 for (unsigned i = OpNo + 1, e = getNumOperands(); i != e; ++i)
301 if (Operands[i].isReg())
302 assert(!Operands[i].isTied() && "Cannot move tied operands");
303#endif
304
305 MachineRegisterInfo *MRI = getRegInfo();
306 if (MRI && Operands[OpNo].isReg())
307 MRI->removeRegOperandFromUseList(Operands + OpNo);
308
309 // Don't call the MachineOperand destructor. A lot of this code depends on
310 // MachineOperand having a trivial destructor anyway, and adding a call here
311 // wouldn't make it 'destructor-correct'.
312
313 if (unsigned N = NumOperands - 1 - OpNo)
314 moveOperands(Operands + OpNo, Operands + OpNo + 1, N, MRI);
315 --NumOperands;
316}
317
318void MachineInstr::setExtraInfo(MachineFunction &MF,
320 MCSymbol *PreInstrSymbol,
321 MCSymbol *PostInstrSymbol,
322 MDNode *HeapAllocMarker, MDNode *PCSections,
323 uint32_t CFIType, MDNode *MMRAs) {
324 bool HasPreInstrSymbol = PreInstrSymbol != nullptr;
325 bool HasPostInstrSymbol = PostInstrSymbol != nullptr;
326 bool HasHeapAllocMarker = HeapAllocMarker != nullptr;
327 bool HasPCSections = PCSections != nullptr;
328 bool HasCFIType = CFIType != 0;
329 bool HasMMRAs = MMRAs != nullptr;
330 int NumPointers = MMOs.size() + HasPreInstrSymbol + HasPostInstrSymbol +
331 HasHeapAllocMarker + HasPCSections + HasCFIType + HasMMRAs;
332
333 // Drop all extra info if there is none.
334 if (NumPointers <= 0) {
335 Info.clear();
336 return;
337 }
338
339 // If more than one pointer, then store out of line. Store heap alloc markers
340 // out of line because PointerSumType cannot hold more than 4 tag types with
341 // 32-bit pointers.
342 // FIXME: Maybe we should make the symbols in the extra info mutable?
343 else if (NumPointers > 1 || HasMMRAs || HasHeapAllocMarker || HasPCSections ||
344 HasCFIType) {
345 Info.set<EIIK_OutOfLine>(
346 MF.createMIExtraInfo(MMOs, PreInstrSymbol, PostInstrSymbol,
347 HeapAllocMarker, PCSections, CFIType, MMRAs));
348 return;
349 }
350
351 // Otherwise store the single pointer inline.
352 if (HasPreInstrSymbol)
353 Info.set<EIIK_PreInstrSymbol>(PreInstrSymbol);
354 else if (HasPostInstrSymbol)
355 Info.set<EIIK_PostInstrSymbol>(PostInstrSymbol);
356 else
357 Info.set<EIIK_MMO>(MMOs[0]);
358}
359
361 if (memoperands_empty())
362 return;
363
364 setExtraInfo(MF, {}, getPreInstrSymbol(), getPostInstrSymbol(),
367}
368
371 if (MMOs.empty()) {
372 dropMemRefs(MF);
373 return;
374 }
375
376 setExtraInfo(MF, MMOs, getPreInstrSymbol(), getPostInstrSymbol(),
379}
380
382 MachineMemOperand *MO) {
385 MMOs.push_back(MO);
386 setMemRefs(MF, MMOs);
387}
388
390 if (this == &MI)
391 // Nothing to do for a self-clone!
392 return;
393
394 assert(&MF == MI.getMF() &&
395 "Invalid machine functions when cloning memory refrences!");
396 // See if we can just steal the extra info already allocated for the
397 // instruction. We can do this whenever the pre- and post-instruction symbols
398 // are the same (including null).
399 if (getPreInstrSymbol() == MI.getPreInstrSymbol() &&
400 getPostInstrSymbol() == MI.getPostInstrSymbol() &&
401 getHeapAllocMarker() == MI.getHeapAllocMarker() &&
402 getPCSections() == MI.getPCSections() && getMMRAMetadata() &&
403 MI.getMMRAMetadata()) {
404 Info = MI.Info;
405 return;
406 }
407
408 // Otherwise, fall back on a copy-based clone.
409 setMemRefs(MF, MI.memoperands());
410}
411
412/// Check to see if the MMOs pointed to by the two MemRefs arrays are
413/// identical.
416 if (LHS.size() != RHS.size())
417 return false;
418
419 auto LHSPointees = make_pointee_range(LHS);
420 auto RHSPointees = make_pointee_range(RHS);
421 return std::equal(LHSPointees.begin(), LHSPointees.end(),
422 RHSPointees.begin());
423}
424
427 // Try handling easy numbers of MIs with simpler mechanisms.
428 if (MIs.empty()) {
429 dropMemRefs(MF);
430 return;
431 }
432 if (MIs.size() == 1) {
433 cloneMemRefs(MF, *MIs[0]);
434 return;
435 }
436 // Because an empty memoperands list provides *no* information and must be
437 // handled conservatively (assuming the instruction can do anything), the only
438 // way to merge with it is to drop all other memoperands.
439 if (MIs[0]->memoperands_empty()) {
440 dropMemRefs(MF);
441 return;
442 }
443
444 // Handle the general case.
446 // Start with the first instruction.
447 assert(&MF == MIs[0]->getMF() &&
448 "Invalid machine functions when cloning memory references!");
449 MergedMMOs.append(MIs[0]->memoperands_begin(), MIs[0]->memoperands_end());
450 // Now walk all the other instructions and accumulate any different MMOs.
451 for (const MachineInstr &MI : make_pointee_range(MIs.slice(1))) {
452 assert(&MF == MI.getMF() &&
453 "Invalid machine functions when cloning memory references!");
454
455 // Skip MIs with identical operands to the first. This is a somewhat
456 // arbitrary hack but will catch common cases without being quadratic.
457 // TODO: We could fully implement merge semantics here if needed.
458 if (hasIdenticalMMOs(MIs[0]->memoperands(), MI.memoperands()))
459 continue;
460
461 // Because an empty memoperands list provides *no* information and must be
462 // handled conservatively (assuming the instruction can do anything), the
463 // only way to merge with it is to drop all other memoperands.
464 if (MI.memoperands_empty()) {
465 dropMemRefs(MF);
466 return;
467 }
468
469 // Otherwise accumulate these into our temporary buffer of the merged state.
470 MergedMMOs.append(MI.memoperands_begin(), MI.memoperands_end());
471 }
472
473 setMemRefs(MF, MergedMMOs);
474}
475
477 // Do nothing if old and new symbols are the same.
478 if (Symbol == getPreInstrSymbol())
479 return;
480
481 // If there was only one symbol and we're removing it, just clear info.
482 if (!Symbol && Info.is<EIIK_PreInstrSymbol>()) {
483 Info.clear();
484 return;
485 }
486
487 setExtraInfo(MF, memoperands(), Symbol, getPostInstrSymbol(),
490}
491
493 // Do nothing if old and new symbols are the same.
494 if (Symbol == getPostInstrSymbol())
495 return;
496
497 // If there was only one symbol and we're removing it, just clear info.
498 if (!Symbol && Info.is<EIIK_PostInstrSymbol>()) {
499 Info.clear();
500 return;
501 }
502
503 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), Symbol,
506}
507
509 // Do nothing if old and new symbols are the same.
510 if (Marker == getHeapAllocMarker())
511 return;
512
513 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
515}
516
518 // Do nothing if old and new symbols are the same.
519 if (PCSections == getPCSections())
520 return;
521
522 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
523 getHeapAllocMarker(), PCSections, getCFIType(),
525}
526
528 // Do nothing if old and new types are the same.
529 if (Type == getCFIType())
530 return;
531
532 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
534}
535
537 // Do nothing if old and new symbols are the same.
538 if (MMRAs == getMMRAMetadata())
539 return;
540
541 setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
543}
544
546 const MachineInstr &MI) {
547 if (this == &MI)
548 // Nothing to do for a self-clone!
549 return;
550
551 assert(&MF == MI.getMF() &&
552 "Invalid machine functions when cloning instruction symbols!");
553
554 setPreInstrSymbol(MF, MI.getPreInstrSymbol());
555 setPostInstrSymbol(MF, MI.getPostInstrSymbol());
556 setHeapAllocMarker(MF, MI.getHeapAllocMarker());
557 setPCSections(MF, MI.getPCSections());
558 setMMRAMetadata(MF, MI.getMMRAMetadata());
559}
560
562 // For now, the just return the union of the flags. If the flags get more
563 // complicated over time, we might need more logic here.
564 return getFlags() | Other.getFlags();
565}
566
568 uint32_t MIFlags = 0;
569 // Copy the wrapping flags.
570 if (const OverflowingBinaryOperator *OB =
571 dyn_cast<OverflowingBinaryOperator>(&I)) {
572 if (OB->hasNoSignedWrap())
574 if (OB->hasNoUnsignedWrap())
576 } else if (const TruncInst *TI = dyn_cast<TruncInst>(&I)) {
577 if (TI->hasNoSignedWrap())
579 if (TI->hasNoUnsignedWrap())
581 } else if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(&I)) {
582 if (GEP->hasNoUnsignedSignedWrap())
584 if (GEP->hasNoUnsignedWrap())
586 }
587
588 // Copy the nonneg flag.
589 if (const PossiblyNonNegInst *PNI = dyn_cast<PossiblyNonNegInst>(&I)) {
590 if (PNI->hasNonNeg())
592 // Copy the disjoint flag.
593 } else if (const PossiblyDisjointInst *PD =
594 dyn_cast<PossiblyDisjointInst>(&I)) {
595 if (PD->isDisjoint())
597 }
598
599 // Copy the exact flag.
600 if (const PossiblyExactOperator *PE = dyn_cast<PossiblyExactOperator>(&I))
601 if (PE->isExact())
603
604 // Copy the fast-math flags.
605 if (const FPMathOperator *FP = dyn_cast<FPMathOperator>(&I)) {
606 const FastMathFlags Flags = FP->getFastMathFlags();
607 if (Flags.noNaNs())
609 if (Flags.noInfs())
611 if (Flags.noSignedZeros())
613 if (Flags.allowReciprocal())
615 if (Flags.allowContract())
617 if (Flags.approxFunc())
619 if (Flags.allowReassoc())
621 }
622
623 if (I.getMetadata(LLVMContext::MD_unpredictable))
625
626 return MIFlags;
627}
628
631}
632
633bool MachineInstr::hasPropertyInBundle(uint64_t Mask, QueryType Type) const {
634 assert(!isBundledWithPred() && "Must be called on bundle header");
636 if (MII->getDesc().getFlags() & Mask) {
637 if (Type == AnyInBundle)
638 return true;
639 } else {
640 if (Type == AllInBundle && !MII->isBundle())
641 return false;
642 }
643 // This was the last instruction in the bundle.
644 if (!MII->isBundledWithSucc())
645 return Type == AllInBundle;
646 }
647}
648
650 MICheckType Check) const {
651 // If opcodes or number of operands are not the same then the two
652 // instructions are obviously not identical.
653 if (Other.getOpcode() != getOpcode() ||
654 Other.getNumOperands() != getNumOperands())
655 return false;
656
657 if (isBundle()) {
658 // We have passed the test above that both instructions have the same
659 // opcode, so we know that both instructions are bundles here. Let's compare
660 // MIs inside the bundle.
661 assert(Other.isBundle() && "Expected that both instructions are bundles.");
664 // Loop until we analysed the last intruction inside at least one of the
665 // bundles.
666 while (I1->isBundledWithSucc() && I2->isBundledWithSucc()) {
667 ++I1;
668 ++I2;
669 if (!I1->isIdenticalTo(*I2, Check))
670 return false;
671 }
672 // If we've reached the end of just one of the two bundles, but not both,
673 // the instructions are not identical.
674 if (I1->isBundledWithSucc() || I2->isBundledWithSucc())
675 return false;
676 }
677
678 // Check operands to make sure they match.
679 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
680 const MachineOperand &MO = getOperand(i);
681 const MachineOperand &OMO = Other.getOperand(i);
682 if (!MO.isReg()) {
683 if (!MO.isIdenticalTo(OMO))
684 return false;
685 continue;
686 }
687
688 // Clients may or may not want to ignore defs when testing for equality.
689 // For example, machine CSE pass only cares about finding common
690 // subexpressions, so it's safe to ignore virtual register defs.
691 if (MO.isDef()) {
692 if (Check == IgnoreDefs)
693 continue;
694 else if (Check == IgnoreVRegDefs) {
695 if (!MO.getReg().isVirtual() || !OMO.getReg().isVirtual())
696 if (!MO.isIdenticalTo(OMO))
697 return false;
698 } else {
699 if (!MO.isIdenticalTo(OMO))
700 return false;
701 if (Check == CheckKillDead && MO.isDead() != OMO.isDead())
702 return false;
703 }
704 } else {
705 if (!MO.isIdenticalTo(OMO))
706 return false;
707 if (Check == CheckKillDead && MO.isKill() != OMO.isKill())
708 return false;
709 }
710 }
711 // If DebugLoc does not match then two debug instructions are not identical.
712 if (isDebugInstr())
713 if (getDebugLoc() && Other.getDebugLoc() &&
714 getDebugLoc() != Other.getDebugLoc())
715 return false;
716 // If pre- or post-instruction symbols do not match then the two instructions
717 // are not identical.
718 if (getPreInstrSymbol() != Other.getPreInstrSymbol() ||
719 getPostInstrSymbol() != Other.getPostInstrSymbol())
720 return false;
721 // Call instructions with different CFI types are not identical.
722 if (isCall() && getCFIType() != Other.getCFIType())
723 return false;
724
725 return true;
726}
727
729 if (!isDebugValueLike() || !Other.isDebugValueLike())
730 return false;
731 if (getDebugLoc() != Other.getDebugLoc())
732 return false;
733 if (getDebugVariable() != Other.getDebugVariable())
734 return false;
735 if (getNumDebugOperands() != Other.getNumDebugOperands())
736 return false;
737 for (unsigned OpIdx = 0; OpIdx < getNumDebugOperands(); ++OpIdx)
738 if (!getDebugOperand(OpIdx).isIdenticalTo(Other.getDebugOperand(OpIdx)))
739 return false;
742 Other.getDebugExpression(), Other.isIndirectDebugValue()))
743 return false;
744 return true;
745}
746
748 return getParent()->getParent();
749}
750
752 assert(getParent() && "Not embedded in a basic block!");
753 return getParent()->remove(this);
754}
755
757 assert(getParent() && "Not embedded in a basic block!");
758 return getParent()->remove_instr(this);
759}
760
762 assert(getParent() && "Not embedded in a basic block!");
763 getParent()->erase(this);
764}
765
767 assert(getParent() && "Not embedded in a basic block!");
768 getParent()->erase_instr(this);
769}
770
772 if (!isCall(Type))
773 return false;
774 switch (getOpcode()) {
775 case TargetOpcode::PATCHPOINT:
776 case TargetOpcode::STACKMAP:
777 case TargetOpcode::STATEPOINT:
778 case TargetOpcode::FENTRY_CALL:
779 return false;
780 }
781 return true;
782}
783
785 if (isBundle())
788}
789
791 unsigned NumOperands = MCID->getNumOperands();
792 if (!MCID->isVariadic())
793 return NumOperands;
794
795 for (unsigned I = NumOperands, E = getNumOperands(); I != E; ++I) {
796 const MachineOperand &MO = getOperand(I);
797 // The operands must always be in the following order:
798 // - explicit reg defs,
799 // - other explicit operands (reg uses, immediates, etc.),
800 // - implicit reg defs
801 // - implicit reg uses
802 if (MO.isReg() && MO.isImplicit())
803 break;
804 ++NumOperands;
805 }
806 return NumOperands;
807}
808
810 unsigned NumDefs = MCID->getNumDefs();
811 if (!MCID->isVariadic())
812 return NumDefs;
813
814 for (unsigned I = NumDefs, E = getNumOperands(); I != E; ++I) {
815 const MachineOperand &MO = getOperand(I);
816 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
817 break;
818 ++NumDefs;
819 }
820 return NumDefs;
821}
822
824 assert(!isBundledWithPred() && "MI is already bundled with its predecessor");
827 --Pred;
828 assert(!Pred->isBundledWithSucc() && "Inconsistent bundle flags");
829 Pred->setFlag(BundledSucc);
830}
831
833 assert(!isBundledWithSucc() && "MI is already bundled with its successor");
836 ++Succ;
837 assert(!Succ->isBundledWithPred() && "Inconsistent bundle flags");
838 Succ->setFlag(BundledPred);
839}
840
842 assert(isBundledWithPred() && "MI isn't bundled with its predecessor");
845 --Pred;
846 assert(Pred->isBundledWithSucc() && "Inconsistent bundle flags");
847 Pred->clearFlag(BundledSucc);
848}
849
851 assert(isBundledWithSucc() && "MI isn't bundled with its successor");
854 ++Succ;
855 assert(Succ->isBundledWithPred() && "Inconsistent bundle flags");
856 Succ->clearFlag(BundledPred);
857}
858
860 if (isInlineAsm()) {
861 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
862 if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
863 return true;
864 }
865 return false;
866}
867
869 assert(isInlineAsm() && "getInlineAsmDialect() only works for inline asms!");
870 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
871 return InlineAsm::AsmDialect((ExtraInfo & InlineAsm::Extra_AsmDialect) != 0);
872}
873
875 unsigned *GroupNo) const {
876 assert(isInlineAsm() && "Expected an inline asm instruction");
877 assert(OpIdx < getNumOperands() && "OpIdx out of range");
878
879 // Ignore queries about the initial operands.
881 return -1;
882
883 unsigned Group = 0;
884 unsigned NumOps;
885 for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;
886 i += NumOps) {
887 const MachineOperand &FlagMO = getOperand(i);
888 // If we reach the implicit register operands, stop looking.
889 if (!FlagMO.isImm())
890 return -1;
891 const InlineAsm::Flag F(FlagMO.getImm());
892 NumOps = 1 + F.getNumOperandRegisters();
893 if (i + NumOps > OpIdx) {
894 if (GroupNo)
895 *GroupNo = Group;
896 return i;
897 }
898 ++Group;
899 }
900 return -1;
901}
902
904 assert(isDebugLabel() && "not a DBG_LABEL");
905 return cast<DILabel>(getOperand(0).getMetadata());
906}
907
909 assert((isDebugValueLike()) && "not a DBG_VALUE*");
910 unsigned VariableOp = isNonListDebugValue() ? 2 : 0;
911 return getOperand(VariableOp);
912}
913
915 assert((isDebugValueLike()) && "not a DBG_VALUE*");
916 unsigned VariableOp = isNonListDebugValue() ? 2 : 0;
917 return getOperand(VariableOp);
918}
919
921 return cast<DILocalVariable>(getDebugVariableOp().getMetadata());
922}
923
925 assert((isDebugValueLike()) && "not a DBG_VALUE*");
926 unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;
927 return getOperand(ExpressionOp);
928}
929
931 assert((isDebugValueLike()) && "not a DBG_VALUE*");
932 unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;
933 return getOperand(ExpressionOp);
934}
935
937 return cast<DIExpression>(getDebugExpressionOp().getMetadata());
938}
939
942}
943
946 const TargetInstrInfo *TII,
947 const TargetRegisterInfo *TRI) const {
948 assert(getParent() && "Can't have an MBB reference here!");
949 assert(getMF() && "Can't have an MF reference here!");
950 const MachineFunction &MF = *getMF();
951
952 // Most opcodes have fixed constraints in their MCInstrDesc.
953 if (!isInlineAsm())
954 return TII->getRegClass(getDesc(), OpIdx, TRI, MF);
955
956 if (!getOperand(OpIdx).isReg())
957 return nullptr;
958
959 // For tied uses on inline asm, get the constraint from the def.
960 unsigned DefIdx;
961 if (getOperand(OpIdx).isUse() && isRegTiedToDefOperand(OpIdx, &DefIdx))
962 OpIdx = DefIdx;
963
964 // Inline asm stores register class constraints in the flag word.
965 int FlagIdx = findInlineAsmFlagIdx(OpIdx);
966 if (FlagIdx < 0)
967 return nullptr;
968
969 const InlineAsm::Flag F(getOperand(FlagIdx).getImm());
970 unsigned RCID;
971 if ((F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind()) &&
972 F.hasRegClassConstraint(RCID))
973 return TRI->getRegClass(RCID);
974
975 // Assume that all registers in a memory operand are pointers.
976 if (F.isMemKind())
977 return TRI->getPointerRegClass(MF);
978
979 return nullptr;
980}
981
983 Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII,
984 const TargetRegisterInfo *TRI, bool ExploreBundle) const {
985 // Check every operands inside the bundle if we have
986 // been asked to.
987 if (ExploreBundle)
988 for (ConstMIBundleOperands OpndIt(*this); OpndIt.isValid() && CurRC;
989 ++OpndIt)
990 CurRC = OpndIt->getParent()->getRegClassConstraintEffectForVRegImpl(
991 OpndIt.getOperandNo(), Reg, CurRC, TII, TRI);
992 else
993 // Otherwise, just check the current operands.
994 for (unsigned i = 0, e = NumOperands; i < e && CurRC; ++i)
995 CurRC = getRegClassConstraintEffectForVRegImpl(i, Reg, CurRC, TII, TRI);
996 return CurRC;
997}
998
999const TargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVRegImpl(
1000 unsigned OpIdx, Register Reg, const TargetRegisterClass *CurRC,
1001 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {
1002 assert(CurRC && "Invalid initial register class");
1003 // Check if Reg is constrained by some of its use/def from MI.
1004 const MachineOperand &MO = getOperand(OpIdx);
1005 if (!MO.isReg() || MO.getReg() != Reg)
1006 return CurRC;
1007 // If yes, accumulate the constraints through the operand.
1008 return getRegClassConstraintEffect(OpIdx, CurRC, TII, TRI);
1009}
1010
1012 unsigned OpIdx, const TargetRegisterClass *CurRC,
1013 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {
1014 const TargetRegisterClass *OpRC = getRegClassConstraint(OpIdx, TII, TRI);
1015 const MachineOperand &MO = getOperand(OpIdx);
1016 assert(MO.isReg() &&
1017 "Cannot get register constraints for non-register operand");
1018 assert(CurRC && "Invalid initial register class");
1019 if (unsigned SubIdx = MO.getSubReg()) {
1020 if (OpRC)
1021 CurRC = TRI->getMatchingSuperRegClass(CurRC, OpRC, SubIdx);
1022 else
1023 CurRC = TRI->getSubClassWithSubReg(CurRC, SubIdx);
1024 } else if (OpRC)
1025 CurRC = TRI->getCommonSubClass(CurRC, OpRC);
1026 return CurRC;
1027}
1028
1029/// Return the number of instructions inside the MI bundle, not counting the
1030/// header instruction.
1033 unsigned Size = 0;
1034 while (I->isBundledWithSucc()) {
1035 ++Size;
1036 ++I;
1037 }
1038 return Size;
1039}
1040
1041/// Returns true if the MachineInstr has an implicit-use operand of exactly
1042/// the given register (not considering sub/super-registers).
1044 for (const MachineOperand &MO : operands()) {
1045 if (MO.isReg() && MO.isUse() && MO.isImplicit() && MO.getReg() == Reg)
1046 return true;
1047 }
1048 return false;
1049}
1050
1051/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of
1052/// the specific register or -1 if it is not found. It further tightens
1053/// the search criteria to a use that kills the register if isKill is true.
1055 const TargetRegisterInfo *TRI,
1056 bool isKill) const {
1057 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1058 const MachineOperand &MO = getOperand(i);
1059 if (!MO.isReg() || !MO.isUse())
1060 continue;
1061 Register MOReg = MO.getReg();
1062 if (!MOReg)
1063 continue;
1064 if (MOReg == Reg || (TRI && Reg && MOReg && TRI->regsOverlap(MOReg, Reg)))
1065 if (!isKill || MO.isKill())
1066 return i;
1067 }
1068 return -1;
1069}
1070
1071/// readsWritesVirtualRegister - Return a pair of bools (reads, writes)
1072/// indicating if this instruction reads or writes Reg. This also considers
1073/// partial defines.
1074std::pair<bool,bool>
1076 SmallVectorImpl<unsigned> *Ops) const {
1077 bool PartDef = false; // Partial redefine.
1078 bool FullDef = false; // Full define.
1079 bool Use = false;
1080
1081 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1082 const MachineOperand &MO = getOperand(i);
1083 if (!MO.isReg() || MO.getReg() != Reg)
1084 continue;
1085 if (Ops)
1086 Ops->push_back(i);
1087 if (MO.isUse())
1088 Use |= !MO.isUndef();
1089 else if (MO.getSubReg() && !MO.isUndef())
1090 // A partial def undef doesn't count as reading the register.
1091 PartDef = true;
1092 else
1093 FullDef = true;
1094 }
1095 // A partial redefine uses Reg unless there is also a full define.
1096 return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef);
1097}
1098
1099/// findRegisterDefOperandIdx() - Returns the operand index that is a def of
1100/// the specified register or -1 if it is not found. If isDead is true, defs
1101/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
1102/// also checks if there is a def of a super-register.
1104 const TargetRegisterInfo *TRI,
1105 bool isDead, bool Overlap) const {
1106 bool isPhys = Reg.isPhysical();
1107 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1108 const MachineOperand &MO = getOperand(i);
1109 // Accept regmask operands when Overlap is set.
1110 // Ignore them when looking for a specific def operand (Overlap == false).
1111 if (isPhys && Overlap && MO.isRegMask() && MO.clobbersPhysReg(Reg))
1112 return i;
1113 if (!MO.isReg() || !MO.isDef())
1114 continue;
1115 Register MOReg = MO.getReg();
1116 bool Found = (MOReg == Reg);
1117 if (!Found && TRI && isPhys && MOReg.isPhysical()) {
1118 if (Overlap)
1119 Found = TRI->regsOverlap(MOReg, Reg);
1120 else
1121 Found = TRI->isSubRegister(MOReg, Reg);
1122 }
1123 if (Found && (!isDead || MO.isDead()))
1124 return i;
1125 }
1126 return -1;
1127}
1128
1129/// findFirstPredOperandIdx() - Find the index of the first operand in the
1130/// operand list that is used to represent the predicate. It returns -1 if
1131/// none is found.
1133 // Don't call MCID.findFirstPredOperandIdx() because this variant
1134 // is sometimes called on an instruction that's not yet complete, and
1135 // so the number of operands is less than the MCID indicates. In
1136 // particular, the PTX target does this.
1137 const MCInstrDesc &MCID = getDesc();
1138 if (MCID.isPredicable()) {
1139 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1140 if (MCID.operands()[i].isPredicate())
1141 return i;
1142 }
1143
1144 return -1;
1145}
1146
1147// MachineOperand::TiedTo is 4 bits wide.
1148const unsigned TiedMax = 15;
1149
1150/// tieOperands - Mark operands at DefIdx and UseIdx as tied to each other.
1151///
1152/// Use and def operands can be tied together, indicated by a non-zero TiedTo
1153/// field. TiedTo can have these values:
1154///
1155/// 0: Operand is not tied to anything.
1156/// 1 to TiedMax-1: Tied to getOperand(TiedTo-1).
1157/// TiedMax: Tied to an operand >= TiedMax-1.
1158///
1159/// The tied def must be one of the first TiedMax operands on a normal
1160/// instruction. INLINEASM instructions allow more tied defs.
1161///
1162void MachineInstr::tieOperands(unsigned DefIdx, unsigned UseIdx) {
1163 MachineOperand &DefMO = getOperand(DefIdx);
1164 MachineOperand &UseMO = getOperand(UseIdx);
1165 assert(DefMO.isDef() && "DefIdx must be a def operand");
1166 assert(UseMO.isUse() && "UseIdx must be a use operand");
1167 assert(!DefMO.isTied() && "Def is already tied to another use");
1168 assert(!UseMO.isTied() && "Use is already tied to another def");
1169
1170 if (DefIdx < TiedMax)
1171 UseMO.TiedTo = DefIdx + 1;
1172 else {
1173 // Inline asm can use the group descriptors to find tied operands,
1174 // statepoint tied operands are trivial to match (1-1 reg def with reg use),
1175 // but on normal instruction, the tied def must be within the first TiedMax
1176 // operands.
1177 assert((isInlineAsm() || getOpcode() == TargetOpcode::STATEPOINT) &&
1178 "DefIdx out of range");
1179 UseMO.TiedTo = TiedMax;
1180 }
1181
1182 // UseIdx can be out of range, we'll search for it in findTiedOperandIdx().
1183 DefMO.TiedTo = std::min(UseIdx + 1, TiedMax);
1184}
1185
1186/// Given the index of a tied register operand, find the operand it is tied to.
1187/// Defs are tied to uses and vice versa. Returns the index of the tied operand
1188/// which must exist.
1189unsigned MachineInstr::findTiedOperandIdx(unsigned OpIdx) const {
1190 const MachineOperand &MO = getOperand(OpIdx);
1191 assert(MO.isTied() && "Operand isn't tied");
1192
1193 // Normally TiedTo is in range.
1194 if (MO.TiedTo < TiedMax)
1195 return MO.TiedTo - 1;
1196
1197 // Uses on normal instructions can be out of range.
1198 if (!isInlineAsm() && getOpcode() != TargetOpcode::STATEPOINT) {
1199 // Normal tied defs must be in the 0..TiedMax-1 range.
1200 if (MO.isUse())
1201 return TiedMax - 1;
1202 // MO is a def. Search for the tied use.
1203 for (unsigned i = TiedMax - 1, e = getNumOperands(); i != e; ++i) {
1204 const MachineOperand &UseMO = getOperand(i);
1205 if (UseMO.isReg() && UseMO.isUse() && UseMO.TiedTo == OpIdx + 1)
1206 return i;
1207 }
1208 llvm_unreachable("Can't find tied use");
1209 }
1210
1211 if (getOpcode() == TargetOpcode::STATEPOINT) {
1212 // In STATEPOINT defs correspond 1-1 to GC pointer operands passed
1213 // on registers.
1214 StatepointOpers SO(this);
1215 unsigned CurUseIdx = SO.getFirstGCPtrIdx();
1216 assert(CurUseIdx != -1U && "only gc pointer statepoint operands can be tied");
1217 unsigned NumDefs = getNumDefs();
1218 for (unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {
1219 while (!getOperand(CurUseIdx).isReg())
1220 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1221 if (OpIdx == CurDefIdx)
1222 return CurUseIdx;
1223 if (OpIdx == CurUseIdx)
1224 return CurDefIdx;
1225 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1226 }
1227 llvm_unreachable("Can't find tied use");
1228 }
1229
1230 // Now deal with inline asm by parsing the operand group descriptor flags.
1231 // Find the beginning of each operand group.
1232 SmallVector<unsigned, 8> GroupIdx;
1233 unsigned OpIdxGroup = ~0u;
1234 unsigned NumOps;
1235 for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;
1236 i += NumOps) {
1237 const MachineOperand &FlagMO = getOperand(i);
1238 assert(FlagMO.isImm() && "Invalid tied operand on inline asm");
1239 unsigned CurGroup = GroupIdx.size();
1240 GroupIdx.push_back(i);
1241 const InlineAsm::Flag F(FlagMO.getImm());
1242 NumOps = 1 + F.getNumOperandRegisters();
1243 // OpIdx belongs to this operand group.
1244 if (OpIdx > i && OpIdx < i + NumOps)
1245 OpIdxGroup = CurGroup;
1246 unsigned TiedGroup;
1247 if (!F.isUseOperandTiedToDef(TiedGroup))
1248 continue;
1249 // Operands in this group are tied to operands in TiedGroup which must be
1250 // earlier. Find the number of operands between the two groups.
1251 unsigned Delta = i - GroupIdx[TiedGroup];
1252
1253 // OpIdx is a use tied to TiedGroup.
1254 if (OpIdxGroup == CurGroup)
1255 return OpIdx - Delta;
1256
1257 // OpIdx is a def tied to this use group.
1258 if (OpIdxGroup == TiedGroup)
1259 return OpIdx + Delta;
1260 }
1261 llvm_unreachable("Invalid tied operand on inline asm");
1262}
1263
1264/// clearKillInfo - Clears kill flags on all operands.
1265///
1267 for (MachineOperand &MO : operands()) {
1268 if (MO.isReg() && MO.isUse())
1269 MO.setIsKill(false);
1270 }
1271}
1272
1274 unsigned SubIdx,
1275 const TargetRegisterInfo &RegInfo) {
1276 if (ToReg.isPhysical()) {
1277 if (SubIdx)
1278 ToReg = RegInfo.getSubReg(ToReg, SubIdx);
1279 for (MachineOperand &MO : operands()) {
1280 if (!MO.isReg() || MO.getReg() != FromReg)
1281 continue;
1282 MO.substPhysReg(ToReg, RegInfo);
1283 }
1284 } else {
1285 for (MachineOperand &MO : operands()) {
1286 if (!MO.isReg() || MO.getReg() != FromReg)
1287 continue;
1288 MO.substVirtReg(ToReg, SubIdx, RegInfo);
1289 }
1290 }
1291}
1292
1293/// isSafeToMove - Return true if it is safe to move this instruction. If
1294/// SawStore is set to true, it means that there is a store (or call) between
1295/// the instruction's location and its intended destination.
1296bool MachineInstr::isSafeToMove(AAResults *AA, bool &SawStore) const {
1297 // Ignore stuff that we obviously can't move.
1298 //
1299 // Treat volatile loads as stores. This is not strictly necessary for
1300 // volatiles, but it is required for atomic loads. It is not allowed to move
1301 // a load across an atomic load with Ordering > Monotonic.
1302 if (mayStore() || isCall() || isPHI() ||
1303 (mayLoad() && hasOrderedMemoryRef())) {
1304 SawStore = true;
1305 return false;
1306 }
1307
1308 if (isPosition() || isDebugInstr() || isTerminator() ||
1311 return false;
1312
1313 // See if this instruction does a load. If so, we have to guarantee that the
1314 // loaded value doesn't change between the load and the its intended
1315 // destination. The check for isInvariantLoad gives the target the chance to
1316 // classify the load as always returning a constant, e.g. a constant pool
1317 // load.
1319 // Otherwise, this is a real load. If there is a store between the load and
1320 // end of block, we can't move it.
1321 return !SawStore;
1322
1323 return true;
1324}
1325
1327 bool UseTBAA, const MachineMemOperand *MMOa,
1328 const MachineMemOperand *MMOb) {
1329 // The following interface to AA is fashioned after DAGCombiner::isAlias and
1330 // operates with MachineMemOperand offset with some important assumptions:
1331 // - LLVM fundamentally assumes flat address spaces.
1332 // - MachineOperand offset can *only* result from legalization and cannot
1333 // affect queries other than the trivial case of overlap checking.
1334 // - These offsets never wrap and never step outside of allocated objects.
1335 // - There should never be any negative offsets here.
1336 //
1337 // FIXME: Modify API to hide this math from "user"
1338 // Even before we go to AA we can reason locally about some memory objects. It
1339 // can save compile time, and possibly catch some corner cases not currently
1340 // covered.
1341
1342 int64_t OffsetA = MMOa->getOffset();
1343 int64_t OffsetB = MMOb->getOffset();
1344 int64_t MinOffset = std::min(OffsetA, OffsetB);
1345
1346 LocationSize WidthA = MMOa->getSize();
1347 LocationSize WidthB = MMOb->getSize();
1348 bool KnownWidthA = WidthA.hasValue();
1349 bool KnownWidthB = WidthB.hasValue();
1350 bool BothMMONonScalable = !WidthA.isScalable() && !WidthB.isScalable();
1351
1352 const Value *ValA = MMOa->getValue();
1353 const Value *ValB = MMOb->getValue();
1354 bool SameVal = (ValA && ValB && (ValA == ValB));
1355 if (!SameVal) {
1356 const PseudoSourceValue *PSVa = MMOa->getPseudoValue();
1357 const PseudoSourceValue *PSVb = MMOb->getPseudoValue();
1358 if (PSVa && ValB && !PSVa->mayAlias(&MFI))
1359 return false;
1360 if (PSVb && ValA && !PSVb->mayAlias(&MFI))
1361 return false;
1362 if (PSVa && PSVb && (PSVa == PSVb))
1363 SameVal = true;
1364 }
1365
1366 if (SameVal && BothMMONonScalable) {
1367 if (!KnownWidthA || !KnownWidthB)
1368 return true;
1369 int64_t MaxOffset = std::max(OffsetA, OffsetB);
1370 int64_t LowWidth = (MinOffset == OffsetA)
1371 ? WidthA.getValue().getKnownMinValue()
1372 : WidthB.getValue().getKnownMinValue();
1373 return (MinOffset + LowWidth > MaxOffset);
1374 }
1375
1376 if (!AA)
1377 return true;
1378
1379 if (!ValA || !ValB)
1380 return true;
1381
1382 assert((OffsetA >= 0) && "Negative MachineMemOperand offset");
1383 assert((OffsetB >= 0) && "Negative MachineMemOperand offset");
1384
1385 // If Scalable Location Size has non-zero offset, Width + Offset does not work
1386 // at the moment
1387 if ((WidthA.isScalable() && OffsetA > 0) ||
1388 (WidthB.isScalable() && OffsetB > 0))
1389 return true;
1390
1391 int64_t OverlapA =
1392 KnownWidthA ? WidthA.getValue().getKnownMinValue() + OffsetA - MinOffset
1394 int64_t OverlapB =
1395 KnownWidthB ? WidthB.getValue().getKnownMinValue() + OffsetB - MinOffset
1397
1398 LocationSize LocA = (WidthA.isScalable() || !KnownWidthA)
1399 ? WidthA
1400 : LocationSize::precise(OverlapA);
1401 LocationSize LocB = (WidthB.isScalable() || !KnownWidthB)
1402 ? WidthB
1403 : LocationSize::precise(OverlapB);
1404
1405 return !AA->isNoAlias(
1406 MemoryLocation(ValA, LocA, UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
1407 MemoryLocation(ValB, LocB, UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
1408}
1409
1411 bool UseTBAA) const {
1412 const MachineFunction *MF = getMF();
1414 const MachineFrameInfo &MFI = MF->getFrameInfo();
1415
1416 // Exclude call instruction which may alter the memory but can not be handled
1417 // by this function.
1418 if (isCall() || Other.isCall())
1419 return true;
1420
1421 // If neither instruction stores to memory, they can't alias in any
1422 // meaningful way, even if they read from the same address.
1423 if (!mayStore() && !Other.mayStore())
1424 return false;
1425
1426 // Both instructions must be memory operations to be able to alias.
1427 if (!mayLoadOrStore() || !Other.mayLoadOrStore())
1428 return false;
1429
1430 // Let the target decide if memory accesses cannot possibly overlap.
1432 return false;
1433
1434 // Memory operations without memory operands may access anything. Be
1435 // conservative and assume `MayAlias`.
1436 if (memoperands_empty() || Other.memoperands_empty())
1437 return true;
1438
1439 // Skip if there are too many memory operands.
1440 auto NumChecks = getNumMemOperands() * Other.getNumMemOperands();
1441 if (NumChecks > TII->getMemOperandAACheckLimit())
1442 return true;
1443
1444 // Check each pair of memory operands from both instructions, which can't
1445 // alias only if all pairs won't alias.
1446 for (auto *MMOa : memoperands())
1447 for (auto *MMOb : Other.memoperands())
1448 if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb))
1449 return true;
1450
1451 return false;
1452}
1453
1454/// hasOrderedMemoryRef - Return true if this instruction may have an ordered
1455/// or volatile memory reference, or if the information describing the memory
1456/// reference is not available. Return false if it is known to have no ordered
1457/// memory references.
1459 // An instruction known never to access memory won't have a volatile access.
1460 if (!mayStore() &&
1461 !mayLoad() &&
1462 !isCall() &&
1464 return false;
1465
1466 // Otherwise, if the instruction has no memory reference information,
1467 // conservatively assume it wasn't preserved.
1468 if (memoperands_empty())
1469 return true;
1470
1471 // Check if any of our memory operands are ordered.
1472 return llvm::any_of(memoperands(), [](const MachineMemOperand *MMO) {
1473 return !MMO->isUnordered();
1474 });
1475}
1476
1477/// isDereferenceableInvariantLoad - Return true if this instruction will never
1478/// trap and is loading from a location whose value is invariant across a run of
1479/// this function.
1481 // If the instruction doesn't load at all, it isn't an invariant load.
1482 if (!mayLoad())
1483 return false;
1484
1485 // If the instruction has lost its memoperands, conservatively assume that
1486 // it may not be an invariant load.
1487 if (memoperands_empty())
1488 return false;
1489
1490 const MachineFrameInfo &MFI = getParent()->getParent()->getFrameInfo();
1491
1492 for (MachineMemOperand *MMO : memoperands()) {
1493 if (!MMO->isUnordered())
1494 // If the memory operand has ordering side effects, we can't move the
1495 // instruction. Such an instruction is technically an invariant load,
1496 // but the caller code would need updated to expect that.
1497 return false;
1498 if (MMO->isStore()) return false;
1499 if (MMO->isInvariant() && MMO->isDereferenceable())
1500 continue;
1501
1502 // A load from a constant PseudoSourceValue is invariant.
1503 if (const PseudoSourceValue *PSV = MMO->getPseudoValue()) {
1504 if (PSV->isConstant(&MFI))
1505 continue;
1506 }
1507
1508 // Otherwise assume conservatively.
1509 return false;
1510 }
1511
1512 // Everything checks out.
1513 return true;
1514}
1515
1516/// isConstantValuePHI - If the specified instruction is a PHI that always
1517/// merges together the same virtual register, return the register, otherwise
1518/// return 0.
1520 if (!isPHI())
1521 return 0;
1522 assert(getNumOperands() >= 3 &&
1523 "It's illegal to have a PHI without source operands");
1524
1525 Register Reg = getOperand(1).getReg();
1526 for (unsigned i = 3, e = getNumOperands(); i < e; i += 2)
1527 if (getOperand(i).getReg() != Reg)
1528 return 0;
1529 return Reg;
1530}
1531
1534 return true;
1535 if (isInlineAsm()) {
1536 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1537 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1538 return true;
1539 }
1540
1541 return false;
1542}
1543
1545 return mayStore() || isCall() ||
1547}
1548
1549/// allDefsAreDead - Return true if all the defs of this instruction are dead.
1550///
1552 for (const MachineOperand &MO : operands()) {
1553 if (!MO.isReg() || MO.isUse())
1554 continue;
1555 if (!MO.isDead())
1556 return false;
1557 }
1558 return true;
1559}
1560
1562 for (const MachineOperand &MO : implicit_operands()) {
1563 if (!MO.isReg() || MO.isUse())
1564 continue;
1565 if (!MO.isDead())
1566 return false;
1567 }
1568 return true;
1569}
1570
1571/// copyImplicitOps - Copy implicit register operands from specified
1572/// instruction to this instruction.
1574 const MachineInstr &MI) {
1575 for (const MachineOperand &MO :
1576 llvm::drop_begin(MI.operands(), MI.getDesc().getNumOperands()))
1577 if ((MO.isReg() && MO.isImplicit()) || MO.isRegMask())
1578 addOperand(MF, MO);
1579}
1580
1582 const MCInstrDesc &MCID = getDesc();
1583 if (MCID.Opcode == TargetOpcode::STATEPOINT)
1584 return true;
1585 for (unsigned I = 0, E = getNumOperands(); I < E; ++I) {
1586 const auto &Operand = getOperand(I);
1587 if (!Operand.isReg() || Operand.isDef())
1588 // Ignore the defined registers as MCID marks only the uses as tied.
1589 continue;
1590 int ExpectedTiedIdx = MCID.getOperandConstraint(I, MCOI::TIED_TO);
1591 int TiedIdx = Operand.isTied() ? int(findTiedOperandIdx(I)) : -1;
1592 if (ExpectedTiedIdx != TiedIdx)
1593 return true;
1594 }
1595 return false;
1596}
1597
1599 const MachineRegisterInfo &MRI) const {
1600 const MachineOperand &Op = getOperand(OpIdx);
1601 if (!Op.isReg())
1602 return LLT{};
1603
1604 if (isVariadic() || OpIdx >= getNumExplicitOperands())
1605 return MRI.getType(Op.getReg());
1606
1607 auto &OpInfo = getDesc().operands()[OpIdx];
1608 if (!OpInfo.isGenericType())
1609 return MRI.getType(Op.getReg());
1610
1611 if (PrintedTypes[OpInfo.getGenericTypeIndex()])
1612 return LLT{};
1613
1614 LLT TypeToPrint = MRI.getType(Op.getReg());
1615 // Don't mark the type index printed if it wasn't actually printed: maybe
1616 // another operand with the same type index has an actual type attached:
1617 if (TypeToPrint.isValid())
1618 PrintedTypes.set(OpInfo.getGenericTypeIndex());
1619 return TypeToPrint;
1620}
1621
1622#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1624 dbgs() << " ";
1625 print(dbgs());
1626}
1627
1628LLVM_DUMP_METHOD void MachineInstr::dumprImpl(
1629 const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
1630 SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const {
1631 if (Depth >= MaxDepth)
1632 return;
1633 if (!AlreadySeenInstrs.insert(this).second)
1634 return;
1635 // PadToColumn always inserts at least one space.
1636 // Don't mess up the alignment if we don't want any space.
1637 if (Depth)
1638 fdbgs().PadToColumn(Depth * 2);
1639 print(fdbgs());
1640 for (const MachineOperand &MO : operands()) {
1641 if (!MO.isReg() || MO.isDef())
1642 continue;
1643 Register Reg = MO.getReg();
1644 if (Reg.isPhysical())
1645 continue;
1646 const MachineInstr *NewMI = MRI.getUniqueVRegDef(Reg);
1647 if (NewMI == nullptr)
1648 continue;
1649 NewMI->dumprImpl(MRI, Depth + 1, MaxDepth, AlreadySeenInstrs);
1650 }
1651}
1652
1654 unsigned MaxDepth) const {
1655 SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;
1656 dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
1657}
1658#endif
1659
1660void MachineInstr::print(raw_ostream &OS, bool IsStandalone, bool SkipOpers,
1661 bool SkipDebugLoc, bool AddNewLine,
1662 const TargetInstrInfo *TII) const {
1663 const Module *M = nullptr;
1664 const Function *F = nullptr;
1665 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
1666 F = &MF->getFunction();
1667 M = F->getParent();
1668 if (!TII)
1669 TII = MF->getSubtarget().getInstrInfo();
1670 }
1671
1672 ModuleSlotTracker MST(M);
1673 if (F)
1674 MST.incorporateFunction(*F);
1675 print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine, TII);
1676}
1677
1679 bool IsStandalone, bool SkipOpers, bool SkipDebugLoc,
1680 bool AddNewLine, const TargetInstrInfo *TII) const {
1681 // We can be a bit tidier if we know the MachineFunction.
1682 const TargetRegisterInfo *TRI = nullptr;
1683 const MachineRegisterInfo *MRI = nullptr;
1684 const TargetIntrinsicInfo *IntrinsicInfo = nullptr;
1685 tryToGetTargetInfo(*this, TRI, MRI, IntrinsicInfo, TII);
1686
1687 if (isCFIInstruction())
1688 assert(getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
1689
1690 SmallBitVector PrintedTypes(8);
1691 bool ShouldPrintRegisterTies = IsStandalone || hasComplexRegisterTies();
1692 auto getTiedOperandIdx = [&](unsigned OpIdx) {
1693 if (!ShouldPrintRegisterTies)
1694 return 0U;
1695 const MachineOperand &MO = getOperand(OpIdx);
1696 if (MO.isReg() && MO.isTied() && !MO.isDef())
1697 return findTiedOperandIdx(OpIdx);
1698 return 0U;
1699 };
1700 unsigned StartOp = 0;
1701 unsigned e = getNumOperands();
1702
1703 // Print explicitly defined operands on the left of an assignment syntax.
1704 while (StartOp < e) {
1705 const MachineOperand &MO = getOperand(StartOp);
1706 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
1707 break;
1708
1709 if (StartOp != 0)
1710 OS << ", ";
1711
1712 LLT TypeToPrint = MRI ? getTypeToPrint(StartOp, PrintedTypes, *MRI) : LLT{};
1713 unsigned TiedOperandIdx = getTiedOperandIdx(StartOp);
1714 MO.print(OS, MST, TypeToPrint, StartOp, /*PrintDef=*/false, IsStandalone,
1715 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1716 ++StartOp;
1717 }
1718
1719 if (StartOp != 0)
1720 OS << " = ";
1721
1723 OS << "frame-setup ";
1725 OS << "frame-destroy ";
1727 OS << "nnan ";
1729 OS << "ninf ";
1731 OS << "nsz ";
1733 OS << "arcp ";
1735 OS << "contract ";
1737 OS << "afn ";
1739 OS << "reassoc ";
1741 OS << "nuw ";
1743 OS << "nsw ";
1745 OS << "exact ";
1747 OS << "nofpexcept ";
1749 OS << "nomerge ";
1751 OS << "nneg ";
1753 OS << "disjoint ";
1754
1755 // Print the opcode name.
1756 if (TII)
1757 OS << TII->getName(getOpcode());
1758 else
1759 OS << "UNKNOWN";
1760
1761 if (SkipOpers)
1762 return;
1763
1764 // Print the rest of the operands.
1765 bool FirstOp = true;
1766 unsigned AsmDescOp = ~0u;
1767 unsigned AsmOpCount = 0;
1768
1770 // Print asm string.
1771 OS << " ";
1772 const unsigned OpIdx = InlineAsm::MIOp_AsmString;
1773 LLT TypeToPrint = MRI ? getTypeToPrint(OpIdx, PrintedTypes, *MRI) : LLT{};
1774 unsigned TiedOperandIdx = getTiedOperandIdx(OpIdx);
1775 getOperand(OpIdx).print(OS, MST, TypeToPrint, OpIdx, /*PrintDef=*/true, IsStandalone,
1776 ShouldPrintRegisterTies, TiedOperandIdx, TRI,
1777 IntrinsicInfo);
1778
1779 // Print HasSideEffects, MayLoad, MayStore, IsAlignStack
1780 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1781 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1782 OS << " [sideeffect]";
1783 if (ExtraInfo & InlineAsm::Extra_MayLoad)
1784 OS << " [mayload]";
1785 if (ExtraInfo & InlineAsm::Extra_MayStore)
1786 OS << " [maystore]";
1787 if (ExtraInfo & InlineAsm::Extra_IsConvergent)
1788 OS << " [isconvergent]";
1789 if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
1790 OS << " [alignstack]";
1792 OS << " [attdialect]";
1794 OS << " [inteldialect]";
1795
1796 StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;
1797 FirstOp = false;
1798 }
1799
1800 for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
1801 const MachineOperand &MO = getOperand(i);
1802
1803 if (FirstOp) FirstOp = false; else OS << ",";
1804 OS << " ";
1805
1806 if (isDebugValueLike() && MO.isMetadata()) {
1807 // Pretty print DBG_VALUE* instructions.
1808 auto *DIV = dyn_cast<DILocalVariable>(MO.getMetadata());
1809 if (DIV && !DIV->getName().empty())
1810 OS << "!\"" << DIV->getName() << '\"';
1811 else {
1812 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1813 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1814 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1815 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1816 }
1817 } else if (isDebugLabel() && MO.isMetadata()) {
1818 // Pretty print DBG_LABEL instructions.
1819 auto *DIL = dyn_cast<DILabel>(MO.getMetadata());
1820 if (DIL && !DIL->getName().empty())
1821 OS << "\"" << DIL->getName() << '\"';
1822 else {
1823 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1824 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1825 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1826 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1827 }
1828 } else if (i == AsmDescOp && MO.isImm()) {
1829 // Pretty print the inline asm operand descriptor.
1830 OS << '$' << AsmOpCount++;
1831 unsigned Flag = MO.getImm();
1832 const InlineAsm::Flag F(Flag);
1833 OS << ":[";
1834 OS << F.getKindName();
1835
1836 unsigned RCID;
1837 if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {
1838 if (TRI) {
1839 OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));
1840 } else
1841 OS << ":RC" << RCID;
1842 }
1843
1844 if (F.isMemKind()) {
1845 const InlineAsm::ConstraintCode MCID = F.getMemoryConstraintID();
1846 OS << ":" << InlineAsm::getMemConstraintName(MCID);
1847 }
1848
1849 unsigned TiedTo;
1850 if (F.isUseOperandTiedToDef(TiedTo))
1851 OS << " tiedto:$" << TiedTo;
1852
1853 if ((F.isRegDefKind() || F.isRegDefEarlyClobberKind() ||
1854 F.isRegUseKind()) &&
1855 F.getRegMayBeFolded()) {
1856 OS << " foldable";
1857 }
1858
1859 OS << ']';
1860
1861 // Compute the index of the next operand descriptor.
1862 AsmDescOp += 1 + F.getNumOperandRegisters();
1863 } else {
1864 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1865 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1866 if (MO.isImm() && isOperandSubregIdx(i))
1868 else
1869 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1870 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1871 }
1872 }
1873
1874 // Print any optional symbols attached to this instruction as-if they were
1875 // operands.
1876 if (MCSymbol *PreInstrSymbol = getPreInstrSymbol()) {
1877 if (!FirstOp) {
1878 FirstOp = false;
1879 OS << ',';
1880 }
1881 OS << " pre-instr-symbol ";
1882 MachineOperand::printSymbol(OS, *PreInstrSymbol);
1883 }
1884 if (MCSymbol *PostInstrSymbol = getPostInstrSymbol()) {
1885 if (!FirstOp) {
1886 FirstOp = false;
1887 OS << ',';
1888 }
1889 OS << " post-instr-symbol ";
1890 MachineOperand::printSymbol(OS, *PostInstrSymbol);
1891 }
1892 if (MDNode *HeapAllocMarker = getHeapAllocMarker()) {
1893 if (!FirstOp) {
1894 FirstOp = false;
1895 OS << ',';
1896 }
1897 OS << " heap-alloc-marker ";
1898 HeapAllocMarker->printAsOperand(OS, MST);
1899 }
1900 if (MDNode *PCSections = getPCSections()) {
1901 if (!FirstOp) {
1902 FirstOp = false;
1903 OS << ',';
1904 }
1905 OS << " pcsections ";
1906 PCSections->printAsOperand(OS, MST);
1907 }
1908 if (MDNode *MMRA = getMMRAMetadata()) {
1909 if (!FirstOp) {
1910 FirstOp = false;
1911 OS << ',';
1912 }
1913 OS << " mmra ";
1914 MMRA->printAsOperand(OS, MST);
1915 }
1916 if (uint32_t CFIType = getCFIType()) {
1917 if (!FirstOp)
1918 OS << ',';
1919 OS << " cfi-type " << CFIType;
1920 }
1921
1922 if (DebugInstrNum) {
1923 if (!FirstOp)
1924 OS << ",";
1925 OS << " debug-instr-number " << DebugInstrNum;
1926 }
1927
1928 if (!SkipDebugLoc) {
1929 if (const DebugLoc &DL = getDebugLoc()) {
1930 if (!FirstOp)
1931 OS << ',';
1932 OS << " debug-location ";
1933 DL->printAsOperand(OS, MST);
1934 }
1935 }
1936
1937 if (!memoperands_empty()) {
1939 const LLVMContext *Context = nullptr;
1940 std::unique_ptr<LLVMContext> CtxPtr;
1941 const MachineFrameInfo *MFI = nullptr;
1942 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
1943 MFI = &MF->getFrameInfo();
1944 Context = &MF->getFunction().getContext();
1945 } else {
1946 CtxPtr = std::make_unique<LLVMContext>();
1947 Context = CtxPtr.get();
1948 }
1949
1950 OS << " :: ";
1951 bool NeedComma = false;
1952 for (const MachineMemOperand *Op : memoperands()) {
1953 if (NeedComma)
1954 OS << ", ";
1955 Op->print(OS, MST, SSNs, *Context, MFI, TII);
1956 NeedComma = true;
1957 }
1958 }
1959
1960 if (SkipDebugLoc)
1961 return;
1962
1963 bool HaveSemi = false;
1964
1965 // Print debug location information.
1966 if (const DebugLoc &DL = getDebugLoc()) {
1967 if (!HaveSemi) {
1968 OS << ';';
1969 HaveSemi = true;
1970 }
1971 OS << ' ';
1972 DL.print(OS);
1973 }
1974
1975 // Print extra comments for DEBUG_VALUE and friends if they are well-formed.
1976 if ((isNonListDebugValue() && getNumOperands() >= 4) ||
1977 (isDebugValueList() && getNumOperands() >= 2) ||
1978 (isDebugRef() && getNumOperands() >= 3)) {
1979 if (getDebugVariableOp().isMetadata()) {
1980 if (!HaveSemi) {
1981 OS << ";";
1982 HaveSemi = true;
1983 }
1984 auto *DV = getDebugVariable();
1985 OS << " line no:" << DV->getLine();
1987 OS << " indirect";
1988 }
1989 }
1990 // TODO: DBG_LABEL
1991
1992 if (AddNewLine)
1993 OS << '\n';
1994}
1995
1997 const TargetRegisterInfo *RegInfo,
1998 bool AddIfNotFound) {
1999 bool isPhysReg = IncomingReg.isPhysical();
2000 bool hasAliases = isPhysReg &&
2001 MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();
2002 bool Found = false;
2004 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2005 MachineOperand &MO = getOperand(i);
2006 if (!MO.isReg() || !MO.isUse() || MO.isUndef())
2007 continue;
2008
2009 // DEBUG_VALUE nodes do not contribute to code generation and should
2010 // always be ignored. Failure to do so may result in trying to modify
2011 // KILL flags on DEBUG_VALUE nodes.
2012 if (MO.isDebug())
2013 continue;
2014
2015 Register Reg = MO.getReg();
2016 if (!Reg)
2017 continue;
2018
2019 if (Reg == IncomingReg) {
2020 if (!Found) {
2021 if (MO.isKill())
2022 // The register is already marked kill.
2023 return true;
2024 if (isPhysReg && isRegTiedToDefOperand(i))
2025 // Two-address uses of physregs must not be marked kill.
2026 return true;
2027 MO.setIsKill();
2028 Found = true;
2029 }
2030 } else if (hasAliases && MO.isKill() && Reg.isPhysical()) {
2031 // A super-register kill already exists.
2032 if (RegInfo->isSuperRegister(IncomingReg, Reg))
2033 return true;
2034 if (RegInfo->isSubRegister(IncomingReg, Reg))
2035 DeadOps.push_back(i);
2036 }
2037 }
2038
2039 // Trim unneeded kill operands.
2040 while (!DeadOps.empty()) {
2041 unsigned OpIdx = DeadOps.back();
2042 if (getOperand(OpIdx).isImplicit() &&
2043 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2044 removeOperand(OpIdx);
2045 else
2046 getOperand(OpIdx).setIsKill(false);
2047 DeadOps.pop_back();
2048 }
2049
2050 // If not found, this means an alias of one of the operands is killed. Add a
2051 // new implicit operand if required.
2052 if (!Found && AddIfNotFound) {
2054 false /*IsDef*/,
2055 true /*IsImp*/,
2056 true /*IsKill*/));
2057 return true;
2058 }
2059 return Found;
2060}
2061
2063 const TargetRegisterInfo *RegInfo) {
2064 if (!Reg.isPhysical())
2065 RegInfo = nullptr;
2066 for (MachineOperand &MO : operands()) {
2067 if (!MO.isReg() || !MO.isUse() || !MO.isKill())
2068 continue;
2069 Register OpReg = MO.getReg();
2070 if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)
2071 MO.setIsKill(false);
2072 }
2073}
2074
2076 const TargetRegisterInfo *RegInfo,
2077 bool AddIfNotFound) {
2078 bool isPhysReg = Reg.isPhysical();
2079 bool hasAliases = isPhysReg &&
2080 MCRegAliasIterator(Reg, RegInfo, false).isValid();
2081 bool Found = false;
2083 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2084 MachineOperand &MO = getOperand(i);
2085 if (!MO.isReg() || !MO.isDef())
2086 continue;
2087 Register MOReg = MO.getReg();
2088 if (!MOReg)
2089 continue;
2090
2091 if (MOReg == Reg) {
2092 MO.setIsDead();
2093 Found = true;
2094 } else if (hasAliases && MO.isDead() && MOReg.isPhysical()) {
2095 // There exists a super-register that's marked dead.
2096 if (RegInfo->isSuperRegister(Reg, MOReg))
2097 return true;
2098 if (RegInfo->isSubRegister(Reg, MOReg))
2099 DeadOps.push_back(i);
2100 }
2101 }
2102
2103 // Trim unneeded dead operands.
2104 while (!DeadOps.empty()) {
2105 unsigned OpIdx = DeadOps.back();
2106 if (getOperand(OpIdx).isImplicit() &&
2107 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2108 removeOperand(OpIdx);
2109 else
2110 getOperand(OpIdx).setIsDead(false);
2111 DeadOps.pop_back();
2112 }
2113
2114 // If not found, this means an alias of one of the operands is dead. Add a
2115 // new implicit operand if required.
2116 if (Found || !AddIfNotFound)
2117 return Found;
2118
2120 true /*IsDef*/,
2121 true /*IsImp*/,
2122 false /*IsKill*/,
2123 true /*IsDead*/));
2124 return true;
2125}
2126
2128 for (MachineOperand &MO : operands()) {
2129 if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg)
2130 continue;
2131 MO.setIsDead(false);
2132 }
2133}
2134
2136 for (MachineOperand &MO : operands()) {
2137 if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg || MO.getSubReg() == 0)
2138 continue;
2139 MO.setIsUndef(IsUndef);
2140 }
2141}
2142
2144 const TargetRegisterInfo *RegInfo) {
2145 if (Reg.isPhysical()) {
2146 MachineOperand *MO = findRegisterDefOperand(Reg, RegInfo, false, false);
2147 if (MO)
2148 return;
2149 } else {
2150 for (const MachineOperand &MO : operands()) {
2151 if (MO.isReg() && MO.getReg() == Reg && MO.isDef() &&
2152 MO.getSubReg() == 0)
2153 return;
2154 }
2155 }
2157 true /*IsDef*/,
2158 true /*IsImp*/));
2159}
2160
2162 const TargetRegisterInfo &TRI) {
2163 bool HasRegMask = false;
2164 for (MachineOperand &MO : operands()) {
2165 if (MO.isRegMask()) {
2166 HasRegMask = true;
2167 continue;
2168 }
2169 if (!MO.isReg() || !MO.isDef()) continue;
2170 Register Reg = MO.getReg();
2171 if (!Reg.isPhysical())
2172 continue;
2173 // If there are no uses, including partial uses, the def is dead.
2174 if (llvm::none_of(UsedRegs,
2175 [&](MCRegister Use) { return TRI.regsOverlap(Use, Reg); }))
2176 MO.setIsDead();
2177 }
2178
2179 // This is a call with a register mask operand.
2180 // Mask clobbers are always dead, so add defs for the non-dead defines.
2181 if (HasRegMask)
2182 for (const Register &UsedReg : UsedRegs)
2183 addRegisterDefined(UsedReg, &TRI);
2184}
2185
2186unsigned
2188 // Build up a buffer of hash code components.
2189 SmallVector<size_t, 16> HashComponents;
2190 HashComponents.reserve(MI->getNumOperands() + 1);
2191 HashComponents.push_back(MI->getOpcode());
2192 for (const MachineOperand &MO : MI->operands()) {
2193 if (MO.isReg() && MO.isDef() && MO.getReg().isVirtual())
2194 continue; // Skip virtual register defs.
2195
2196 HashComponents.push_back(hash_value(MO));
2197 }
2198 return hash_combine_range(HashComponents.begin(), HashComponents.end());
2199}
2200
2202 // Find the source location cookie.
2203 uint64_t LocCookie = 0;
2204 const MDNode *LocMD = nullptr;
2205 for (unsigned i = getNumOperands(); i != 0; --i) {
2206 if (getOperand(i-1).isMetadata() &&
2207 (LocMD = getOperand(i-1).getMetadata()) &&
2208 LocMD->getNumOperands() != 0) {
2209 if (const ConstantInt *CI =
2210 mdconst::dyn_extract<ConstantInt>(LocMD->getOperand(0))) {
2211 LocCookie = CI->getZExtValue();
2212 break;
2213 }
2214 }
2215 }
2216
2217 if (const MachineBasicBlock *MBB = getParent())
2218 if (const MachineFunction *MF = MBB->getParent())
2219 return MF->getFunction().getContext().emitError(LocCookie, Msg);
2220 report_fatal_error(Msg);
2221}
2222
2224 const MCInstrDesc &MCID, bool IsIndirect,
2225 Register Reg, const MDNode *Variable,
2226 const MDNode *Expr) {
2227 assert(isa<DILocalVariable>(Variable) && "not a variable");
2228 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2229 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2230 "Expected inlined-at fields to agree");
2231 auto MIB = BuildMI(MF, DL, MCID).addReg(Reg);
2232 if (IsIndirect)
2233 MIB.addImm(0U);
2234 else
2235 MIB.addReg(0U);
2236 return MIB.addMetadata(Variable).addMetadata(Expr);
2237}
2238
2240 const MCInstrDesc &MCID, bool IsIndirect,
2241 ArrayRef<MachineOperand> DebugOps,
2242 const MDNode *Variable, const MDNode *Expr) {
2243 assert(isa<DILocalVariable>(Variable) && "not a variable");
2244 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2245 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2246 "Expected inlined-at fields to agree");
2247 if (MCID.Opcode == TargetOpcode::DBG_VALUE) {
2248 assert(DebugOps.size() == 1 &&
2249 "DBG_VALUE must contain exactly one debug operand");
2250 MachineOperand DebugOp = DebugOps[0];
2251 if (DebugOp.isReg())
2252 return BuildMI(MF, DL, MCID, IsIndirect, DebugOp.getReg(), Variable,
2253 Expr);
2254
2255 auto MIB = BuildMI(MF, DL, MCID).add(DebugOp);
2256 if (IsIndirect)
2257 MIB.addImm(0U);
2258 else
2259 MIB.addReg(0U);
2260 return MIB.addMetadata(Variable).addMetadata(Expr);
2261 }
2262
2263 auto MIB = BuildMI(MF, DL, MCID);
2264 MIB.addMetadata(Variable).addMetadata(Expr);
2265 for (const MachineOperand &DebugOp : DebugOps)
2266 if (DebugOp.isReg())
2267 MIB.addReg(DebugOp.getReg());
2268 else
2269 MIB.add(DebugOp);
2270 return MIB;
2271}
2272
2275 const DebugLoc &DL, const MCInstrDesc &MCID,
2276 bool IsIndirect, Register Reg,
2277 const MDNode *Variable, const MDNode *Expr) {
2278 MachineFunction &MF = *BB.getParent();
2279 MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Variable, Expr);
2280 BB.insert(I, MI);
2281 return MachineInstrBuilder(MF, MI);
2282}
2283
2286 const DebugLoc &DL, const MCInstrDesc &MCID,
2287 bool IsIndirect,
2288 ArrayRef<MachineOperand> DebugOps,
2289 const MDNode *Variable, const MDNode *Expr) {
2290 MachineFunction &MF = *BB.getParent();
2291 MachineInstr *MI =
2292 BuildMI(MF, DL, MCID, IsIndirect, DebugOps, Variable, Expr);
2293 BB.insert(I, MI);
2294 return MachineInstrBuilder(MF, *MI);
2295}
2296
2297/// Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
2298/// This prepends DW_OP_deref when spilling an indirect DBG_VALUE.
2299static const DIExpression *
2301 SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2302 assert(MI.getDebugVariable()->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
2303 "Expected inlined-at fields to agree");
2304
2305 const DIExpression *Expr = MI.getDebugExpression();
2306 if (MI.isIndirectDebugValue()) {
2307 assert(MI.getDebugOffset().getImm() == 0 &&
2308 "DBG_VALUE with nonzero offset");
2310 } else if (MI.isDebugValueList()) {
2311 // We will replace the spilled register with a frame index, so
2312 // immediately deref all references to the spilled register.
2313 std::array<uint64_t, 1> Ops{{dwarf::DW_OP_deref}};
2314 for (const MachineOperand *Op : SpilledOperands) {
2315 unsigned OpIdx = MI.getDebugOperandIndex(Op);
2316 Expr = DIExpression::appendOpsToArg(Expr, Ops, OpIdx);
2317 }
2318 }
2319 return Expr;
2320}
2322 Register SpillReg) {
2323 assert(MI.hasDebugOperandForReg(SpillReg) && "Spill Reg is not used in MI.");
2325 for (const MachineOperand &Op : MI.getDebugOperandsForReg(SpillReg))
2326 SpillOperands.push_back(&Op);
2327 return computeExprForSpill(MI, SpillOperands);
2328}
2329
2332 const MachineInstr &Orig,
2333 int FrameIndex, Register SpillReg) {
2334 assert(!Orig.isDebugRef() &&
2335 "DBG_INSTR_REF should not reference a virtual register.");
2336 const DIExpression *Expr = computeExprForSpill(Orig, SpillReg);
2337 MachineInstrBuilder NewMI =
2338 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2339 // Non-Variadic Operands: Location, Offset, Variable, Expression
2340 // Variadic Operands: Variable, Expression, Locations...
2341 if (Orig.isNonListDebugValue())
2342 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2343 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2344 if (Orig.isDebugValueList()) {
2345 for (const MachineOperand &Op : Orig.debug_operands())
2346 if (Op.isReg() && Op.getReg() == SpillReg)
2347 NewMI.addFrameIndex(FrameIndex);
2348 else
2349 NewMI.add(MachineOperand(Op));
2350 }
2351 return NewMI;
2352}
2355 const MachineInstr &Orig, int FrameIndex,
2356 SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2357 const DIExpression *Expr = computeExprForSpill(Orig, SpilledOperands);
2358 MachineInstrBuilder NewMI =
2359 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2360 // Non-Variadic Operands: Location, Offset, Variable, Expression
2361 // Variadic Operands: Variable, Expression, Locations...
2362 if (Orig.isNonListDebugValue())
2363 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2364 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2365 if (Orig.isDebugValueList()) {
2366 for (const MachineOperand &Op : Orig.debug_operands())
2367 if (is_contained(SpilledOperands, &Op))
2368 NewMI.addFrameIndex(FrameIndex);
2369 else
2370 NewMI.add(MachineOperand(Op));
2371 }
2372 return NewMI;
2373}
2374
2376 Register Reg) {
2377 const DIExpression *Expr = computeExprForSpill(Orig, Reg);
2378 if (Orig.isNonListDebugValue())
2380 for (MachineOperand &Op : Orig.getDebugOperandsForReg(Reg))
2381 Op.ChangeToFrameIndex(FrameIndex);
2382 Orig.getDebugExpressionOp().setMetadata(Expr);
2383}
2384
2387 MachineInstr &MI = *this;
2388 if (!MI.getOperand(0).isReg())
2389 return;
2390
2392 for (MachineBasicBlock::iterator DE = MI.getParent()->end();
2393 DI != DE; ++DI) {
2394 if (!DI->isDebugValue())
2395 return;
2396 if (DI->hasDebugOperandForReg(MI.getOperand(0).getReg()))
2397 DbgValues.push_back(&*DI);
2398 }
2399}
2400
2402 // Collect matching debug values.
2404
2405 if (!getOperand(0).isReg())
2406 return;
2407
2408 Register DefReg = getOperand(0).getReg();
2409 auto *MRI = getRegInfo();
2410 for (auto &MO : MRI->use_operands(DefReg)) {
2411 auto *DI = MO.getParent();
2412 if (!DI->isDebugValue())
2413 continue;
2414 if (DI->hasDebugOperandForReg(DefReg)) {
2415 DbgValues.push_back(DI);
2416 }
2417 }
2418
2419 // Propagate Reg to debug value instructions.
2420 for (auto *DBI : DbgValues)
2421 for (MachineOperand &Op : DBI->getDebugOperandsForReg(DefReg))
2422 Op.setReg(Reg);
2423}
2424
2426
2428 const MachineFrameInfo &MFI) {
2429 uint64_t Size = 0;
2430 for (const auto *A : Accesses) {
2431 if (MFI.isSpillSlotObjectIndex(
2432 cast<FixedStackPseudoSourceValue>(A->getPseudoValue())
2433 ->getFrameIndex())) {
2434 LocationSize S = A->getSize();
2435 if (!S.hasValue())
2437 Size += S.getValue();
2438 }
2439 }
2440 return Size;
2441}
2442
2443std::optional<LocationSize>
2445 int FI;
2446 if (TII->isStoreToStackSlotPostFE(*this, FI)) {
2447 const MachineFrameInfo &MFI = getMF()->getFrameInfo();
2448 if (MFI.isSpillSlotObjectIndex(FI))
2449 return (*memoperands_begin())->getSize();
2450 }
2451 return std::nullopt;
2452}
2453
2454std::optional<LocationSize>
2456 MMOList Accesses;
2457 if (TII->hasStoreToStackSlot(*this, Accesses))
2458 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2459 return std::nullopt;
2460}
2461
2462std::optional<LocationSize>
2464 int FI;
2465 if (TII->isLoadFromStackSlotPostFE(*this, FI)) {
2466 const MachineFrameInfo &MFI = getMF()->getFrameInfo();
2467 if (MFI.isSpillSlotObjectIndex(FI))
2468 return (*memoperands_begin())->getSize();
2469 }
2470 return std::nullopt;
2471}
2472
2473std::optional<LocationSize>
2475 MMOList Accesses;
2476 if (TII->hasLoadFromStackSlot(*this, Accesses))
2477 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2478 return std::nullopt;
2479}
2480
2482 if (DebugInstrNum == 0)
2483 DebugInstrNum = getParent()->getParent()->getNewDebugInstrNum();
2484 return DebugInstrNum;
2485}
2486
2488 if (DebugInstrNum == 0)
2489 DebugInstrNum = MF.getNewDebugInstrNum();
2490 return DebugInstrNum;
2491}
2492
2493std::tuple<LLT, LLT> MachineInstr::getFirst2LLTs() const {
2494 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2495 getRegInfo()->getType(getOperand(1).getReg()));
2496}
2497
2498std::tuple<LLT, LLT, LLT> MachineInstr::getFirst3LLTs() const {
2499 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2500 getRegInfo()->getType(getOperand(1).getReg()),
2501 getRegInfo()->getType(getOperand(2).getReg()));
2502}
2503
2504std::tuple<LLT, LLT, LLT, LLT> MachineInstr::getFirst4LLTs() const {
2505 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2506 getRegInfo()->getType(getOperand(1).getReg()),
2507 getRegInfo()->getType(getOperand(2).getReg()),
2508 getRegInfo()->getType(getOperand(3).getReg()));
2509}
2510
2511std::tuple<LLT, LLT, LLT, LLT, LLT> MachineInstr::getFirst5LLTs() const {
2512 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2513 getRegInfo()->getType(getOperand(1).getReg()),
2514 getRegInfo()->getType(getOperand(2).getReg()),
2515 getRegInfo()->getType(getOperand(3).getReg()),
2516 getRegInfo()->getType(getOperand(4).getReg()));
2517}
2518
2519std::tuple<Register, LLT, Register, LLT>
2521 Register Reg0 = getOperand(0).getReg();
2522 Register Reg1 = getOperand(1).getReg();
2523 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2524 getRegInfo()->getType(Reg1));
2525}
2526
2527std::tuple<Register, LLT, Register, LLT, Register, LLT>
2529 Register Reg0 = getOperand(0).getReg();
2530 Register Reg1 = getOperand(1).getReg();
2531 Register Reg2 = getOperand(2).getReg();
2532 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2533 getRegInfo()->getType(Reg1), Reg2,
2534 getRegInfo()->getType(Reg2));
2535}
2536
2537std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>
2539 Register Reg0 = getOperand(0).getReg();
2540 Register Reg1 = getOperand(1).getReg();
2541 Register Reg2 = getOperand(2).getReg();
2542 Register Reg3 = getOperand(3).getReg();
2543 return std::tuple(
2544 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2545 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3));
2546}
2547
2549 LLT>
2551 Register Reg0 = getOperand(0).getReg();
2552 Register Reg1 = getOperand(1).getReg();
2553 Register Reg2 = getOperand(2).getReg();
2554 Register Reg3 = getOperand(3).getReg();
2555 Register Reg4 = getOperand(4).getReg();
2556 return std::tuple(
2557 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2558 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3),
2559 Reg4, getRegInfo()->getType(Reg4));
2560}
2561
2564 assert(InsertBefore != nullptr && "invalid iterator");
2565 assert(InsertBefore->getParent() == this &&
2566 "iterator points to operand of other inst");
2567 if (Ops.empty())
2568 return;
2569
2570 // Do one pass to untie operands.
2572 for (const MachineOperand &MO : operands()) {
2573 if (MO.isReg() && MO.isTied()) {
2574 unsigned OpNo = getOperandNo(&MO);
2575 unsigned TiedTo = findTiedOperandIdx(OpNo);
2576 TiedOpIndices[OpNo] = TiedTo;
2577 untieRegOperand(OpNo);
2578 }
2579 }
2580
2581 unsigned OpIdx = getOperandNo(InsertBefore);
2582 unsigned NumOperands = getNumOperands();
2583 unsigned OpsToMove = NumOperands - OpIdx;
2584
2586 MovingOps.reserve(OpsToMove);
2587
2588 for (unsigned I = 0; I < OpsToMove; ++I) {
2589 MovingOps.emplace_back(getOperand(OpIdx));
2590 removeOperand(OpIdx);
2591 }
2592 for (const MachineOperand &MO : Ops)
2593 addOperand(MO);
2594 for (const MachineOperand &OpMoved : MovingOps)
2595 addOperand(OpMoved);
2596
2597 // Re-tie operands.
2598 for (auto [Tie1, Tie2] : TiedOpIndices) {
2599 if (Tie1 >= OpIdx)
2600 Tie1 += Ops.size();
2601 if (Tie2 >= OpIdx)
2602 Tie2 += Ops.size();
2603 tieOperands(Tie1, Tie2);
2604 }
2605}
2606
2607bool MachineInstr::mayFoldInlineAsmRegOp(unsigned OpId) const {
2608 assert(OpId && "expected non-zero operand id");
2609 assert(isInlineAsm() && "should only be used on inline asm");
2610
2611 if (!getOperand(OpId).isReg())
2612 return false;
2613
2614 const MachineOperand &MD = getOperand(OpId - 1);
2615 if (!MD.isImm())
2616 return false;
2617
2618 InlineAsm::Flag F(MD.getImm());
2619 if (F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind())
2620 return F.getRegMayBeFolded();
2621 return false;
2622}
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:537
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
static const unsigned MaxDepth
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 bool MemOperandsHaveAlias(const MachineFrameInfo &MFI, AAResults *AA, bool UseTBAA, const MachineMemOperand *MMOa, const MachineMemOperand *MMOb)
static void tryToGetTargetInfo(const MachineInstr &MI, const TargetRegisterInfo *&TRI, const MachineRegisterInfo *&MRI, const TargetIntrinsicInfo *&IntrinsicInfo, const TargetInstrInfo *&TII)
static const DIExpression * computeExprForSpill(const MachineInstr &MI, SmallVectorImpl< const MachineOperand * > &SpilledOperands)
Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
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)
Module.h This file contains the declarations for the Module class.
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())
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:40
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition: VPlanSLP.cpp:191
Value * RHS
Value * LHS
bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB)
A trivial helper function to check to see if the specified pointers are no-alias.
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:165
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:160
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:195
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
This is the shared class of boolean and integer constants.
Definition: Constants.h:81
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
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition: Operator.h:202
Convenience struct for specifying and reasoning about fast-math flags.
Definition: FMF.h:20
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:358
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:915
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.
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 emitError(uint64_t LocCookie, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
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:1067
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1428
unsigned getNumOperands() const
Return number of MDNode operands.
Definition: Metadata.h:1434
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:69
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:569
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:610
bool isDebugValueList() const
void bundleWithPred()
Bundle this instruction with its predecessor.
bool isPosition() const
bool isSafeToMove(AAResults *AA, bool &SawStore) const
Return true if it is safe to move this instruction.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
Definition: MachineInstr.h:974
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:707
const MachineBasicBlock * getParent() const
Definition: MachineInstr.h:346
MDNode * getMMRAMetadata() const
Helper to extract mmra.op metadata.
Definition: MachineInstr.h:865
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:874
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:897
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:409
QueryType
API for querying MachineInstr properties.
Definition: MachineInstr.h:886
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:950
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:396
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.
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 isBundle() const
bool isDebugInstr() const
unsigned getNumDebugOperands() const
Returns the total number of operands which are debug locations.
Definition: MachineInstr.h:575
unsigned getNumOperands() const
Retuns the total number of operands.
Definition: MachineInstr.h:572
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:812
mmo_iterator memoperands_end() const
Access to memory operands of the instruction.
Definition: MachineInstr.h:807
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:775
bool mayAlias(AAResults *AA, const MachineInstr &Other, bool UseTBAA) const
Returns true if this instruction's memory access aliases the memory access of Other.
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 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:477
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.
bool shouldUpdateCallSiteInfo() const
Return true if copying, moving, or erasing this instruction requires updating Call Site Info (see cop...
MDNode * getPCSections() const
Helper to extract PCSections metadata target sections.
Definition: MachineInstr.h:855
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:566
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...
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:818
void clearFlag(MIFlag Flag)
clearFlag - Clear a MI flag.
Definition: MachineInstr.h:418
std::optional< LocationSize > getFoldedRestoreSize(const TargetInstrInfo *TII) const
Return a valid size if the instruction is a folded restore instruction.
unsigned isConstantValuePHI() const
If the specified instruction is a PHI that always merges together the same virtual register,...
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:656
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:685
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.
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:800
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...
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:782
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:403
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
Definition: MachineInstr.h:498
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.
bool isCandidateForCallSiteEntry(QueryType Type=IgnoreBundle) const
Return true if this is a call instruction that may have an associated call site entry in the debug in...
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:821
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:503
MachineOperand & getDebugOperand(unsigned Index)
Definition: MachineInstr.h:588
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:699
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:481
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:845
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:579
uint32_t getFlags() const
Return the MI flags bitvector.
Definition: MachineInstr.h:391
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...
MCSymbol * getPostInstrSymbol() const
Helper to extract a post-instruction symbol if one has been added.
Definition: MachineInstr.h:833
void unbundleFromSucc()
Break bundle below this instruction.
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:638
void emitError(StringRef Msg) const
Emit an error referring to the source location of this instruction.
void setPCSections(MachineFunction &MF, MDNode *MD)
bool isKill() const
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 isVariadic(QueryType Type=IgnoreBundle) const
Return true if this instruction can have a variable number of operands.
Definition: MachineInstr.h:918
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 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.
void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr, const TargetIntrinsicInfo *IntrinsicInfo=nullptr) const
Print the MachineOperand to os.
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:5211
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
Definition: AsmWriter.cpp:902
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:472
A udiv or sdiv instruction, which can be marked as "exact", indicating that no bits are destroyed.
Definition: Operator.h:152
Instruction that can have a nneg flag (zext/uitofp).
Definition: InstrTypes.h:722
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:323
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:344
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:479
bool empty() const
Definition: SmallVector.h:94
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void reserve(size_type N)
Definition: SmallVector.h:676
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:696
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
static unsigned getNextMetaArgIdx(const MachineInstr *MI, unsigned CurIdx)
Get index of next meta operand.
Definition: StackMaps.cpp:171
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:125
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
TargetInstrInfo - Interface to description of machine instruction set.
TargetIntrinsicInfo - 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.
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:43
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:128
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:1729
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:1736
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
@ 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:1849
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:1879
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition: Hashing.h:471
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:760
static unsigned getHashValue(const MachineInstr *const &MI)