LLVM 19.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 (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1045 const MachineOperand &MO = getOperand(i);
1046 if (MO.isReg() && MO.isUse() && MO.isImplicit() && MO.getReg() == Reg)
1047 return true;
1048 }
1049 return false;
1050}
1051
1052/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of
1053/// the specific register or -1 if it is not found. It further tightens
1054/// the search criteria to a use that kills the register if isKill is true.
1056 const TargetRegisterInfo *TRI,
1057 bool isKill) const {
1058 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1059 const MachineOperand &MO = getOperand(i);
1060 if (!MO.isReg() || !MO.isUse())
1061 continue;
1062 Register MOReg = MO.getReg();
1063 if (!MOReg)
1064 continue;
1065 if (MOReg == Reg || (TRI && Reg && MOReg && TRI->regsOverlap(MOReg, Reg)))
1066 if (!isKill || MO.isKill())
1067 return i;
1068 }
1069 return -1;
1070}
1071
1072/// readsWritesVirtualRegister - Return a pair of bools (reads, writes)
1073/// indicating if this instruction reads or writes Reg. This also considers
1074/// partial defines.
1075std::pair<bool,bool>
1077 SmallVectorImpl<unsigned> *Ops) const {
1078 bool PartDef = false; // Partial redefine.
1079 bool FullDef = false; // Full define.
1080 bool Use = false;
1081
1082 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1083 const MachineOperand &MO = getOperand(i);
1084 if (!MO.isReg() || MO.getReg() != Reg)
1085 continue;
1086 if (Ops)
1087 Ops->push_back(i);
1088 if (MO.isUse())
1089 Use |= !MO.isUndef();
1090 else if (MO.getSubReg() && !MO.isUndef())
1091 // A partial def undef doesn't count as reading the register.
1092 PartDef = true;
1093 else
1094 FullDef = true;
1095 }
1096 // A partial redefine uses Reg unless there is also a full define.
1097 return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef);
1098}
1099
1100/// findRegisterDefOperandIdx() - Returns the operand index that is a def of
1101/// the specified register or -1 if it is not found. If isDead is true, defs
1102/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
1103/// also checks if there is a def of a super-register.
1105 const TargetRegisterInfo *TRI,
1106 bool isDead, bool Overlap) const {
1107 bool isPhys = Reg.isPhysical();
1108 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1109 const MachineOperand &MO = getOperand(i);
1110 // Accept regmask operands when Overlap is set.
1111 // Ignore them when looking for a specific def operand (Overlap == false).
1112 if (isPhys && Overlap && MO.isRegMask() && MO.clobbersPhysReg(Reg))
1113 return i;
1114 if (!MO.isReg() || !MO.isDef())
1115 continue;
1116 Register MOReg = MO.getReg();
1117 bool Found = (MOReg == Reg);
1118 if (!Found && TRI && isPhys && MOReg.isPhysical()) {
1119 if (Overlap)
1120 Found = TRI->regsOverlap(MOReg, Reg);
1121 else
1122 Found = TRI->isSubRegister(MOReg, Reg);
1123 }
1124 if (Found && (!isDead || MO.isDead()))
1125 return i;
1126 }
1127 return -1;
1128}
1129
1130/// findFirstPredOperandIdx() - Find the index of the first operand in the
1131/// operand list that is used to represent the predicate. It returns -1 if
1132/// none is found.
1134 // Don't call MCID.findFirstPredOperandIdx() because this variant
1135 // is sometimes called on an instruction that's not yet complete, and
1136 // so the number of operands is less than the MCID indicates. In
1137 // particular, the PTX target does this.
1138 const MCInstrDesc &MCID = getDesc();
1139 if (MCID.isPredicable()) {
1140 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1141 if (MCID.operands()[i].isPredicate())
1142 return i;
1143 }
1144
1145 return -1;
1146}
1147
1148// MachineOperand::TiedTo is 4 bits wide.
1149const unsigned TiedMax = 15;
1150
1151/// tieOperands - Mark operands at DefIdx and UseIdx as tied to each other.
1152///
1153/// Use and def operands can be tied together, indicated by a non-zero TiedTo
1154/// field. TiedTo can have these values:
1155///
1156/// 0: Operand is not tied to anything.
1157/// 1 to TiedMax-1: Tied to getOperand(TiedTo-1).
1158/// TiedMax: Tied to an operand >= TiedMax-1.
1159///
1160/// The tied def must be one of the first TiedMax operands on a normal
1161/// instruction. INLINEASM instructions allow more tied defs.
1162///
1163void MachineInstr::tieOperands(unsigned DefIdx, unsigned UseIdx) {
1164 MachineOperand &DefMO = getOperand(DefIdx);
1165 MachineOperand &UseMO = getOperand(UseIdx);
1166 assert(DefMO.isDef() && "DefIdx must be a def operand");
1167 assert(UseMO.isUse() && "UseIdx must be a use operand");
1168 assert(!DefMO.isTied() && "Def is already tied to another use");
1169 assert(!UseMO.isTied() && "Use is already tied to another def");
1170
1171 if (DefIdx < TiedMax)
1172 UseMO.TiedTo = DefIdx + 1;
1173 else {
1174 // Inline asm can use the group descriptors to find tied operands,
1175 // statepoint tied operands are trivial to match (1-1 reg def with reg use),
1176 // but on normal instruction, the tied def must be within the first TiedMax
1177 // operands.
1178 assert((isInlineAsm() || getOpcode() == TargetOpcode::STATEPOINT) &&
1179 "DefIdx out of range");
1180 UseMO.TiedTo = TiedMax;
1181 }
1182
1183 // UseIdx can be out of range, we'll search for it in findTiedOperandIdx().
1184 DefMO.TiedTo = std::min(UseIdx + 1, TiedMax);
1185}
1186
1187/// Given the index of a tied register operand, find the operand it is tied to.
1188/// Defs are tied to uses and vice versa. Returns the index of the tied operand
1189/// which must exist.
1190unsigned MachineInstr::findTiedOperandIdx(unsigned OpIdx) const {
1191 const MachineOperand &MO = getOperand(OpIdx);
1192 assert(MO.isTied() && "Operand isn't tied");
1193
1194 // Normally TiedTo is in range.
1195 if (MO.TiedTo < TiedMax)
1196 return MO.TiedTo - 1;
1197
1198 // Uses on normal instructions can be out of range.
1199 if (!isInlineAsm() && getOpcode() != TargetOpcode::STATEPOINT) {
1200 // Normal tied defs must be in the 0..TiedMax-1 range.
1201 if (MO.isUse())
1202 return TiedMax - 1;
1203 // MO is a def. Search for the tied use.
1204 for (unsigned i = TiedMax - 1, e = getNumOperands(); i != e; ++i) {
1205 const MachineOperand &UseMO = getOperand(i);
1206 if (UseMO.isReg() && UseMO.isUse() && UseMO.TiedTo == OpIdx + 1)
1207 return i;
1208 }
1209 llvm_unreachable("Can't find tied use");
1210 }
1211
1212 if (getOpcode() == TargetOpcode::STATEPOINT) {
1213 // In STATEPOINT defs correspond 1-1 to GC pointer operands passed
1214 // on registers.
1215 StatepointOpers SO(this);
1216 unsigned CurUseIdx = SO.getFirstGCPtrIdx();
1217 assert(CurUseIdx != -1U && "only gc pointer statepoint operands can be tied");
1218 unsigned NumDefs = getNumDefs();
1219 for (unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {
1220 while (!getOperand(CurUseIdx).isReg())
1221 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1222 if (OpIdx == CurDefIdx)
1223 return CurUseIdx;
1224 if (OpIdx == CurUseIdx)
1225 return CurDefIdx;
1226 CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);
1227 }
1228 llvm_unreachable("Can't find tied use");
1229 }
1230
1231 // Now deal with inline asm by parsing the operand group descriptor flags.
1232 // Find the beginning of each operand group.
1233 SmallVector<unsigned, 8> GroupIdx;
1234 unsigned OpIdxGroup = ~0u;
1235 unsigned NumOps;
1236 for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;
1237 i += NumOps) {
1238 const MachineOperand &FlagMO = getOperand(i);
1239 assert(FlagMO.isImm() && "Invalid tied operand on inline asm");
1240 unsigned CurGroup = GroupIdx.size();
1241 GroupIdx.push_back(i);
1242 const InlineAsm::Flag F(FlagMO.getImm());
1243 NumOps = 1 + F.getNumOperandRegisters();
1244 // OpIdx belongs to this operand group.
1245 if (OpIdx > i && OpIdx < i + NumOps)
1246 OpIdxGroup = CurGroup;
1247 unsigned TiedGroup;
1248 if (!F.isUseOperandTiedToDef(TiedGroup))
1249 continue;
1250 // Operands in this group are tied to operands in TiedGroup which must be
1251 // earlier. Find the number of operands between the two groups.
1252 unsigned Delta = i - GroupIdx[TiedGroup];
1253
1254 // OpIdx is a use tied to TiedGroup.
1255 if (OpIdxGroup == CurGroup)
1256 return OpIdx - Delta;
1257
1258 // OpIdx is a def tied to this use group.
1259 if (OpIdxGroup == TiedGroup)
1260 return OpIdx + Delta;
1261 }
1262 llvm_unreachable("Invalid tied operand on inline asm");
1263}
1264
1265/// clearKillInfo - Clears kill flags on all operands.
1266///
1268 for (MachineOperand &MO : operands()) {
1269 if (MO.isReg() && MO.isUse())
1270 MO.setIsKill(false);
1271 }
1272}
1273
1275 unsigned SubIdx,
1276 const TargetRegisterInfo &RegInfo) {
1277 if (ToReg.isPhysical()) {
1278 if (SubIdx)
1279 ToReg = RegInfo.getSubReg(ToReg, SubIdx);
1280 for (MachineOperand &MO : operands()) {
1281 if (!MO.isReg() || MO.getReg() != FromReg)
1282 continue;
1283 MO.substPhysReg(ToReg, RegInfo);
1284 }
1285 } else {
1286 for (MachineOperand &MO : operands()) {
1287 if (!MO.isReg() || MO.getReg() != FromReg)
1288 continue;
1289 MO.substVirtReg(ToReg, SubIdx, RegInfo);
1290 }
1291 }
1292}
1293
1294/// isSafeToMove - Return true if it is safe to move this instruction. If
1295/// SawStore is set to true, it means that there is a store (or call) between
1296/// the instruction's location and its intended destination.
1297bool MachineInstr::isSafeToMove(AAResults *AA, bool &SawStore) const {
1298 // Ignore stuff that we obviously can't move.
1299 //
1300 // Treat volatile loads as stores. This is not strictly necessary for
1301 // volatiles, but it is required for atomic loads. It is not allowed to move
1302 // a load across an atomic load with Ordering > Monotonic.
1303 if (mayStore() || isCall() || isPHI() ||
1304 (mayLoad() && hasOrderedMemoryRef())) {
1305 SawStore = true;
1306 return false;
1307 }
1308
1309 if (isPosition() || isDebugInstr() || isTerminator() ||
1312 return false;
1313
1314 // See if this instruction does a load. If so, we have to guarantee that the
1315 // loaded value doesn't change between the load and the its intended
1316 // destination. The check for isInvariantLoad gives the target the chance to
1317 // classify the load as always returning a constant, e.g. a constant pool
1318 // load.
1320 // Otherwise, this is a real load. If there is a store between the load and
1321 // end of block, we can't move it.
1322 return !SawStore;
1323
1324 return true;
1325}
1326
1328 bool UseTBAA, const MachineMemOperand *MMOa,
1329 const MachineMemOperand *MMOb) {
1330 // The following interface to AA is fashioned after DAGCombiner::isAlias and
1331 // operates with MachineMemOperand offset with some important assumptions:
1332 // - LLVM fundamentally assumes flat address spaces.
1333 // - MachineOperand offset can *only* result from legalization and cannot
1334 // affect queries other than the trivial case of overlap checking.
1335 // - These offsets never wrap and never step outside of allocated objects.
1336 // - There should never be any negative offsets here.
1337 //
1338 // FIXME: Modify API to hide this math from "user"
1339 // Even before we go to AA we can reason locally about some memory objects. It
1340 // can save compile time, and possibly catch some corner cases not currently
1341 // covered.
1342
1343 int64_t OffsetA = MMOa->getOffset();
1344 int64_t OffsetB = MMOb->getOffset();
1345 int64_t MinOffset = std::min(OffsetA, OffsetB);
1346
1347 LocationSize WidthA = MMOa->getSize();
1348 LocationSize WidthB = MMOb->getSize();
1349 bool KnownWidthA = WidthA.hasValue();
1350 bool KnownWidthB = WidthB.hasValue();
1351 bool BothMMONonScalable = !WidthA.isScalable() && !WidthB.isScalable();
1352
1353 const Value *ValA = MMOa->getValue();
1354 const Value *ValB = MMOb->getValue();
1355 bool SameVal = (ValA && ValB && (ValA == ValB));
1356 if (!SameVal) {
1357 const PseudoSourceValue *PSVa = MMOa->getPseudoValue();
1358 const PseudoSourceValue *PSVb = MMOb->getPseudoValue();
1359 if (PSVa && ValB && !PSVa->mayAlias(&MFI))
1360 return false;
1361 if (PSVb && ValA && !PSVb->mayAlias(&MFI))
1362 return false;
1363 if (PSVa && PSVb && (PSVa == PSVb))
1364 SameVal = true;
1365 }
1366
1367 if (SameVal && BothMMONonScalable) {
1368 if (!KnownWidthA || !KnownWidthB)
1369 return true;
1370 int64_t MaxOffset = std::max(OffsetA, OffsetB);
1371 int64_t LowWidth = (MinOffset == OffsetA)
1372 ? WidthA.getValue().getKnownMinValue()
1373 : WidthB.getValue().getKnownMinValue();
1374 return (MinOffset + LowWidth > MaxOffset);
1375 }
1376
1377 if (!AA)
1378 return true;
1379
1380 if (!ValA || !ValB)
1381 return true;
1382
1383 assert((OffsetA >= 0) && "Negative MachineMemOperand offset");
1384 assert((OffsetB >= 0) && "Negative MachineMemOperand offset");
1385
1386 // If Scalable Location Size has non-zero offset, Width + Offset does not work
1387 // at the moment
1388 if ((WidthA.isScalable() && OffsetA > 0) ||
1389 (WidthB.isScalable() && OffsetB > 0))
1390 return true;
1391
1392 int64_t OverlapA =
1393 KnownWidthA ? WidthA.getValue().getKnownMinValue() + OffsetA - MinOffset
1395 int64_t OverlapB =
1396 KnownWidthB ? WidthB.getValue().getKnownMinValue() + OffsetB - MinOffset
1398
1399 LocationSize LocA = (WidthA.isScalable() || !KnownWidthA)
1400 ? WidthA
1401 : LocationSize::precise(OverlapA);
1402 LocationSize LocB = (WidthB.isScalable() || !KnownWidthB)
1403 ? WidthB
1404 : LocationSize::precise(OverlapB);
1405
1406 return !AA->isNoAlias(
1407 MemoryLocation(ValA, LocA, UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
1408 MemoryLocation(ValB, LocB, UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
1409}
1410
1412 bool UseTBAA) const {
1413 const MachineFunction *MF = getMF();
1415 const MachineFrameInfo &MFI = MF->getFrameInfo();
1416
1417 // Exclude call instruction which may alter the memory but can not be handled
1418 // by this function.
1419 if (isCall() || Other.isCall())
1420 return true;
1421
1422 // If neither instruction stores to memory, they can't alias in any
1423 // meaningful way, even if they read from the same address.
1424 if (!mayStore() && !Other.mayStore())
1425 return false;
1426
1427 // Both instructions must be memory operations to be able to alias.
1428 if (!mayLoadOrStore() || !Other.mayLoadOrStore())
1429 return false;
1430
1431 // Let the target decide if memory accesses cannot possibly overlap.
1433 return false;
1434
1435 // Memory operations without memory operands may access anything. Be
1436 // conservative and assume `MayAlias`.
1437 if (memoperands_empty() || Other.memoperands_empty())
1438 return true;
1439
1440 // Skip if there are too many memory operands.
1441 auto NumChecks = getNumMemOperands() * Other.getNumMemOperands();
1442 if (NumChecks > TII->getMemOperandAACheckLimit())
1443 return true;
1444
1445 // Check each pair of memory operands from both instructions, which can't
1446 // alias only if all pairs won't alias.
1447 for (auto *MMOa : memoperands())
1448 for (auto *MMOb : Other.memoperands())
1449 if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb))
1450 return true;
1451
1452 return false;
1453}
1454
1455/// hasOrderedMemoryRef - Return true if this instruction may have an ordered
1456/// or volatile memory reference, or if the information describing the memory
1457/// reference is not available. Return false if it is known to have no ordered
1458/// memory references.
1460 // An instruction known never to access memory won't have a volatile access.
1461 if (!mayStore() &&
1462 !mayLoad() &&
1463 !isCall() &&
1465 return false;
1466
1467 // Otherwise, if the instruction has no memory reference information,
1468 // conservatively assume it wasn't preserved.
1469 if (memoperands_empty())
1470 return true;
1471
1472 // Check if any of our memory operands are ordered.
1473 return llvm::any_of(memoperands(), [](const MachineMemOperand *MMO) {
1474 return !MMO->isUnordered();
1475 });
1476}
1477
1478/// isDereferenceableInvariantLoad - Return true if this instruction will never
1479/// trap and is loading from a location whose value is invariant across a run of
1480/// this function.
1482 // If the instruction doesn't load at all, it isn't an invariant load.
1483 if (!mayLoad())
1484 return false;
1485
1486 // If the instruction has lost its memoperands, conservatively assume that
1487 // it may not be an invariant load.
1488 if (memoperands_empty())
1489 return false;
1490
1491 const MachineFrameInfo &MFI = getParent()->getParent()->getFrameInfo();
1492
1493 for (MachineMemOperand *MMO : memoperands()) {
1494 if (!MMO->isUnordered())
1495 // If the memory operand has ordering side effects, we can't move the
1496 // instruction. Such an instruction is technically an invariant load,
1497 // but the caller code would need updated to expect that.
1498 return false;
1499 if (MMO->isStore()) return false;
1500 if (MMO->isInvariant() && MMO->isDereferenceable())
1501 continue;
1502
1503 // A load from a constant PseudoSourceValue is invariant.
1504 if (const PseudoSourceValue *PSV = MMO->getPseudoValue()) {
1505 if (PSV->isConstant(&MFI))
1506 continue;
1507 }
1508
1509 // Otherwise assume conservatively.
1510 return false;
1511 }
1512
1513 // Everything checks out.
1514 return true;
1515}
1516
1517/// isConstantValuePHI - If the specified instruction is a PHI that always
1518/// merges together the same virtual register, return the register, otherwise
1519/// return 0.
1521 if (!isPHI())
1522 return 0;
1523 assert(getNumOperands() >= 3 &&
1524 "It's illegal to have a PHI without source operands");
1525
1526 Register Reg = getOperand(1).getReg();
1527 for (unsigned i = 3, e = getNumOperands(); i < e; i += 2)
1528 if (getOperand(i).getReg() != Reg)
1529 return 0;
1530 return Reg;
1531}
1532
1535 return true;
1536 if (isInlineAsm()) {
1537 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1538 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1539 return true;
1540 }
1541
1542 return false;
1543}
1544
1546 return mayStore() || isCall() ||
1548}
1549
1550/// allDefsAreDead - Return true if all the defs of this instruction are dead.
1551///
1553 for (const MachineOperand &MO : operands()) {
1554 if (!MO.isReg() || MO.isUse())
1555 continue;
1556 if (!MO.isDead())
1557 return false;
1558 }
1559 return true;
1560}
1561
1563 for (const MachineOperand &MO : implicit_operands()) {
1564 if (!MO.isReg() || MO.isUse())
1565 continue;
1566 if (!MO.isDead())
1567 return false;
1568 }
1569 return true;
1570}
1571
1572/// copyImplicitOps - Copy implicit register operands from specified
1573/// instruction to this instruction.
1575 const MachineInstr &MI) {
1576 for (const MachineOperand &MO :
1577 llvm::drop_begin(MI.operands(), MI.getDesc().getNumOperands()))
1578 if ((MO.isReg() && MO.isImplicit()) || MO.isRegMask())
1579 addOperand(MF, MO);
1580}
1581
1583 const MCInstrDesc &MCID = getDesc();
1584 if (MCID.Opcode == TargetOpcode::STATEPOINT)
1585 return true;
1586 for (unsigned I = 0, E = getNumOperands(); I < E; ++I) {
1587 const auto &Operand = getOperand(I);
1588 if (!Operand.isReg() || Operand.isDef())
1589 // Ignore the defined registers as MCID marks only the uses as tied.
1590 continue;
1591 int ExpectedTiedIdx = MCID.getOperandConstraint(I, MCOI::TIED_TO);
1592 int TiedIdx = Operand.isTied() ? int(findTiedOperandIdx(I)) : -1;
1593 if (ExpectedTiedIdx != TiedIdx)
1594 return true;
1595 }
1596 return false;
1597}
1598
1600 const MachineRegisterInfo &MRI) const {
1601 const MachineOperand &Op = getOperand(OpIdx);
1602 if (!Op.isReg())
1603 return LLT{};
1604
1605 if (isVariadic() || OpIdx >= getNumExplicitOperands())
1606 return MRI.getType(Op.getReg());
1607
1608 auto &OpInfo = getDesc().operands()[OpIdx];
1609 if (!OpInfo.isGenericType())
1610 return MRI.getType(Op.getReg());
1611
1612 if (PrintedTypes[OpInfo.getGenericTypeIndex()])
1613 return LLT{};
1614
1615 LLT TypeToPrint = MRI.getType(Op.getReg());
1616 // Don't mark the type index printed if it wasn't actually printed: maybe
1617 // another operand with the same type index has an actual type attached:
1618 if (TypeToPrint.isValid())
1619 PrintedTypes.set(OpInfo.getGenericTypeIndex());
1620 return TypeToPrint;
1621}
1622
1623#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1625 dbgs() << " ";
1626 print(dbgs());
1627}
1628
1629LLVM_DUMP_METHOD void MachineInstr::dumprImpl(
1630 const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
1631 SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const {
1632 if (Depth >= MaxDepth)
1633 return;
1634 if (!AlreadySeenInstrs.insert(this).second)
1635 return;
1636 // PadToColumn always inserts at least one space.
1637 // Don't mess up the alignment if we don't want any space.
1638 if (Depth)
1639 fdbgs().PadToColumn(Depth * 2);
1640 print(fdbgs());
1641 for (const MachineOperand &MO : operands()) {
1642 if (!MO.isReg() || MO.isDef())
1643 continue;
1644 Register Reg = MO.getReg();
1645 if (Reg.isPhysical())
1646 continue;
1647 const MachineInstr *NewMI = MRI.getUniqueVRegDef(Reg);
1648 if (NewMI == nullptr)
1649 continue;
1650 NewMI->dumprImpl(MRI, Depth + 1, MaxDepth, AlreadySeenInstrs);
1651 }
1652}
1653
1655 unsigned MaxDepth) const {
1656 SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;
1657 dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
1658}
1659#endif
1660
1661void MachineInstr::print(raw_ostream &OS, bool IsStandalone, bool SkipOpers,
1662 bool SkipDebugLoc, bool AddNewLine,
1663 const TargetInstrInfo *TII) const {
1664 const Module *M = nullptr;
1665 const Function *F = nullptr;
1666 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
1667 F = &MF->getFunction();
1668 M = F->getParent();
1669 if (!TII)
1670 TII = MF->getSubtarget().getInstrInfo();
1671 }
1672
1673 ModuleSlotTracker MST(M);
1674 if (F)
1675 MST.incorporateFunction(*F);
1676 print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine, TII);
1677}
1678
1680 bool IsStandalone, bool SkipOpers, bool SkipDebugLoc,
1681 bool AddNewLine, const TargetInstrInfo *TII) const {
1682 // We can be a bit tidier if we know the MachineFunction.
1683 const TargetRegisterInfo *TRI = nullptr;
1684 const MachineRegisterInfo *MRI = nullptr;
1685 const TargetIntrinsicInfo *IntrinsicInfo = nullptr;
1686 tryToGetTargetInfo(*this, TRI, MRI, IntrinsicInfo, TII);
1687
1688 if (isCFIInstruction())
1689 assert(getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
1690
1691 SmallBitVector PrintedTypes(8);
1692 bool ShouldPrintRegisterTies = IsStandalone || hasComplexRegisterTies();
1693 auto getTiedOperandIdx = [&](unsigned OpIdx) {
1694 if (!ShouldPrintRegisterTies)
1695 return 0U;
1696 const MachineOperand &MO = getOperand(OpIdx);
1697 if (MO.isReg() && MO.isTied() && !MO.isDef())
1698 return findTiedOperandIdx(OpIdx);
1699 return 0U;
1700 };
1701 unsigned StartOp = 0;
1702 unsigned e = getNumOperands();
1703
1704 // Print explicitly defined operands on the left of an assignment syntax.
1705 while (StartOp < e) {
1706 const MachineOperand &MO = getOperand(StartOp);
1707 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
1708 break;
1709
1710 if (StartOp != 0)
1711 OS << ", ";
1712
1713 LLT TypeToPrint = MRI ? getTypeToPrint(StartOp, PrintedTypes, *MRI) : LLT{};
1714 unsigned TiedOperandIdx = getTiedOperandIdx(StartOp);
1715 MO.print(OS, MST, TypeToPrint, StartOp, /*PrintDef=*/false, IsStandalone,
1716 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1717 ++StartOp;
1718 }
1719
1720 if (StartOp != 0)
1721 OS << " = ";
1722
1724 OS << "frame-setup ";
1726 OS << "frame-destroy ";
1728 OS << "nnan ";
1730 OS << "ninf ";
1732 OS << "nsz ";
1734 OS << "arcp ";
1736 OS << "contract ";
1738 OS << "afn ";
1740 OS << "reassoc ";
1742 OS << "nuw ";
1744 OS << "nsw ";
1746 OS << "exact ";
1748 OS << "nofpexcept ";
1750 OS << "nomerge ";
1752 OS << "nneg ";
1754 OS << "disjoint ";
1755
1756 // Print the opcode name.
1757 if (TII)
1758 OS << TII->getName(getOpcode());
1759 else
1760 OS << "UNKNOWN";
1761
1762 if (SkipOpers)
1763 return;
1764
1765 // Print the rest of the operands.
1766 bool FirstOp = true;
1767 unsigned AsmDescOp = ~0u;
1768 unsigned AsmOpCount = 0;
1769
1771 // Print asm string.
1772 OS << " ";
1773 const unsigned OpIdx = InlineAsm::MIOp_AsmString;
1774 LLT TypeToPrint = MRI ? getTypeToPrint(OpIdx, PrintedTypes, *MRI) : LLT{};
1775 unsigned TiedOperandIdx = getTiedOperandIdx(OpIdx);
1776 getOperand(OpIdx).print(OS, MST, TypeToPrint, OpIdx, /*PrintDef=*/true, IsStandalone,
1777 ShouldPrintRegisterTies, TiedOperandIdx, TRI,
1778 IntrinsicInfo);
1779
1780 // Print HasSideEffects, MayLoad, MayStore, IsAlignStack
1781 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
1782 if (ExtraInfo & InlineAsm::Extra_HasSideEffects)
1783 OS << " [sideeffect]";
1784 if (ExtraInfo & InlineAsm::Extra_MayLoad)
1785 OS << " [mayload]";
1786 if (ExtraInfo & InlineAsm::Extra_MayStore)
1787 OS << " [maystore]";
1788 if (ExtraInfo & InlineAsm::Extra_IsConvergent)
1789 OS << " [isconvergent]";
1790 if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
1791 OS << " [alignstack]";
1793 OS << " [attdialect]";
1795 OS << " [inteldialect]";
1796
1797 StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;
1798 FirstOp = false;
1799 }
1800
1801 for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
1802 const MachineOperand &MO = getOperand(i);
1803
1804 if (FirstOp) FirstOp = false; else OS << ",";
1805 OS << " ";
1806
1807 if (isDebugValueLike() && MO.isMetadata()) {
1808 // Pretty print DBG_VALUE* instructions.
1809 auto *DIV = dyn_cast<DILocalVariable>(MO.getMetadata());
1810 if (DIV && !DIV->getName().empty())
1811 OS << "!\"" << DIV->getName() << '\"';
1812 else {
1813 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1814 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1815 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1816 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1817 }
1818 } else if (isDebugLabel() && MO.isMetadata()) {
1819 // Pretty print DBG_LABEL instructions.
1820 auto *DIL = dyn_cast<DILabel>(MO.getMetadata());
1821 if (DIL && !DIL->getName().empty())
1822 OS << "\"" << DIL->getName() << '\"';
1823 else {
1824 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1825 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1826 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1827 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1828 }
1829 } else if (i == AsmDescOp && MO.isImm()) {
1830 // Pretty print the inline asm operand descriptor.
1831 OS << '$' << AsmOpCount++;
1832 unsigned Flag = MO.getImm();
1833 const InlineAsm::Flag F(Flag);
1834 OS << ":[";
1835 OS << F.getKindName();
1836
1837 unsigned RCID;
1838 if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {
1839 if (TRI) {
1840 OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));
1841 } else
1842 OS << ":RC" << RCID;
1843 }
1844
1845 if (F.isMemKind()) {
1846 const InlineAsm::ConstraintCode MCID = F.getMemoryConstraintID();
1847 OS << ":" << InlineAsm::getMemConstraintName(MCID);
1848 }
1849
1850 unsigned TiedTo;
1851 if (F.isUseOperandTiedToDef(TiedTo))
1852 OS << " tiedto:$" << TiedTo;
1853
1854 if ((F.isRegDefKind() || F.isRegDefEarlyClobberKind() ||
1855 F.isRegUseKind()) &&
1856 F.getRegMayBeFolded()) {
1857 OS << " foldable";
1858 }
1859
1860 OS << ']';
1861
1862 // Compute the index of the next operand descriptor.
1863 AsmDescOp += 1 + F.getNumOperandRegisters();
1864 } else {
1865 LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
1866 unsigned TiedOperandIdx = getTiedOperandIdx(i);
1867 if (MO.isImm() && isOperandSubregIdx(i))
1869 else
1870 MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,
1871 ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
1872 }
1873 }
1874
1875 // Print any optional symbols attached to this instruction as-if they were
1876 // operands.
1877 if (MCSymbol *PreInstrSymbol = getPreInstrSymbol()) {
1878 if (!FirstOp) {
1879 FirstOp = false;
1880 OS << ',';
1881 }
1882 OS << " pre-instr-symbol ";
1883 MachineOperand::printSymbol(OS, *PreInstrSymbol);
1884 }
1885 if (MCSymbol *PostInstrSymbol = getPostInstrSymbol()) {
1886 if (!FirstOp) {
1887 FirstOp = false;
1888 OS << ',';
1889 }
1890 OS << " post-instr-symbol ";
1891 MachineOperand::printSymbol(OS, *PostInstrSymbol);
1892 }
1893 if (MDNode *HeapAllocMarker = getHeapAllocMarker()) {
1894 if (!FirstOp) {
1895 FirstOp = false;
1896 OS << ',';
1897 }
1898 OS << " heap-alloc-marker ";
1899 HeapAllocMarker->printAsOperand(OS, MST);
1900 }
1901 if (MDNode *PCSections = getPCSections()) {
1902 if (!FirstOp) {
1903 FirstOp = false;
1904 OS << ',';
1905 }
1906 OS << " pcsections ";
1907 PCSections->printAsOperand(OS, MST);
1908 }
1909 if (MDNode *MMRA = getMMRAMetadata()) {
1910 if (!FirstOp) {
1911 FirstOp = false;
1912 OS << ',';
1913 }
1914 OS << " mmra ";
1915 MMRA->printAsOperand(OS, MST);
1916 }
1917 if (uint32_t CFIType = getCFIType()) {
1918 if (!FirstOp)
1919 OS << ',';
1920 OS << " cfi-type " << CFIType;
1921 }
1922
1923 if (DebugInstrNum) {
1924 if (!FirstOp)
1925 OS << ",";
1926 OS << " debug-instr-number " << DebugInstrNum;
1927 }
1928
1929 if (!SkipDebugLoc) {
1930 if (const DebugLoc &DL = getDebugLoc()) {
1931 if (!FirstOp)
1932 OS << ',';
1933 OS << " debug-location ";
1934 DL->printAsOperand(OS, MST);
1935 }
1936 }
1937
1938 if (!memoperands_empty()) {
1940 const LLVMContext *Context = nullptr;
1941 std::unique_ptr<LLVMContext> CtxPtr;
1942 const MachineFrameInfo *MFI = nullptr;
1943 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
1944 MFI = &MF->getFrameInfo();
1945 Context = &MF->getFunction().getContext();
1946 } else {
1947 CtxPtr = std::make_unique<LLVMContext>();
1948 Context = CtxPtr.get();
1949 }
1950
1951 OS << " :: ";
1952 bool NeedComma = false;
1953 for (const MachineMemOperand *Op : memoperands()) {
1954 if (NeedComma)
1955 OS << ", ";
1956 Op->print(OS, MST, SSNs, *Context, MFI, TII);
1957 NeedComma = true;
1958 }
1959 }
1960
1961 if (SkipDebugLoc)
1962 return;
1963
1964 bool HaveSemi = false;
1965
1966 // Print debug location information.
1967 if (const DebugLoc &DL = getDebugLoc()) {
1968 if (!HaveSemi) {
1969 OS << ';';
1970 HaveSemi = true;
1971 }
1972 OS << ' ';
1973 DL.print(OS);
1974 }
1975
1976 // Print extra comments for DEBUG_VALUE and friends if they are well-formed.
1977 if ((isNonListDebugValue() && getNumOperands() >= 4) ||
1978 (isDebugValueList() && getNumOperands() >= 2) ||
1979 (isDebugRef() && getNumOperands() >= 3)) {
1980 if (getDebugVariableOp().isMetadata()) {
1981 if (!HaveSemi) {
1982 OS << ";";
1983 HaveSemi = true;
1984 }
1985 auto *DV = getDebugVariable();
1986 OS << " line no:" << DV->getLine();
1988 OS << " indirect";
1989 }
1990 }
1991 // TODO: DBG_LABEL
1992
1993 if (AddNewLine)
1994 OS << '\n';
1995}
1996
1998 const TargetRegisterInfo *RegInfo,
1999 bool AddIfNotFound) {
2000 bool isPhysReg = IncomingReg.isPhysical();
2001 bool hasAliases = isPhysReg &&
2002 MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();
2003 bool Found = false;
2005 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2006 MachineOperand &MO = getOperand(i);
2007 if (!MO.isReg() || !MO.isUse() || MO.isUndef())
2008 continue;
2009
2010 // DEBUG_VALUE nodes do not contribute to code generation and should
2011 // always be ignored. Failure to do so may result in trying to modify
2012 // KILL flags on DEBUG_VALUE nodes.
2013 if (MO.isDebug())
2014 continue;
2015
2016 Register Reg = MO.getReg();
2017 if (!Reg)
2018 continue;
2019
2020 if (Reg == IncomingReg) {
2021 if (!Found) {
2022 if (MO.isKill())
2023 // The register is already marked kill.
2024 return true;
2025 if (isPhysReg && isRegTiedToDefOperand(i))
2026 // Two-address uses of physregs must not be marked kill.
2027 return true;
2028 MO.setIsKill();
2029 Found = true;
2030 }
2031 } else if (hasAliases && MO.isKill() && Reg.isPhysical()) {
2032 // A super-register kill already exists.
2033 if (RegInfo->isSuperRegister(IncomingReg, Reg))
2034 return true;
2035 if (RegInfo->isSubRegister(IncomingReg, Reg))
2036 DeadOps.push_back(i);
2037 }
2038 }
2039
2040 // Trim unneeded kill operands.
2041 while (!DeadOps.empty()) {
2042 unsigned OpIdx = DeadOps.back();
2043 if (getOperand(OpIdx).isImplicit() &&
2044 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2045 removeOperand(OpIdx);
2046 else
2047 getOperand(OpIdx).setIsKill(false);
2048 DeadOps.pop_back();
2049 }
2050
2051 // If not found, this means an alias of one of the operands is killed. Add a
2052 // new implicit operand if required.
2053 if (!Found && AddIfNotFound) {
2055 false /*IsDef*/,
2056 true /*IsImp*/,
2057 true /*IsKill*/));
2058 return true;
2059 }
2060 return Found;
2061}
2062
2064 const TargetRegisterInfo *RegInfo) {
2065 if (!Reg.isPhysical())
2066 RegInfo = nullptr;
2067 for (MachineOperand &MO : operands()) {
2068 if (!MO.isReg() || !MO.isUse() || !MO.isKill())
2069 continue;
2070 Register OpReg = MO.getReg();
2071 if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)
2072 MO.setIsKill(false);
2073 }
2074}
2075
2077 const TargetRegisterInfo *RegInfo,
2078 bool AddIfNotFound) {
2079 bool isPhysReg = Reg.isPhysical();
2080 bool hasAliases = isPhysReg &&
2081 MCRegAliasIterator(Reg, RegInfo, false).isValid();
2082 bool Found = false;
2084 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2085 MachineOperand &MO = getOperand(i);
2086 if (!MO.isReg() || !MO.isDef())
2087 continue;
2088 Register MOReg = MO.getReg();
2089 if (!MOReg)
2090 continue;
2091
2092 if (MOReg == Reg) {
2093 MO.setIsDead();
2094 Found = true;
2095 } else if (hasAliases && MO.isDead() && MOReg.isPhysical()) {
2096 // There exists a super-register that's marked dead.
2097 if (RegInfo->isSuperRegister(Reg, MOReg))
2098 return true;
2099 if (RegInfo->isSubRegister(Reg, MOReg))
2100 DeadOps.push_back(i);
2101 }
2102 }
2103
2104 // Trim unneeded dead operands.
2105 while (!DeadOps.empty()) {
2106 unsigned OpIdx = DeadOps.back();
2107 if (getOperand(OpIdx).isImplicit() &&
2108 (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))
2109 removeOperand(OpIdx);
2110 else
2111 getOperand(OpIdx).setIsDead(false);
2112 DeadOps.pop_back();
2113 }
2114
2115 // If not found, this means an alias of one of the operands is dead. Add a
2116 // new implicit operand if required.
2117 if (Found || !AddIfNotFound)
2118 return Found;
2119
2121 true /*IsDef*/,
2122 true /*IsImp*/,
2123 false /*IsKill*/,
2124 true /*IsDead*/));
2125 return true;
2126}
2127
2129 for (MachineOperand &MO : operands()) {
2130 if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg)
2131 continue;
2132 MO.setIsDead(false);
2133 }
2134}
2135
2137 for (MachineOperand &MO : operands()) {
2138 if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg || MO.getSubReg() == 0)
2139 continue;
2140 MO.setIsUndef(IsUndef);
2141 }
2142}
2143
2145 const TargetRegisterInfo *RegInfo) {
2146 if (Reg.isPhysical()) {
2147 MachineOperand *MO = findRegisterDefOperand(Reg, RegInfo, false, false);
2148 if (MO)
2149 return;
2150 } else {
2151 for (const MachineOperand &MO : operands()) {
2152 if (MO.isReg() && MO.getReg() == Reg && MO.isDef() &&
2153 MO.getSubReg() == 0)
2154 return;
2155 }
2156 }
2158 true /*IsDef*/,
2159 true /*IsImp*/));
2160}
2161
2163 const TargetRegisterInfo &TRI) {
2164 bool HasRegMask = false;
2165 for (MachineOperand &MO : operands()) {
2166 if (MO.isRegMask()) {
2167 HasRegMask = true;
2168 continue;
2169 }
2170 if (!MO.isReg() || !MO.isDef()) continue;
2171 Register Reg = MO.getReg();
2172 if (!Reg.isPhysical())
2173 continue;
2174 // If there are no uses, including partial uses, the def is dead.
2175 if (llvm::none_of(UsedRegs,
2176 [&](MCRegister Use) { return TRI.regsOverlap(Use, Reg); }))
2177 MO.setIsDead();
2178 }
2179
2180 // This is a call with a register mask operand.
2181 // Mask clobbers are always dead, so add defs for the non-dead defines.
2182 if (HasRegMask)
2183 for (const Register &UsedReg : UsedRegs)
2184 addRegisterDefined(UsedReg, &TRI);
2185}
2186
2187unsigned
2189 // Build up a buffer of hash code components.
2190 SmallVector<size_t, 16> HashComponents;
2191 HashComponents.reserve(MI->getNumOperands() + 1);
2192 HashComponents.push_back(MI->getOpcode());
2193 for (const MachineOperand &MO : MI->operands()) {
2194 if (MO.isReg() && MO.isDef() && MO.getReg().isVirtual())
2195 continue; // Skip virtual register defs.
2196
2197 HashComponents.push_back(hash_value(MO));
2198 }
2199 return hash_combine_range(HashComponents.begin(), HashComponents.end());
2200}
2201
2203 // Find the source location cookie.
2204 uint64_t LocCookie = 0;
2205 const MDNode *LocMD = nullptr;
2206 for (unsigned i = getNumOperands(); i != 0; --i) {
2207 if (getOperand(i-1).isMetadata() &&
2208 (LocMD = getOperand(i-1).getMetadata()) &&
2209 LocMD->getNumOperands() != 0) {
2210 if (const ConstantInt *CI =
2211 mdconst::dyn_extract<ConstantInt>(LocMD->getOperand(0))) {
2212 LocCookie = CI->getZExtValue();
2213 break;
2214 }
2215 }
2216 }
2217
2218 if (const MachineBasicBlock *MBB = getParent())
2219 if (const MachineFunction *MF = MBB->getParent())
2220 return MF->getMMI().getModule()->getContext().emitError(LocCookie, Msg);
2221 report_fatal_error(Msg);
2222}
2223
2225 const MCInstrDesc &MCID, bool IsIndirect,
2226 Register Reg, const MDNode *Variable,
2227 const MDNode *Expr) {
2228 assert(isa<DILocalVariable>(Variable) && "not a variable");
2229 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2230 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2231 "Expected inlined-at fields to agree");
2232 auto MIB = BuildMI(MF, DL, MCID).addReg(Reg);
2233 if (IsIndirect)
2234 MIB.addImm(0U);
2235 else
2236 MIB.addReg(0U);
2237 return MIB.addMetadata(Variable).addMetadata(Expr);
2238}
2239
2241 const MCInstrDesc &MCID, bool IsIndirect,
2242 ArrayRef<MachineOperand> DebugOps,
2243 const MDNode *Variable, const MDNode *Expr) {
2244 assert(isa<DILocalVariable>(Variable) && "not a variable");
2245 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
2246 assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
2247 "Expected inlined-at fields to agree");
2248 if (MCID.Opcode == TargetOpcode::DBG_VALUE) {
2249 assert(DebugOps.size() == 1 &&
2250 "DBG_VALUE must contain exactly one debug operand");
2251 MachineOperand DebugOp = DebugOps[0];
2252 if (DebugOp.isReg())
2253 return BuildMI(MF, DL, MCID, IsIndirect, DebugOp.getReg(), Variable,
2254 Expr);
2255
2256 auto MIB = BuildMI(MF, DL, MCID).add(DebugOp);
2257 if (IsIndirect)
2258 MIB.addImm(0U);
2259 else
2260 MIB.addReg(0U);
2261 return MIB.addMetadata(Variable).addMetadata(Expr);
2262 }
2263
2264 auto MIB = BuildMI(MF, DL, MCID);
2265 MIB.addMetadata(Variable).addMetadata(Expr);
2266 for (const MachineOperand &DebugOp : DebugOps)
2267 if (DebugOp.isReg())
2268 MIB.addReg(DebugOp.getReg());
2269 else
2270 MIB.add(DebugOp);
2271 return MIB;
2272}
2273
2276 const DebugLoc &DL, const MCInstrDesc &MCID,
2277 bool IsIndirect, Register Reg,
2278 const MDNode *Variable, const MDNode *Expr) {
2279 MachineFunction &MF = *BB.getParent();
2280 MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Variable, Expr);
2281 BB.insert(I, MI);
2282 return MachineInstrBuilder(MF, MI);
2283}
2284
2287 const DebugLoc &DL, const MCInstrDesc &MCID,
2288 bool IsIndirect,
2289 ArrayRef<MachineOperand> DebugOps,
2290 const MDNode *Variable, const MDNode *Expr) {
2291 MachineFunction &MF = *BB.getParent();
2292 MachineInstr *MI =
2293 BuildMI(MF, DL, MCID, IsIndirect, DebugOps, Variable, Expr);
2294 BB.insert(I, MI);
2295 return MachineInstrBuilder(MF, *MI);
2296}
2297
2298/// Compute the new DIExpression to use with a DBG_VALUE for a spill slot.
2299/// This prepends DW_OP_deref when spilling an indirect DBG_VALUE.
2300static const DIExpression *
2302 SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2303 assert(MI.getDebugVariable()->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
2304 "Expected inlined-at fields to agree");
2305
2306 const DIExpression *Expr = MI.getDebugExpression();
2307 if (MI.isIndirectDebugValue()) {
2308 assert(MI.getDebugOffset().getImm() == 0 &&
2309 "DBG_VALUE with nonzero offset");
2311 } else if (MI.isDebugValueList()) {
2312 // We will replace the spilled register with a frame index, so
2313 // immediately deref all references to the spilled register.
2314 std::array<uint64_t, 1> Ops{{dwarf::DW_OP_deref}};
2315 for (const MachineOperand *Op : SpilledOperands) {
2316 unsigned OpIdx = MI.getDebugOperandIndex(Op);
2317 Expr = DIExpression::appendOpsToArg(Expr, Ops, OpIdx);
2318 }
2319 }
2320 return Expr;
2321}
2323 Register SpillReg) {
2324 assert(MI.hasDebugOperandForReg(SpillReg) && "Spill Reg is not used in MI.");
2326 for (const MachineOperand &Op : MI.getDebugOperandsForReg(SpillReg))
2327 SpillOperands.push_back(&Op);
2328 return computeExprForSpill(MI, SpillOperands);
2329}
2330
2333 const MachineInstr &Orig,
2334 int FrameIndex, Register SpillReg) {
2335 assert(!Orig.isDebugRef() &&
2336 "DBG_INSTR_REF should not reference a virtual register.");
2337 const DIExpression *Expr = computeExprForSpill(Orig, SpillReg);
2338 MachineInstrBuilder NewMI =
2339 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2340 // Non-Variadic Operands: Location, Offset, Variable, Expression
2341 // Variadic Operands: Variable, Expression, Locations...
2342 if (Orig.isNonListDebugValue())
2343 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2344 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2345 if (Orig.isDebugValueList()) {
2346 for (const MachineOperand &Op : Orig.debug_operands())
2347 if (Op.isReg() && Op.getReg() == SpillReg)
2348 NewMI.addFrameIndex(FrameIndex);
2349 else
2350 NewMI.add(MachineOperand(Op));
2351 }
2352 return NewMI;
2353}
2356 const MachineInstr &Orig, int FrameIndex,
2357 SmallVectorImpl<const MachineOperand *> &SpilledOperands) {
2358 const DIExpression *Expr = computeExprForSpill(Orig, SpilledOperands);
2359 MachineInstrBuilder NewMI =
2360 BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());
2361 // Non-Variadic Operands: Location, Offset, Variable, Expression
2362 // Variadic Operands: Variable, Expression, Locations...
2363 if (Orig.isNonListDebugValue())
2364 NewMI.addFrameIndex(FrameIndex).addImm(0U);
2365 NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);
2366 if (Orig.isDebugValueList()) {
2367 for (const MachineOperand &Op : Orig.debug_operands())
2368 if (is_contained(SpilledOperands, &Op))
2369 NewMI.addFrameIndex(FrameIndex);
2370 else
2371 NewMI.add(MachineOperand(Op));
2372 }
2373 return NewMI;
2374}
2375
2377 Register Reg) {
2378 const DIExpression *Expr = computeExprForSpill(Orig, Reg);
2379 if (Orig.isNonListDebugValue())
2381 for (MachineOperand &Op : Orig.getDebugOperandsForReg(Reg))
2382 Op.ChangeToFrameIndex(FrameIndex);
2383 Orig.getDebugExpressionOp().setMetadata(Expr);
2384}
2385
2388 MachineInstr &MI = *this;
2389 if (!MI.getOperand(0).isReg())
2390 return;
2391
2393 for (MachineBasicBlock::iterator DE = MI.getParent()->end();
2394 DI != DE; ++DI) {
2395 if (!DI->isDebugValue())
2396 return;
2397 if (DI->hasDebugOperandForReg(MI.getOperand(0).getReg()))
2398 DbgValues.push_back(&*DI);
2399 }
2400}
2401
2403 // Collect matching debug values.
2405
2406 if (!getOperand(0).isReg())
2407 return;
2408
2409 Register DefReg = getOperand(0).getReg();
2410 auto *MRI = getRegInfo();
2411 for (auto &MO : MRI->use_operands(DefReg)) {
2412 auto *DI = MO.getParent();
2413 if (!DI->isDebugValue())
2414 continue;
2415 if (DI->hasDebugOperandForReg(DefReg)) {
2416 DbgValues.push_back(DI);
2417 }
2418 }
2419
2420 // Propagate Reg to debug value instructions.
2421 for (auto *DBI : DbgValues)
2422 for (MachineOperand &Op : DBI->getDebugOperandsForReg(DefReg))
2423 Op.setReg(Reg);
2424}
2425
2427
2429 const MachineFrameInfo &MFI) {
2430 uint64_t Size = 0;
2431 for (const auto *A : Accesses) {
2432 if (MFI.isSpillSlotObjectIndex(
2433 cast<FixedStackPseudoSourceValue>(A->getPseudoValue())
2434 ->getFrameIndex())) {
2435 LocationSize S = A->getSize();
2436 if (!S.hasValue())
2438 Size += S.getValue();
2439 }
2440 }
2441 return Size;
2442}
2443
2444std::optional<LocationSize>
2446 int FI;
2447 if (TII->isStoreToStackSlotPostFE(*this, FI)) {
2448 const MachineFrameInfo &MFI = getMF()->getFrameInfo();
2449 if (MFI.isSpillSlotObjectIndex(FI))
2450 return (*memoperands_begin())->getSize();
2451 }
2452 return std::nullopt;
2453}
2454
2455std::optional<LocationSize>
2457 MMOList Accesses;
2458 if (TII->hasStoreToStackSlot(*this, Accesses))
2459 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2460 return std::nullopt;
2461}
2462
2463std::optional<LocationSize>
2465 int FI;
2466 if (TII->isLoadFromStackSlotPostFE(*this, FI)) {
2467 const MachineFrameInfo &MFI = getMF()->getFrameInfo();
2468 if (MFI.isSpillSlotObjectIndex(FI))
2469 return (*memoperands_begin())->getSize();
2470 }
2471 return std::nullopt;
2472}
2473
2474std::optional<LocationSize>
2476 MMOList Accesses;
2477 if (TII->hasLoadFromStackSlot(*this, Accesses))
2478 return getSpillSlotSize(Accesses, getMF()->getFrameInfo());
2479 return std::nullopt;
2480}
2481
2483 if (DebugInstrNum == 0)
2484 DebugInstrNum = getParent()->getParent()->getNewDebugInstrNum();
2485 return DebugInstrNum;
2486}
2487
2489 if (DebugInstrNum == 0)
2490 DebugInstrNum = MF.getNewDebugInstrNum();
2491 return DebugInstrNum;
2492}
2493
2494std::tuple<LLT, LLT> MachineInstr::getFirst2LLTs() const {
2495 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2496 getRegInfo()->getType(getOperand(1).getReg()));
2497}
2498
2499std::tuple<LLT, LLT, LLT> MachineInstr::getFirst3LLTs() const {
2500 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2501 getRegInfo()->getType(getOperand(1).getReg()),
2502 getRegInfo()->getType(getOperand(2).getReg()));
2503}
2504
2505std::tuple<LLT, LLT, LLT, LLT> MachineInstr::getFirst4LLTs() const {
2506 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2507 getRegInfo()->getType(getOperand(1).getReg()),
2508 getRegInfo()->getType(getOperand(2).getReg()),
2509 getRegInfo()->getType(getOperand(3).getReg()));
2510}
2511
2512std::tuple<LLT, LLT, LLT, LLT, LLT> MachineInstr::getFirst5LLTs() const {
2513 return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),
2514 getRegInfo()->getType(getOperand(1).getReg()),
2515 getRegInfo()->getType(getOperand(2).getReg()),
2516 getRegInfo()->getType(getOperand(3).getReg()),
2517 getRegInfo()->getType(getOperand(4).getReg()));
2518}
2519
2520std::tuple<Register, LLT, Register, LLT>
2522 Register Reg0 = getOperand(0).getReg();
2523 Register Reg1 = getOperand(1).getReg();
2524 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2525 getRegInfo()->getType(Reg1));
2526}
2527
2528std::tuple<Register, LLT, Register, LLT, Register, LLT>
2530 Register Reg0 = getOperand(0).getReg();
2531 Register Reg1 = getOperand(1).getReg();
2532 Register Reg2 = getOperand(2).getReg();
2533 return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,
2534 getRegInfo()->getType(Reg1), Reg2,
2535 getRegInfo()->getType(Reg2));
2536}
2537
2538std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>
2540 Register Reg0 = getOperand(0).getReg();
2541 Register Reg1 = getOperand(1).getReg();
2542 Register Reg2 = getOperand(2).getReg();
2543 Register Reg3 = getOperand(3).getReg();
2544 return std::tuple(
2545 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2546 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3));
2547}
2548
2550 LLT>
2552 Register Reg0 = getOperand(0).getReg();
2553 Register Reg1 = getOperand(1).getReg();
2554 Register Reg2 = getOperand(2).getReg();
2555 Register Reg3 = getOperand(3).getReg();
2556 Register Reg4 = getOperand(4).getReg();
2557 return std::tuple(
2558 Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),
2559 Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3),
2560 Reg4, getRegInfo()->getType(Reg4));
2561}
2562
2565 assert(InsertBefore != nullptr && "invalid iterator");
2566 assert(InsertBefore->getParent() == this &&
2567 "iterator points to operand of other inst");
2568 if (Ops.empty())
2569 return;
2570
2571 // Do one pass to untie operands.
2573 for (const MachineOperand &MO : operands()) {
2574 if (MO.isReg() && MO.isTied()) {
2575 unsigned OpNo = getOperandNo(&MO);
2576 unsigned TiedTo = findTiedOperandIdx(OpNo);
2577 TiedOpIndices[OpNo] = TiedTo;
2578 untieRegOperand(OpNo);
2579 }
2580 }
2581
2582 unsigned OpIdx = getOperandNo(InsertBefore);
2583 unsigned NumOperands = getNumOperands();
2584 unsigned OpsToMove = NumOperands - OpIdx;
2585
2587 MovingOps.reserve(OpsToMove);
2588
2589 for (unsigned I = 0; I < OpsToMove; ++I) {
2590 MovingOps.emplace_back(getOperand(OpIdx));
2591 removeOperand(OpIdx);
2592 }
2593 for (const MachineOperand &MO : Ops)
2594 addOperand(MO);
2595 for (const MachineOperand &OpMoved : MovingOps)
2596 addOperand(OpMoved);
2597
2598 // Re-tie operands.
2599 for (auto [Tie1, Tie2] : TiedOpIndices) {
2600 if (Tie1 >= OpIdx)
2601 Tie1 += Ops.size();
2602 if (Tie2 >= OpIdx)
2603 Tie2 += Ops.size();
2604 tieOperands(Tie1, Tie2);
2605 }
2606}
2607
2608bool MachineInstr::mayFoldInlineAsmRegOp(unsigned OpId) const {
2609 assert(OpId && "expected non-zero operand id");
2610 assert(isInlineAsm() && "should only be used on inline asm");
2611
2612 if (!getOperand(OpId).isReg())
2613 return false;
2614
2615 const MachineOperand &MD = getOperand(OpId - 1);
2616 if (!MD.isImm())
2617 return false;
2618
2619 InlineAsm::Flag F(MD.getImm());
2620 if (F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind())
2621 return F.getRegMayBeFolded();
2622 return false;
2623}
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:914
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.
MachineModuleInfo & getMMI() const
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.
const Module * getModule() const
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
LLVMContext & getContext() const
Get the global data context.
Definition: Module.h:301
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:31
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)