LLVM 22.0.0git
MachineOperand.cpp
Go to the documentation of this file.
1//===- lib/CodeGen/MachineOperand.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/// \file Methods common to all machine operands.
10//
11//===----------------------------------------------------------------------===//
12
16#include "llvm/Analysis/Loads.h"
24#include "llvm/Config/llvm-config.h"
25#include "llvm/IR/Constants.h"
29#include "llvm/MC/MCDwarf.h"
31#include <optional>
32
33using namespace llvm;
34
35static cl::opt<int>
36 PrintRegMaskNumRegs("print-regmask-num-regs",
37 cl::desc("Number of registers to limit to when "
38 "printing regmask operands in IR dumps. "
39 "unlimited = -1"),
40 cl::init(32), cl::Hidden);
41
43 if (const MachineInstr *MI = MO.getParent())
44 if (const MachineBasicBlock *MBB = MI->getParent())
45 if (const MachineFunction *MF = MBB->getParent())
46 return MF;
47 return nullptr;
48}
49
51 return const_cast<MachineFunction *>(
52 getMFIfAvailable(const_cast<const MachineOperand &>(MO)));
53}
54
56 assert(getParent() && "Operand does not belong to any instruction!");
57 return getParent()->getOperandNo(this);
58}
59
61 if (getReg() == Reg)
62 return; // No change.
63
64 // Clear the IsRenamable bit to keep it conservatively correct.
65 IsRenamable = false;
66
67 // Otherwise, we have to change the register. If this operand is embedded
68 // into a machine function, we need to update the old and new register's
69 // use/def lists.
70 if (MachineFunction *MF = getMFIfAvailable(*this)) {
71 MachineRegisterInfo &MRI = MF->getRegInfo();
72 MRI.removeRegOperandFromUseList(this);
73 SmallContents.RegNo = Reg.id();
74 MRI.addRegOperandToUseList(this);
75 return;
76 }
77
78 // Otherwise, just change the register, no problem. :)
79 SmallContents.RegNo = Reg.id();
80}
81
82void MachineOperand::substVirtReg(Register Reg, unsigned SubIdx,
83 const TargetRegisterInfo &TRI) {
84 assert(Reg.isVirtual());
85 if (SubIdx && getSubReg())
86 SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg());
87 setReg(Reg);
88 if (SubIdx)
89 setSubReg(SubIdx);
90}
91
93 assert(Reg.isPhysical());
94 if (getSubReg()) {
95 Reg = TRI.getSubReg(Reg, getSubReg());
96 // Note that getSubReg() may return 0 if the sub-register doesn't exist.
97 // That won't happen in legal code.
98 setSubReg(0);
99 if (isDef())
100 setIsUndef(false);
101 }
102 setReg(Reg);
103}
104
105/// Change a def to a use, or a use to a def.
107 assert(isReg() && "Wrong MachineOperand accessor");
108 assert((!Val || !isDebug()) && "Marking a debug operation as def");
109 if (IsDef == Val)
110 return;
111 assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported");
112 // MRI may keep uses and defs in different list positions.
113 if (MachineFunction *MF = getMFIfAvailable(*this)) {
114 MachineRegisterInfo &MRI = MF->getRegInfo();
115 MRI.removeRegOperandFromUseList(this);
116 IsDef = Val;
117 MRI.addRegOperandToUseList(this);
118 return;
119 }
120 IsDef = Val;
121}
122
124 assert(isReg() && "Wrong MachineOperand accessor");
126 "isRenamable should only be checked on physical registers");
127 if (!IsRenamable)
128 return false;
129
130 const MachineInstr *MI = getParent();
131 if (!MI)
132 return true;
133
134 if (isDef())
135 return !MI->hasExtraDefRegAllocReq(MachineInstr::IgnoreBundle);
136
137 assert(isUse() && "Reg is not def or use");
138 return !MI->hasExtraSrcRegAllocReq(MachineInstr::IgnoreBundle);
139}
140
142 assert(isReg() && "Wrong MachineOperand accessor");
144 "setIsRenamable should only be called on physical registers");
145 IsRenamable = Val;
146}
147
148// If this operand is currently a register operand, and if this is in a
149// function, deregister the operand from the register's use/def list.
150void MachineOperand::removeRegFromUses() {
151 if (!isReg() || !isOnRegUseList())
152 return;
153
154 if (MachineFunction *MF = getMFIfAvailable(*this))
155 MF->getRegInfo().removeRegOperandFromUseList(this);
156}
157
158/// ChangeToImmediate - Replace this operand with a new immediate operand of
159/// the specified value. If an operand is known to be an immediate already,
160/// the setImm method should be used.
161void MachineOperand::ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags) {
162 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
163
164 removeRegFromUses();
165
166 OpKind = MO_Immediate;
167 Contents.ImmVal = ImmVal;
168 setTargetFlags(TargetFlags);
169}
170
172 unsigned TargetFlags) {
173 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
174
175 removeRegFromUses();
176
177 OpKind = MO_FPImmediate;
178 Contents.CFP = FPImm;
179 setTargetFlags(TargetFlags);
180}
181
182void MachineOperand::ChangeToES(const char *SymName,
183 unsigned TargetFlags) {
184 assert((!isReg() || !isTied()) &&
185 "Cannot change a tied operand into an external symbol");
186
187 removeRegFromUses();
188
189 OpKind = MO_ExternalSymbol;
190 Contents.OffsetedInfo.Val.SymbolName = SymName;
191 setOffset(0); // Offset is always 0.
192 setTargetFlags(TargetFlags);
193}
194
196 unsigned TargetFlags) {
197 assert((!isReg() || !isTied()) &&
198 "Cannot change a tied operand into a global address");
199
200 removeRegFromUses();
201
202 OpKind = MO_GlobalAddress;
203 Contents.OffsetedInfo.Val.GV = GV;
205 setTargetFlags(TargetFlags);
206}
207
209 unsigned TargetFlags) {
210 assert((!isReg() || !isTied()) &&
211 "Cannot change a tied operand into a block address");
212
213 removeRegFromUses();
214
215 OpKind = MO_BlockAddress;
216 Contents.OffsetedInfo.Val.BA = BA;
218 setTargetFlags(TargetFlags);
219}
220
221void MachineOperand::ChangeToCPI(unsigned Idx, int Offset,
222 unsigned TargetFlags) {
223 assert((!isReg() || !isTied()) &&
224 "Cannot change a tied operand into a constant pool index");
225
226 removeRegFromUses();
227
228 OpKind = MO_ConstantPoolIndex;
229 setIndex(Idx);
231 setTargetFlags(TargetFlags);
232}
233
234void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags) {
235 assert((!isReg() || !isTied()) &&
236 "Cannot change a tied operand into an MCSymbol");
237
238 removeRegFromUses();
239
240 OpKind = MO_MCSymbol;
241 Contents.Sym = Sym;
242 setTargetFlags(TargetFlags);
243}
244
245void MachineOperand::ChangeToFrameIndex(int Idx, unsigned TargetFlags) {
246 assert((!isReg() || !isTied()) &&
247 "Cannot change a tied operand into a FrameIndex");
248
249 removeRegFromUses();
250
251 OpKind = MO_FrameIndex;
252 setIndex(Idx);
253 setTargetFlags(TargetFlags);
254}
255
257 unsigned TargetFlags) {
258 assert((!isReg() || !isTied()) &&
259 "Cannot change a tied operand into a FrameIndex");
260
261 removeRegFromUses();
262
263 OpKind = MO_TargetIndex;
264 setIndex(Idx);
266 setTargetFlags(TargetFlags);
267}
268
269void MachineOperand::ChangeToDbgInstrRef(unsigned InstrIdx, unsigned OpIdx,
270 unsigned TargetFlags) {
271 assert((!isReg() || !isTied()) &&
272 "Cannot change a tied operand into a DbgInstrRef");
273
274 removeRegFromUses();
275
276 OpKind = MO_DbgInstrRef;
277 setInstrRefInstrIndex(InstrIdx);
279 setTargetFlags(TargetFlags);
280}
281
282/// ChangeToRegister - Replace this operand with a new register operand of
283/// the specified value. If an operand is known to be an register already,
284/// the setReg method should be used.
286 bool isKill, bool isDead, bool isUndef,
287 bool isDebug) {
288 MachineRegisterInfo *RegInfo = nullptr;
289 if (MachineFunction *MF = getMFIfAvailable(*this))
290 RegInfo = &MF->getRegInfo();
291 // If this operand is already a register operand, remove it from the
292 // register's use/def lists.
293 bool WasReg = isReg();
294 if (RegInfo && WasReg)
295 RegInfo->removeRegOperandFromUseList(this);
296
297 // Ensure debug instructions set debug flag on register uses.
298 const MachineInstr *MI = getParent();
299 if (!isDef && MI && MI->isDebugInstr())
300 isDebug = true;
301
302 // Change this to a register and set the reg#.
303 assert(!(isDead && !isDef) && "Dead flag on non-def");
304 assert(!(isKill && isDef) && "Kill flag on def");
305 OpKind = MO_Register;
306 SmallContents.RegNo = Reg.id();
307 SubReg_TargetFlags = 0;
308 IsDef = isDef;
309 IsImp = isImp;
310 IsDeadOrKill = isKill | isDead;
311 IsRenamable = false;
312 IsUndef = isUndef;
313 IsInternalRead = false;
314 IsEarlyClobber = false;
315 IsDebug = isDebug;
316 // Ensure isOnRegUseList() returns false.
317 Contents.Reg.Prev = nullptr;
318 // Preserve the tie when the operand was already a register.
319 if (!WasReg)
320 TiedTo = 0;
321
322 // If this operand is embedded in a function, add the operand to the
323 // register's use/def list.
324 if (RegInfo)
325 RegInfo->addRegOperandToUseList(this);
326}
327
328/// isIdenticalTo - Return true if this operand is identical to the specified
329/// operand. Note that this should stay in sync with the hash_value overload
330/// below.
331bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
332 if (getType() != Other.getType() ||
333 getTargetFlags() != Other.getTargetFlags())
334 return false;
335
336 switch (getType()) {
338 return getReg() == Other.getReg() && isDef() == Other.isDef() &&
339 getSubReg() == Other.getSubReg();
341 return getImm() == Other.getImm();
343 return getCImm() == Other.getCImm();
345 return getFPImm() == Other.getFPImm();
347 return getMBB() == Other.getMBB();
349 return getIndex() == Other.getIndex();
352 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
354 return getIndex() == Other.getIndex();
356 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
358 return strcmp(getSymbolName(), Other.getSymbolName()) == 0 &&
359 getOffset() == Other.getOffset();
361 return getBlockAddress() == Other.getBlockAddress() &&
362 getOffset() == Other.getOffset();
365 // Shallow compare of the two RegMasks
366 const uint32_t *RegMask = getRegMask();
367 const uint32_t *OtherRegMask = Other.getRegMask();
368 if (RegMask == OtherRegMask)
369 return true;
370
371 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
372 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
373 unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
374 // Deep compare of the two RegMasks
375 return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask);
376 }
377 // We don't know the size of the RegMask, so we can't deep compare the two
378 // reg masks.
379 return false;
380 }
382 return getMCSymbol() == Other.getMCSymbol();
384 return getInstrRefInstrIndex() == Other.getInstrRefInstrIndex() &&
385 getInstrRefOpIndex() == Other.getInstrRefOpIndex();
387 return getCFIIndex() == Other.getCFIIndex();
389 return getMetadata() == Other.getMetadata();
391 return getIntrinsicID() == Other.getIntrinsicID();
393 return getPredicate() == Other.getPredicate();
395 return getShuffleMask() == Other.getShuffleMask();
396 }
397 llvm_unreachable("Invalid machine operand type");
398}
399
400// Note: this must stay exactly in sync with isIdenticalTo above.
402 switch (MO.getType()) {
404 // Register operands don't have target flags.
405 return hash_combine(MO.getType(), MO.getReg().id(), MO.getSubReg(),
406 MO.isDef());
408 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm());
410 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm());
412 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm());
414 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB());
416 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
419 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
420 MO.getOffset());
422 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
424 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(),
427 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(),
428 MO.getOffset());
430 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(),
431 MO.getOffset());
434 if (const MachineFunction *MF = getMFIfAvailable(MO)) {
435 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
436 unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
437 const uint32_t *RegMask = MO.getRegMask();
438 std::vector<stable_hash> RegMaskHashes(RegMask, RegMask + RegMaskSize);
439 return hash_combine(MO.getType(), MO.getTargetFlags(),
440 stable_hash_combine(RegMaskHashes));
441 }
442
443 assert(0 && "MachineOperand not associated with any MachineFunction");
444 return hash_combine(MO.getType(), MO.getTargetFlags());
445 }
447 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());
449 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol());
451 return hash_combine(MO.getType(), MO.getTargetFlags(),
454 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());
456 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());
458 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate());
460 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getShuffleMask());
461 }
462 llvm_unreachable("Invalid machine operand type");
463}
464
465// Try to crawl up to the machine function and get TRI from it.
466static void tryToGetTargetInfo(const MachineOperand &MO,
467 const TargetRegisterInfo *&TRI) {
468 if (const MachineFunction *MF = getMFIfAvailable(MO)) {
469 TRI = MF->getSubtarget().getRegisterInfo();
470 }
471}
472
473static const char *getTargetIndexName(const MachineFunction &MF, int Index) {
474 const auto *TII = MF.getSubtarget().getInstrInfo();
475 assert(TII && "expected instruction info");
476 auto Indices = TII->getSerializableTargetIndices();
477 auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) {
478 return I.first == Index;
479 });
480 if (Found != Indices.end())
481 return Found->second;
482 return nullptr;
483}
484
486 const MachineFunction *MF = getMFIfAvailable(*this);
487 return MF ? ::getTargetIndexName(*MF, this->getIndex()) : nullptr;
488}
489
490static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) {
491 auto Flags = TII->getSerializableDirectMachineOperandTargetFlags();
492 for (const auto &I : Flags) {
493 if (I.first == TF) {
494 return I.second;
495 }
496 }
497 return nullptr;
498}
499
500static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,
501 const TargetRegisterInfo *TRI) {
502 if (!TRI) {
503 OS << "%dwarfreg." << DwarfReg;
504 return;
505 }
506
507 if (std::optional<MCRegister> Reg = TRI->getLLVMRegNum(DwarfReg, true))
508 OS << printReg(*Reg, TRI);
509 else
510 OS << "<badreg>";
511}
512
514 ModuleSlotTracker &MST) {
515 OS << "%ir-block.";
516 if (BB.hasName()) {
518 return;
519 }
520 std::optional<int> Slot;
521 if (const Function *F = BB.getParent()) {
522 if (F == MST.getCurrentFunction()) {
523 Slot = MST.getLocalSlot(&BB);
524 } else if (const Module *M = F->getParent()) {
525 ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false);
526 CustomMST.incorporateFunction(*F);
527 Slot = CustomMST.getLocalSlot(&BB);
528 }
529 }
530 if (Slot)
532 else
533 OS << "<unknown>";
534}
535
536static void printSyncScope(raw_ostream &OS, const LLVMContext &Context,
537 SyncScope::ID SSID,
539 switch (SSID) {
541 break;
542 default:
543 if (SSNs.empty())
544 Context.getSyncScopeNames(SSNs);
545
546 OS << "syncscope(\"";
547 printEscapedString(SSNs[SSID], OS);
548 OS << "\") ";
549 break;
550 }
551}
552
553static const char *getTargetMMOFlagName(const TargetInstrInfo &TII,
554 unsigned TMMOFlag) {
555 auto Flags = TII.getSerializableMachineMemOperandTargetFlags();
556 for (const auto &I : Flags) {
557 if (I.first == TMMOFlag) {
558 return I.second;
559 }
560 }
561 return nullptr;
562}
563
564static void printFrameIndex(raw_ostream& OS, int FrameIndex, bool IsFixed,
565 const MachineFrameInfo *MFI) {
566 StringRef Name;
567 if (MFI) {
568 IsFixed = MFI->isFixedObjectIndex(FrameIndex);
569 if (const AllocaInst *Alloca = MFI->getObjectAllocation(FrameIndex))
570 if (Alloca->hasName())
571 Name = Alloca->getName();
572 if (IsFixed)
573 FrameIndex -= MFI->getObjectIndexBegin();
574 }
575 MachineOperand::printStackObjectReference(OS, FrameIndex, IsFixed, Name);
576}
577
579 const TargetRegisterInfo *TRI) {
580 OS << "%subreg.";
581 if (TRI && Index != 0 && Index < TRI->getNumSubRegIndices())
582 OS << TRI->getSubRegIndexName(Index);
583 else
584 OS << Index;
585}
586
588 const MachineOperand &Op) {
589 if (!Op.getTargetFlags())
590 return;
592 if (!MF)
593 return;
594
595 const auto *TII = MF->getSubtarget().getInstrInfo();
596 assert(TII && "expected instruction info");
597 auto Flags = TII->decomposeMachineOperandsTargetFlags(Op.getTargetFlags());
598 OS << "target-flags(";
599 const bool HasDirectFlags = Flags.first;
600 const bool HasBitmaskFlags = Flags.second;
601 if (!HasDirectFlags && !HasBitmaskFlags) {
602 OS << "<unknown>) ";
603 return;
604 }
605 if (HasDirectFlags) {
606 if (const auto *Name = getTargetFlagName(TII, Flags.first))
607 OS << Name;
608 else
609 OS << "<unknown target flag>";
610 }
611 if (!HasBitmaskFlags) {
612 OS << ") ";
613 return;
614 }
615 bool IsCommaNeeded = HasDirectFlags;
616 unsigned BitMask = Flags.second;
617 auto BitMasks = TII->getSerializableBitmaskMachineOperandTargetFlags();
618 for (const auto &Mask : BitMasks) {
619 // Check if the flag's bitmask has the bits of the current mask set.
620 if ((BitMask & Mask.first) == Mask.first) {
621 if (IsCommaNeeded)
622 OS << ", ";
623 IsCommaNeeded = true;
624 OS << Mask.second;
625 // Clear the bits which were serialized from the flag's bitmask.
626 BitMask &= ~(Mask.first);
627 }
628 }
629 if (BitMask) {
630 // When the resulting flag's bitmask isn't zero, we know that we didn't
631 // serialize all of the bit flags.
632 if (IsCommaNeeded)
633 OS << ", ";
634 OS << "<unknown bitmask target flag>";
635 }
636 OS << ") ";
637}
638
640 OS << "<mcsymbol " << Sym << ">";
641}
642
644 unsigned FrameIndex,
645 bool IsFixed, StringRef Name) {
646 if (IsFixed) {
647 OS << "%fixed-stack." << FrameIndex;
648 return;
649 }
650
651 OS << "%stack." << FrameIndex;
652 if (!Name.empty())
653 OS << '.' << Name;
654}
655
657 if (Offset == 0)
658 return;
659 if (Offset < 0) {
660 OS << " - " << -Offset;
661 return;
662 }
663 OS << " + " << Offset;
664}
665
667 if (Slot == -1)
668 OS << "<badref>";
669 else
670 OS << Slot;
671}
672
673static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI,
674 const TargetRegisterInfo *TRI) {
675 switch (CFI.getOperation()) {
677 OS << "same_value ";
678 if (MCSymbol *Label = CFI.getLabel())
679 MachineOperand::printSymbol(OS, *Label);
680 printCFIRegister(CFI.getRegister(), OS, TRI);
681 break;
683 OS << "remember_state ";
684 if (MCSymbol *Label = CFI.getLabel())
685 MachineOperand::printSymbol(OS, *Label);
686 break;
688 OS << "restore_state ";
689 if (MCSymbol *Label = CFI.getLabel())
690 MachineOperand::printSymbol(OS, *Label);
691 break;
693 OS << "offset ";
694 if (MCSymbol *Label = CFI.getLabel())
695 MachineOperand::printSymbol(OS, *Label);
696 printCFIRegister(CFI.getRegister(), OS, TRI);
697 OS << ", " << CFI.getOffset();
698 break;
700 OS << "def_cfa_register ";
701 if (MCSymbol *Label = CFI.getLabel())
702 MachineOperand::printSymbol(OS, *Label);
703 printCFIRegister(CFI.getRegister(), OS, TRI);
704 break;
706 OS << "def_cfa_offset ";
707 if (MCSymbol *Label = CFI.getLabel())
708 MachineOperand::printSymbol(OS, *Label);
709 OS << CFI.getOffset();
710 break;
712 OS << "def_cfa ";
713 if (MCSymbol *Label = CFI.getLabel())
714 MachineOperand::printSymbol(OS, *Label);
715 printCFIRegister(CFI.getRegister(), OS, TRI);
716 OS << ", " << CFI.getOffset();
717 break;
719 OS << "llvm_def_aspace_cfa ";
720 if (MCSymbol *Label = CFI.getLabel())
721 MachineOperand::printSymbol(OS, *Label);
722 printCFIRegister(CFI.getRegister(), OS, TRI);
723 OS << ", " << CFI.getOffset();
724 OS << ", " << CFI.getAddressSpace();
725 break;
727 OS << "rel_offset ";
728 if (MCSymbol *Label = CFI.getLabel())
729 MachineOperand::printSymbol(OS, *Label);
730 printCFIRegister(CFI.getRegister(), OS, TRI);
731 OS << ", " << CFI.getOffset();
732 break;
734 OS << "adjust_cfa_offset ";
735 if (MCSymbol *Label = CFI.getLabel())
736 MachineOperand::printSymbol(OS, *Label);
737 OS << CFI.getOffset();
738 break;
740 OS << "restore ";
741 if (MCSymbol *Label = CFI.getLabel())
742 MachineOperand::printSymbol(OS, *Label);
743 printCFIRegister(CFI.getRegister(), OS, TRI);
744 break;
746 OS << "escape ";
747 if (MCSymbol *Label = CFI.getLabel())
748 MachineOperand::printSymbol(OS, *Label);
749 if (!CFI.getValues().empty()) {
750 size_t e = CFI.getValues().size() - 1;
751 for (size_t i = 0; i < e; ++i)
752 OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", ";
753 OS << format("0x%02x", uint8_t(CFI.getValues()[e]));
754 }
755 break;
756 }
758 OS << "undefined ";
759 if (MCSymbol *Label = CFI.getLabel())
760 MachineOperand::printSymbol(OS, *Label);
761 printCFIRegister(CFI.getRegister(), OS, TRI);
762 break;
764 OS << "register ";
765 if (MCSymbol *Label = CFI.getLabel())
766 MachineOperand::printSymbol(OS, *Label);
767 printCFIRegister(CFI.getRegister(), OS, TRI);
768 OS << ", ";
770 break;
772 OS << "window_save ";
773 if (MCSymbol *Label = CFI.getLabel())
774 MachineOperand::printSymbol(OS, *Label);
775 break;
777 OS << "negate_ra_sign_state ";
778 if (MCSymbol *Label = CFI.getLabel())
779 MachineOperand::printSymbol(OS, *Label);
780 break;
782 OS << "negate_ra_sign_state_with_pc ";
783 if (MCSymbol *Label = CFI.getLabel())
784 MachineOperand::printSymbol(OS, *Label);
785 break;
786 default:
787 // TODO: Print the other CFI Operations.
788 OS << "<unserializable cfi directive>";
789 break;
790 }
791}
792
794 const TargetRegisterInfo *TRI) const {
795 print(OS, LLT{}, TRI);
796}
797
799 const TargetRegisterInfo *TRI) const {
800 tryToGetTargetInfo(*this, TRI);
801 ModuleSlotTracker DummyMST(nullptr);
802 print(OS, DummyMST, TypeToPrint, std::nullopt, /*PrintDef=*/false,
803 /*IsStandalone=*/true,
804 /*ShouldPrintRegisterTies=*/true,
805 /*TiedOperandIdx=*/0, TRI);
806}
807
809 LLT TypeToPrint, std::optional<unsigned> OpIdx,
810 bool PrintDef, bool IsStandalone,
811 bool ShouldPrintRegisterTies,
812 unsigned TiedOperandIdx,
813 const TargetRegisterInfo *TRI) const {
814 printTargetFlags(OS, *this);
815 switch (getType()) {
817 Register Reg = getReg();
818 if (isImplicit())
819 OS << (isDef() ? "implicit-def " : "implicit ");
820 else if (PrintDef && isDef())
821 // Print the 'def' flag only when the operand is defined after '='.
822 OS << "def ";
823 if (isInternalRead())
824 OS << "internal ";
825 if (isDead())
826 OS << "dead ";
827 if (isKill())
828 OS << "killed ";
829 if (isUndef())
830 OS << "undef ";
831 if (isEarlyClobber())
832 OS << "early-clobber ";
833 if (getReg().isPhysical() && isRenamable())
834 OS << "renamable ";
835 // isDebug() is exactly true for register operands of a DBG_VALUE. So we
836 // simply infer it when parsing and do not need to print it.
837
838 const MachineRegisterInfo *MRI = nullptr;
839 if (Reg.isVirtual()) {
840 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
841 MRI = &MF->getRegInfo();
842 }
843 }
844
845 OS << printReg(Reg, TRI, 0, MRI);
846 // Print the sub register.
847 if (unsigned SubReg = getSubReg()) {
848 if (TRI)
849 OS << '.' << TRI->getSubRegIndexName(SubReg);
850 else
851 OS << ".subreg" << SubReg;
852 }
853 // Print the register class / bank.
854 if (Reg.isVirtual()) {
855 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
856 const MachineRegisterInfo &MRI = MF->getRegInfo();
857 if (IsStandalone || !PrintDef || MRI.def_empty(Reg)) {
858 OS << ':';
859 OS << printRegClassOrBank(Reg, MRI, TRI);
860 }
861 }
862 }
863 // Print ties.
864 if (ShouldPrintRegisterTies && isTied() && !isDef())
865 OS << "(tied-def " << TiedOperandIdx << ")";
866 // Print types.
867 if (TypeToPrint.isValid())
868 OS << '(' << TypeToPrint << ')';
869 break;
870 }
872 const MIRFormatter *Formatter = nullptr;
873 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
874 const auto *TII = MF->getSubtarget().getInstrInfo();
875 assert(TII && "expected instruction info");
876 Formatter = TII->getMIRFormatter();
877 }
878 if (Formatter)
879 Formatter->printImm(OS, *getParent(), OpIdx, getImm());
880 else
881 OS << getImm();
882 break;
883 }
885 getCImm()->printAsOperand(OS, /*PrintType=*/true, MST);
886 break;
888 getFPImm()->printAsOperand(OS, /*PrintType=*/true, MST);
889 break;
891 OS << printMBBReference(*getMBB());
892 break;
894 int FrameIndex = getIndex();
895 bool IsFixed = false;
896 const MachineFrameInfo *MFI = nullptr;
897 if (const MachineFunction *MF = getMFIfAvailable(*this))
898 MFI = &MF->getFrameInfo();
899 printFrameIndex(OS, FrameIndex, IsFixed, MFI);
900 break;
901 }
903 OS << "%const." << getIndex();
905 break;
907 OS << "target-index(";
908 const char *Name = "<unknown>";
909 if (const MachineFunction *MF = getMFIfAvailable(*this))
910 if (const auto *TargetIndexName = ::getTargetIndexName(*MF, getIndex()))
911 Name = TargetIndexName;
912 OS << Name << ')';
914 break;
915 }
918 break;
920 if (auto *GV = getGlobal())
921 GV->printAsOperand(OS, /*PrintType=*/false, MST);
922 else // Invalid, but may appear in debugging scenarios.
923 OS << "globaladdress(null)";
924
926 break;
928 StringRef Name = getSymbolName();
929 OS << '&';
930 if (Name.empty()) {
931 OS << "\"\"";
932 } else {
934 }
936 break;
937 }
939 OS << "blockaddress(";
940 getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false,
941 MST);
942 OS << ", ";
943 printIRBlockReference(OS, *getBlockAddress()->getBasicBlock(), MST);
944 OS << ')';
946 break;
947 }
949 OS << "<regmask";
950 if (TRI) {
951 unsigned NumRegsInMask = 0;
952 unsigned NumRegsEmitted = 0;
953 for (unsigned i = 0; i < TRI->getNumRegs(); ++i) {
954 unsigned MaskWord = i / 32;
955 unsigned MaskBit = i % 32;
956 if (getRegMask()[MaskWord] & (1 << MaskBit)) {
957 if (PrintRegMaskNumRegs < 0 ||
958 NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) {
959 OS << " " << printReg(i, TRI);
960 NumRegsEmitted++;
961 }
962 NumRegsInMask++;
963 }
964 }
965 if (NumRegsEmitted != NumRegsInMask)
966 OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more...";
967 } else {
968 OS << " ...";
969 }
970 OS << ">";
971 break;
972 }
974 const uint32_t *RegMask = getRegLiveOut();
975 OS << "liveout(";
976 if (!TRI) {
977 OS << "<unknown>";
978 } else {
979 bool IsCommaNeeded = false;
980 for (unsigned Reg = 0, E = TRI->getNumRegs(); Reg < E; ++Reg) {
981 if (RegMask[Reg / 32] & (1U << (Reg % 32))) {
982 if (IsCommaNeeded)
983 OS << ", ";
984 OS << printReg(Reg, TRI);
985 IsCommaNeeded = true;
986 }
987 }
988 }
989 OS << ")";
990 break;
991 }
993 getMetadata()->printAsOperand(OS, MST);
994 break;
996 printSymbol(OS, *getMCSymbol());
997 break;
999 OS << "dbg-instr-ref(" << getInstrRefInstrIndex() << ", "
1000 << getInstrRefOpIndex() << ')';
1001 break;
1002 }
1004 if (const MachineFunction *MF = getMFIfAvailable(*this))
1005 printCFI(OS, MF->getFrameInstructions()[getCFIIndex()], TRI);
1006 else
1007 OS << "<cfi directive>";
1008 break;
1009 }
1012 if (ID < Intrinsic::num_intrinsics)
1013 OS << "intrinsic(@" << Intrinsic::getBaseName(ID) << ')';
1014 else
1015 OS << "intrinsic(" << ID << ')';
1016 break;
1017 }
1019 auto Pred = static_cast<CmpInst::Predicate>(getPredicate());
1020 OS << (CmpInst::isIntPredicate(Pred) ? "int" : "float") << "pred("
1021 << Pred << ')';
1022 break;
1023 }
1025 OS << "shufflemask(";
1027 StringRef Separator;
1028 for (int Elt : Mask) {
1029 if (Elt == -1)
1030 OS << Separator << "undef";
1031 else
1032 OS << Separator << Elt;
1033 Separator = ", ";
1034 }
1035
1036 OS << ')';
1037 break;
1038 }
1039}
1040
1041#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1042LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; }
1043#endif
1044
1045//===----------------------------------------------------------------------===//
1046// MachineMemOperand Implementation
1047//===----------------------------------------------------------------------===//
1048
1049/// getAddrSpace - Return the LLVM IR address space number that this pointer
1050/// points into.
1052
1053/// isDereferenceable - Return true if V is always dereferenceable for
1054/// Offset + Size byte.
1056 const DataLayout &DL) const {
1057 if (!isa<const Value *>(V))
1058 return false;
1059
1060 const Value *BasePtr = cast<const Value *>(V);
1061 if (BasePtr == nullptr)
1062 return false;
1063
1065 BasePtr, Align(1), APInt(DL.getPointerSizeInBits(), Offset + Size), DL,
1066 dyn_cast<Instruction>(BasePtr));
1067}
1068
1069/// getConstantPool - Return a MachinePointerInfo record that refers to the
1070/// constant pool.
1074
1075/// getFixedStack - Return a MachinePointerInfo record that refers to the
1076/// the specified FrameIndex.
1081
1085
1089
1094
1098
1100 LLT type, Align a, const AAMDNodes &AAInfo,
1101 const MDNode *Ranges, SyncScope::ID SSID,
1102 AtomicOrdering Ordering,
1103 AtomicOrdering FailureOrdering)
1104 : PtrInfo(ptrinfo), MemoryType(type), FlagVals(f), BaseAlign(a),
1105 AAInfo(AAInfo), Ranges(Ranges) {
1106 assert((PtrInfo.V.isNull() || isa<const PseudoSourceValue *>(PtrInfo.V) ||
1107 isa<PointerType>(cast<const Value *>(PtrInfo.V)->getType())) &&
1108 "invalid pointer value");
1109 assert((isLoad() || isStore()) && "Not a load/store!");
1110
1111 AtomicInfo.SSID = static_cast<unsigned>(SSID);
1112 assert(getSyncScopeID() == SSID && "Value truncated");
1113 AtomicInfo.Ordering = static_cast<unsigned>(Ordering);
1114 assert(getSuccessOrdering() == Ordering && "Value truncated");
1115 AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering);
1116 assert(getFailureOrdering() == FailureOrdering && "Value truncated");
1117}
1118
1120 LocationSize TS, Align BaseAlignment,
1121 const AAMDNodes &AAInfo,
1122 const MDNode *Ranges, SyncScope::ID SSID,
1123 AtomicOrdering Ordering,
1124 AtomicOrdering FailureOrdering)
1126 ptrinfo, F,
1127 !TS.hasValue() ? LLT()
1128 : TS.isScalable()
1129 ? LLT::scalable_vector(1, 8 * TS.getValue().getKnownMinValue())
1130 : LLT::scalar(8 * TS.getValue().getKnownMinValue()),
1131 BaseAlignment, AAInfo, Ranges, SSID, Ordering, FailureOrdering) {}
1132
1134 // The Value and Offset may differ due to CSE. But the flags and size
1135 // should be the same.
1136 assert(MMO->getFlags() == getFlags() && "Flags mismatch!");
1137 assert((!MMO->getSize().hasValue() || !getSize().hasValue() ||
1138 MMO->getSize() == getSize()) &&
1139 "Size mismatch!");
1140 if (MMO->getBaseAlign() >= getBaseAlign()) {
1141 // Update the alignment value.
1142 BaseAlign = MMO->getBaseAlign();
1143 // Also update the base and offset, because the new alignment may
1144 // not be applicable with the old ones.
1145 PtrInfo = MMO->PtrInfo;
1146 }
1147}
1148
1149/// getAlign - Return the minimum known alignment in bytes of the
1150/// actual memory reference.
1154
1157 const LLVMContext &Context,
1158 const MachineFrameInfo *MFI,
1159 const TargetInstrInfo *TII) const {
1160 OS << '(';
1161 if (isVolatile())
1162 OS << "volatile ";
1163 if (isNonTemporal())
1164 OS << "non-temporal ";
1165 if (isDereferenceable())
1166 OS << "dereferenceable ";
1167 if (isInvariant())
1168 OS << "invariant ";
1169 if (TII) {
1172 << "\" ";
1175 << "\" ";
1178 << "\" ";
1181 << "\" ";
1182 } else {
1184 OS << "\"MOTargetFlag1\" ";
1186 OS << "\"MOTargetFlag2\" ";
1188 OS << "\"MOTargetFlag3\" ";
1190 OS << "\"MOTargetFlag4\" ";
1191 }
1192
1193 assert((isLoad() || isStore()) &&
1194 "machine memory operand must be a load or store (or both)");
1195 if (isLoad())
1196 OS << "load ";
1197 if (isStore())
1198 OS << "store ";
1199
1200 printSyncScope(OS, Context, getSyncScopeID(), SSNs);
1201
1203 OS << toIRString(getSuccessOrdering()) << ' ';
1205 OS << toIRString(getFailureOrdering()) << ' ';
1206
1207 if (getMemoryType().isValid())
1208 OS << '(' << getMemoryType() << ')';
1209 else
1210 OS << "unknown-size";
1211
1212 if (const Value *Val = getValue()) {
1213 OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into ");
1214 MIRFormatter::printIRValue(OS, *Val, MST);
1215 } else if (const PseudoSourceValue *PVal = getPseudoValue()) {
1216 OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into ");
1217 assert(PVal && "Expected a pseudo source value");
1218 switch (PVal->kind()) {
1220 OS << "stack";
1221 break;
1223 OS << "got";
1224 break;
1226 OS << "jump-table";
1227 break;
1229 OS << "constant-pool";
1230 break;
1232 int FrameIndex = cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex();
1233 bool IsFixed = true;
1234 printFrameIndex(OS, FrameIndex, IsFixed, MFI);
1235 break;
1236 }
1238 OS << "call-entry ";
1239 cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand(
1240 OS, /*PrintType=*/false, MST);
1241 break;
1243 OS << "call-entry &";
1245 OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol());
1246 break;
1247 default: {
1248 // FIXME: This is not necessarily the correct MIR serialization format for
1249 // a custom pseudo source value, but at least it allows
1250 // MIR printing to work on a target with custom pseudo source
1251 // values.
1252 OS << "custom \"";
1253 if (TII) {
1254 const MIRFormatter *Formatter = TII->getMIRFormatter();
1255 Formatter->printCustomPseudoSourceValue(OS, MST, *PVal);
1256 } else {
1257 PVal->printCustom(OS);
1258 }
1259 OS << '\"';
1260 break;
1261 }
1262 }
1263 } else if (getOpaqueValue() == nullptr && getOffset() != 0) {
1264 OS << ((isLoad() && isStore()) ? " on "
1265 : isLoad() ? " from "
1266 : " into ")
1267 << "unknown-address";
1268 }
1270 if (!getSize().hasValue() ||
1271 (!getSize().isZero() &&
1272 getAlign() != getSize().getValue().getKnownMinValue()))
1273 OS << ", align " << getAlign().value();
1274 if (getAlign() != getBaseAlign())
1275 OS << ", basealign " << getBaseAlign().value();
1276 auto AAInfo = getAAInfo();
1277 if (AAInfo.TBAA) {
1278 OS << ", !tbaa ";
1279 AAInfo.TBAA->printAsOperand(OS, MST);
1280 }
1281 if (AAInfo.Scope) {
1282 OS << ", !alias.scope ";
1283 AAInfo.Scope->printAsOperand(OS, MST);
1284 }
1285 if (AAInfo.NoAlias) {
1286 OS << ", !noalias ";
1287 AAInfo.NoAlias->printAsOperand(OS, MST);
1288 }
1289 if (AAInfo.NoAliasAddrSpace) {
1290 OS << ", !noalias.addrspace ";
1291 AAInfo.NoAliasAddrSpace->printAsOperand(OS, MST);
1292 }
1293 if (getRanges()) {
1294 OS << ", !range ";
1295 getRanges()->printAsOperand(OS, MST);
1296 }
1297 // FIXME: Implement addrspace printing/parsing in MIR.
1298 // For now, print this even though parsing it is not available in MIR.
1299 if (unsigned AS = getAddrSpace())
1300 OS << ", addrspace " << AS;
1301
1302 OS << ')';
1303}
unsigned SubReg
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:638
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file contains an interface for creating legacy passes to print out IR in various granularities.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
static void tryToGetTargetInfo(const MachineInstr &MI, const TargetRegisterInfo *&TRI, const MachineRegisterInfo *&MRI, const TargetInstrInfo *&TII)
static const MachineFunction * getMFIfAvailable(const MachineInstr &MI)
static void printSyncScope(raw_ostream &OS, const LLVMContext &Context, SyncScope::ID SSID, SmallVectorImpl< StringRef > &SSNs)
static const MachineFunction * getMFIfAvailable(const MachineOperand &MO)
static const char * getTargetIndexName(const MachineFunction &MF, int Index)
static void printFrameIndex(raw_ostream &OS, int FrameIndex, bool IsFixed, const MachineFrameInfo *MFI)
static cl::opt< int > PrintRegMaskNumRegs("print-regmask-num-regs", cl::desc("Number of registers to limit to when " "printing regmask operands in IR dumps. " "unlimited = -1"), cl::init(32), cl::Hidden)
static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, ModuleSlotTracker &MST)
static const char * getTargetFlagName(const TargetInstrInfo *TII, unsigned TF)
static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS, const TargetRegisterInfo *TRI)
static const char * getTargetMMOFlagName(const TargetInstrInfo &TII, unsigned TMMOFlag)
static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI, const TargetRegisterInfo *TRI)
Register Reg
Register const TargetRegisterInfo * TRI
MachineInstr unsigned OpIdx
static bool isPhysical(const MachineOperand &MO)
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
This file contains some functions that are useful when dealing with strings.
Class for arbitrary precision integers.
Definition APInt.h:78
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
The address of a basic block.
Definition Constants.h:899
Function * getFunction() const
Definition Constants.h:935
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:678
bool isIntPredicate() const
Definition InstrTypes.h:785
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:277
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
unsigned getAllocaAddrSpace() const
Definition DataLayout.h:230
constexpr bool isValid() const
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
bool hasValue() const
MCSymbol * getLabel() const
Definition MCDwarf.h:721
unsigned getAddressSpace() const
Definition MCDwarf.h:740
unsigned getRegister2() const
Definition MCDwarf.h:735
unsigned getRegister() const
Definition MCDwarf.h:723
OpType getOperation() const
Definition MCDwarf.h:720
StringRef getValues() const
Definition MCDwarf.h:760
int64_t getOffset() const
Definition MCDwarf.h:745
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:42
Metadata node.
Definition Metadata.h:1077
MIRFormater - Interface to format MIR operand based on target.
virtual void printImm(raw_ostream &OS, const MachineInstr &MI, std::optional< unsigned > OpIdx, int64_t Imm) const
Implement target specific printing for machine operand immediate value, so that we can have more mean...
virtual void printCustomPseudoSourceValue(raw_ostream &OS, ModuleSlotTracker &MST, const PseudoSourceValue &PSV) const
Implement target specific printing of target custom pseudo source value.
static LLVM_ABI void printIRValue(raw_ostream &OS, const Value &V, ModuleSlotTracker &MST)
Helper functions to print IR value as MIR serialization format which will be useful for target specif...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
const AllocaInst * getObjectAllocation(int ObjectIdx) const
Return the underlying Alloca of the specified stack object if it exists.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
int getObjectIndexBegin() const
Return the minimum frame object index.
PseudoSourceValueManager & getPSVManager() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Representation of each machine instruction.
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
LocationSize getSize() const
Return the size in bytes of the memory reference.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
const PseudoSourceValue * getPseudoValue() const
LLT getMemoryType() const
Return the memory type of the memory reference.
unsigned getAddrSpace() const
LLVM_ABI void print(raw_ostream &OS, ModuleSlotTracker &MST, SmallVectorImpl< StringRef > &SSNs, const LLVMContext &Context, const MachineFrameInfo *MFI, const TargetInstrInfo *TII) const
Support for operator<<.
const MDNode * getRanges() const
Return the range tag for the memory reference.
LLVM_ABI void refineAlignment(const MachineMemOperand *MMO)
Update this MachineMemOperand to reflect the alignment of MMO, if it has a greater alignment.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
const void * getOpaqueValue() const
LLVM_ABI MachineMemOperand(MachinePointerInfo PtrInfo, Flags flags, LocationSize TS, Align a, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
Construct a MachineMemOperand object with the specified PtrInfo, flags, size, and base alignment.
Flags
Flags values. These may be or'd together.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Align getAlign() const
Return the minimum known alignment in bytes of the actual memory reference.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
unsigned getInstrRefOpIndex() const
void setInstrRefInstrIndex(unsigned InstrIdx)
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
const GlobalValue * getGlobal() const
LLVM_ABI void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo &)
substVirtReg - Substitute the current register with the virtual subregister Reg:SubReg.
LLVM_ABI void ChangeToFrameIndex(int Idx, unsigned TargetFlags=0)
Replace this operand with a frame index.
const uint32_t * getRegLiveOut() const
getRegLiveOut - Returns a bit mask of live-out registers.
void setInstrRefOpIndex(unsigned OpIdx)
const ConstantInt * getCImm() const
LLVM_ABI const char * getTargetIndexName() const
getTargetIndexName - If this MachineOperand is a TargetIndex that has a name, attempt to get the name...
static LLVM_ABI void printStackObjectReference(raw_ostream &OS, unsigned FrameIndex, bool IsFixed, StringRef Name)
Print a stack object reference.
static LLVM_ABI void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
int64_t getImm() const
unsigned getInstrRefInstrIndex() const
static LLVM_ABI void printTargetFlags(raw_ostream &OS, const MachineOperand &Op)
Print operand target flags.
LLVM_ABI void ChangeToFPImmediate(const ConstantFP *FPImm, unsigned TargetFlags=0)
ChangeToFPImmediate - Replace this operand with a new FP immediate operand of the specified value.
LLVM_ABI void setIsRenamable(bool Val=true)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
const MDNode * getMetadata() const
MachineBasicBlock * getMBB() const
ArrayRef< int > getShuffleMask() const
LLVM_ABI void ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags=0)
ChangeToMCSymbol - Replace this operand with a new MC symbol operand.
LLVM_ABI void ChangeToTargetIndex(unsigned Idx, int64_t Offset, unsigned TargetFlags=0)
Replace this operand with a target index.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
LLVM_ABI void dump() const
LLVM_ABI void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
LLVM_ABI void ChangeToES(const char *SymName, unsigned TargetFlags=0)
ChangeToES - Replace this operand with a new external symbol operand.
LLVM_ABI void ChangeToGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
ChangeToGA - Replace this operand with a new global address operand.
LLVM_ABI void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr) const
Print the MachineOperand to os.
unsigned getCFIIndex() const
LLVM_ABI bool isRenamable() const
isRenamable - Returns true if this register may be renamed, i.e.
LLVM_ABI void ChangeToBA(const BlockAddress *BA, int64_t Offset, unsigned TargetFlags=0)
ChangeToBA - Replace this operand with a new block address operand.
static LLVM_ABI void printOperandOffset(raw_ostream &OS, int64_t Offset)
Print the offset with explicit +/- signs.
LLVM_ABI void ChangeToDbgInstrRef(unsigned InstrIdx, unsigned OpIdx, unsigned TargetFlags=0)
Replace this operand with an Instruction Reference.
LLVM_ABI void ChangeToRegister(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
ChangeToRegister - Replace this operand with a new register operand of the specified value.
const BlockAddress * getBlockAddress() const
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
LLVM_ABI void substPhysReg(MCRegister Reg, const TargetRegisterInfo &)
substPhysReg - Substitute the current register with the physical register Reg, taking any existing Su...
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
void setOffset(int64_t Offset)
static LLVM_ABI void printIRSlotNumber(raw_ostream &OS, int Slot)
Print an IRSlotNumber.
unsigned getTargetFlags() const
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
Intrinsic::ID getIntrinsicID() const
bool isInternalRead() const
void setTargetFlags(unsigned F)
LLVM_ABI bool isIdenticalTo(const MachineOperand &Other) const
Returns true if this operand is identical to the specified operand except for liveness related flags ...
LLVM_ABI void ChangeToCPI(unsigned Idx, int Offset, unsigned TargetFlags=0)
ChangeToCPI - Replace this operand with a new constant pool index operand.
friend class MachineRegisterInfo
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
friend class MachineInstr
LLVM_ABI void setIsDef(bool Val=true)
Change a def to a use, or a use to a def.
const ConstantFP * getFPImm() const
static LLVM_ABI void printSymbol(raw_ostream &OS, MCSymbol &Sym)
Print a MCSymbol as an operand.
unsigned getPredicate() const
MCSymbol * getMCSymbol() const
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_MCSymbol
MCSymbol reference (for debug/eh info)
@ MO_Predicate
Generic predicate for ISel.
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_ShuffleMask
Other IR Constant for ISel (shuffle masks)
@ MO_CImmediate
Immediate >64bit operand.
@ MO_BlockAddress
Address of a basic block.
@ MO_DbgInstrRef
Integer indices referring to an instruction+operand.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_IntrinsicID
Intrinsic ID for ISel.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_Metadata
Metadata reference (for debug info)
@ MO_FPImmediate
Floating-point immediate operand.
@ MO_RegisterLiveOut
Mask of live-out registers.
int64_t getOffset() const
Return the offset from the symbol in this operand.
LLVM_ABI void printAsOperand(raw_ostream &OS, const Module *M=nullptr) const
Print as operand.
Manage lifetime of a slot tracker for printing IR.
int getLocalSlot(const Value *V)
Return the slot number of the specified local value.
const Function * getCurrentFunction() const
void incorporateFunction(const Function &F)
Incorporate the given function.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
LLVM_ABI const PseudoSourceValue * getJumpTable()
Return a pseudo source value referencing a jump table.
LLVM_ABI const PseudoSourceValue * getFixedStack(int FI)
Return a pseudo source value referencing a fixed stack frame entry, e.g., a spill slot.
LLVM_ABI const PseudoSourceValue * getGOT()
Return a pseudo source value referencing the global offset table (or something the like).
LLVM_ABI const PseudoSourceValue * getStack()
Return a pseudo source value referencing the area below the stack frame of a function,...
LLVM_ABI const PseudoSourceValue * getConstantPool()
Return a pseudo source value referencing the constant pool.
Special value supplied for machine level alias analysis.
Wrapper class representing virtual and physical registers.
Definition Register.h:19
constexpr unsigned id() const
Definition Register.h:95
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:151
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:154
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
bool hasName() const
Definition Value.h:262
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
An opaque object representing a hash code.
Definition Hashing.h:76
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:58
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
hash_code hash_value(const FixedPointSemantics &Val)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
LLVM_ABI Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
LLVM_ABI void printEscapedString(StringRef Name, raw_ostream &Out)
Print each character of the specified string, escaping it if it is not printable or if it is an escap...
const char * toIRString(AtomicOrdering ao)
String used by LLVM IR to represent atomic ordering.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:126
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Other
Any other memory.
Definition ModRef.h:68
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1738
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:212
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:592
stable_hash stable_hash_combine(ArrayRef< stable_hash > Buffer)
LLVM_ABI void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:760
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:85
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getJumpTable(MachineFunction &MF)
Return a MachinePointerInfo record that refers to a jump table entry.
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
static LLVM_ABI MachinePointerInfo getStack(MachineFunction &MF, int64_t Offset, uint8_t ID=0)
Stack pointer relative access.
int64_t Offset
Offset - This is an offset from the base Value*.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
static LLVM_ABI MachinePointerInfo getConstantPool(MachineFunction &MF)
Return a MachinePointerInfo record that refers to the constant pool.
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getGOT(MachineFunction &MF)
Return a MachinePointerInfo record that refers to a GOT entry.
MachinePointerInfo(const Value *v, int64_t offset=0, uint8_t ID=0)
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.