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 13 #include "llvm/CodeGen/MachineOperand.h" 14 #include "llvm/ADT/StringExtras.h" 15 #include "llvm/Analysis/Loads.h" 16 #include "llvm/CodeGen/MIRFormatter.h" 17 #include "llvm/CodeGen/MachineFrameInfo.h" 18 #include "llvm/CodeGen/MachineJumpTableInfo.h" 19 #include "llvm/CodeGen/MachineRegisterInfo.h" 20 #include "llvm/CodeGen/StableHashing.h" 21 #include "llvm/CodeGen/TargetInstrInfo.h" 22 #include "llvm/CodeGen/TargetRegisterInfo.h" 23 #include "llvm/Config/llvm-config.h" 24 #include "llvm/IR/Constants.h" 25 #include "llvm/IR/IRPrintingPasses.h" 26 #include "llvm/IR/Instructions.h" 27 #include "llvm/IR/ModuleSlotTracker.h" 28 #include "llvm/MC/MCDwarf.h" 29 #include "llvm/Target/TargetIntrinsicInfo.h" 30 #include "llvm/Target/TargetMachine.h" 31 #include <optional> 32 33 using namespace llvm; 34 35 static 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 42 static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) { 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 50 static MachineFunction *getMFIfAvailable(MachineOperand &MO) { 51 return const_cast<MachineFunction *>( 52 getMFIfAvailable(const_cast<const MachineOperand &>(MO))); 53 } 54 55 unsigned MachineOperand::getOperandNo() const { 56 assert(getParent() && "Operand does not belong to any instruction!"); 57 return getParent()->getOperandNo(this); 58 } 59 60 void MachineOperand::setReg(Register Reg) { 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; 74 MRI.addRegOperandToUseList(this); 75 return; 76 } 77 78 // Otherwise, just change the register, no problem. :) 79 SmallContents.RegNo = Reg; 80 } 81 82 void 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 92 void MachineOperand::substPhysReg(MCRegister Reg, const TargetRegisterInfo &TRI) { 93 assert(Register::isPhysicalRegister(Reg)); 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. 106 void MachineOperand::setIsDef(bool Val) { 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 123 bool MachineOperand::isRenamable() const { 124 assert(isReg() && "Wrong MachineOperand accessor"); 125 assert(getReg().isPhysical() && 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 141 void MachineOperand::setIsRenamable(bool Val) { 142 assert(isReg() && "Wrong MachineOperand accessor"); 143 assert(getReg().isPhysical() && 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. 150 void 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. 161 void 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 171 void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm, 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 182 void 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 195 void MachineOperand::ChangeToGA(const GlobalValue *GV, int64_t Offset, 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; 204 setOffset(Offset); 205 setTargetFlags(TargetFlags); 206 } 207 208 void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags) { 209 assert((!isReg() || !isTied()) && 210 "Cannot change a tied operand into an MCSymbol"); 211 212 removeRegFromUses(); 213 214 OpKind = MO_MCSymbol; 215 Contents.Sym = Sym; 216 setTargetFlags(TargetFlags); 217 } 218 219 void MachineOperand::ChangeToFrameIndex(int Idx, unsigned TargetFlags) { 220 assert((!isReg() || !isTied()) && 221 "Cannot change a tied operand into a FrameIndex"); 222 223 removeRegFromUses(); 224 225 OpKind = MO_FrameIndex; 226 setIndex(Idx); 227 setTargetFlags(TargetFlags); 228 } 229 230 void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset, 231 unsigned TargetFlags) { 232 assert((!isReg() || !isTied()) && 233 "Cannot change a tied operand into a FrameIndex"); 234 235 removeRegFromUses(); 236 237 OpKind = MO_TargetIndex; 238 setIndex(Idx); 239 setOffset(Offset); 240 setTargetFlags(TargetFlags); 241 } 242 243 void MachineOperand::ChangeToDbgInstrRef(unsigned InstrIdx, unsigned OpIdx, 244 unsigned TargetFlags) { 245 assert((!isReg() || !isTied()) && 246 "Cannot change a tied operand into a DbgInstrRef"); 247 248 removeRegFromUses(); 249 250 OpKind = MO_DbgInstrRef; 251 setInstrRefInstrIndex(InstrIdx); 252 setInstrRefOpIndex(OpIdx); 253 setTargetFlags(TargetFlags); 254 } 255 256 /// ChangeToRegister - Replace this operand with a new register operand of 257 /// the specified value. If an operand is known to be an register already, 258 /// the setReg method should be used. 259 void MachineOperand::ChangeToRegister(Register Reg, bool isDef, bool isImp, 260 bool isKill, bool isDead, bool isUndef, 261 bool isDebug) { 262 MachineRegisterInfo *RegInfo = nullptr; 263 if (MachineFunction *MF = getMFIfAvailable(*this)) 264 RegInfo = &MF->getRegInfo(); 265 // If this operand is already a register operand, remove it from the 266 // register's use/def lists. 267 bool WasReg = isReg(); 268 if (RegInfo && WasReg) 269 RegInfo->removeRegOperandFromUseList(this); 270 271 // Ensure debug instructions set debug flag on register uses. 272 const MachineInstr *MI = getParent(); 273 if (!isDef && MI && MI->isDebugInstr()) 274 isDebug = true; 275 276 // Change this to a register and set the reg#. 277 assert(!(isDead && !isDef) && "Dead flag on non-def"); 278 assert(!(isKill && isDef) && "Kill flag on def"); 279 OpKind = MO_Register; 280 SmallContents.RegNo = Reg; 281 SubReg_TargetFlags = 0; 282 IsDef = isDef; 283 IsImp = isImp; 284 IsDeadOrKill = isKill | isDead; 285 IsRenamable = false; 286 IsUndef = isUndef; 287 IsInternalRead = false; 288 IsEarlyClobber = false; 289 IsDebug = isDebug; 290 // Ensure isOnRegUseList() returns false. 291 Contents.Reg.Prev = nullptr; 292 // Preserve the tie when the operand was already a register. 293 if (!WasReg) 294 TiedTo = 0; 295 296 // If this operand is embedded in a function, add the operand to the 297 // register's use/def list. 298 if (RegInfo) 299 RegInfo->addRegOperandToUseList(this); 300 } 301 302 /// isIdenticalTo - Return true if this operand is identical to the specified 303 /// operand. Note that this should stay in sync with the hash_value overload 304 /// below. 305 bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 306 if (getType() != Other.getType() || 307 getTargetFlags() != Other.getTargetFlags()) 308 return false; 309 310 switch (getType()) { 311 case MachineOperand::MO_Register: 312 return getReg() == Other.getReg() && isDef() == Other.isDef() && 313 getSubReg() == Other.getSubReg(); 314 case MachineOperand::MO_Immediate: 315 return getImm() == Other.getImm(); 316 case MachineOperand::MO_CImmediate: 317 return getCImm() == Other.getCImm(); 318 case MachineOperand::MO_FPImmediate: 319 return getFPImm() == Other.getFPImm(); 320 case MachineOperand::MO_MachineBasicBlock: 321 return getMBB() == Other.getMBB(); 322 case MachineOperand::MO_FrameIndex: 323 return getIndex() == Other.getIndex(); 324 case MachineOperand::MO_ConstantPoolIndex: 325 case MachineOperand::MO_TargetIndex: 326 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 327 case MachineOperand::MO_JumpTableIndex: 328 return getIndex() == Other.getIndex(); 329 case MachineOperand::MO_GlobalAddress: 330 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 331 case MachineOperand::MO_ExternalSymbol: 332 return strcmp(getSymbolName(), Other.getSymbolName()) == 0 && 333 getOffset() == Other.getOffset(); 334 case MachineOperand::MO_BlockAddress: 335 return getBlockAddress() == Other.getBlockAddress() && 336 getOffset() == Other.getOffset(); 337 case MachineOperand::MO_RegisterMask: 338 case MachineOperand::MO_RegisterLiveOut: { 339 // Shallow compare of the two RegMasks 340 const uint32_t *RegMask = getRegMask(); 341 const uint32_t *OtherRegMask = Other.getRegMask(); 342 if (RegMask == OtherRegMask) 343 return true; 344 345 if (const MachineFunction *MF = getMFIfAvailable(*this)) { 346 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); 347 unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs()); 348 // Deep compare of the two RegMasks 349 return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask); 350 } 351 // We don't know the size of the RegMask, so we can't deep compare the two 352 // reg masks. 353 return false; 354 } 355 case MachineOperand::MO_MCSymbol: 356 return getMCSymbol() == Other.getMCSymbol(); 357 case MachineOperand::MO_DbgInstrRef: 358 return getInstrRefInstrIndex() == Other.getInstrRefInstrIndex() && 359 getInstrRefOpIndex() == Other.getInstrRefOpIndex(); 360 case MachineOperand::MO_CFIIndex: 361 return getCFIIndex() == Other.getCFIIndex(); 362 case MachineOperand::MO_Metadata: 363 return getMetadata() == Other.getMetadata(); 364 case MachineOperand::MO_IntrinsicID: 365 return getIntrinsicID() == Other.getIntrinsicID(); 366 case MachineOperand::MO_Predicate: 367 return getPredicate() == Other.getPredicate(); 368 case MachineOperand::MO_ShuffleMask: 369 return getShuffleMask() == Other.getShuffleMask(); 370 } 371 llvm_unreachable("Invalid machine operand type"); 372 } 373 374 // Note: this must stay exactly in sync with isIdenticalTo above. 375 hash_code llvm::hash_value(const MachineOperand &MO) { 376 switch (MO.getType()) { 377 case MachineOperand::MO_Register: 378 // Register operands don't have target flags. 379 return hash_combine(MO.getType(), (unsigned)MO.getReg(), MO.getSubReg(), MO.isDef()); 380 case MachineOperand::MO_Immediate: 381 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm()); 382 case MachineOperand::MO_CImmediate: 383 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm()); 384 case MachineOperand::MO_FPImmediate: 385 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm()); 386 case MachineOperand::MO_MachineBasicBlock: 387 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB()); 388 case MachineOperand::MO_FrameIndex: 389 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 390 case MachineOperand::MO_ConstantPoolIndex: 391 case MachineOperand::MO_TargetIndex: 392 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(), 393 MO.getOffset()); 394 case MachineOperand::MO_JumpTableIndex: 395 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 396 case MachineOperand::MO_ExternalSymbol: 397 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(), 398 StringRef(MO.getSymbolName())); 399 case MachineOperand::MO_GlobalAddress: 400 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(), 401 MO.getOffset()); 402 case MachineOperand::MO_BlockAddress: 403 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(), 404 MO.getOffset()); 405 case MachineOperand::MO_RegisterMask: 406 case MachineOperand::MO_RegisterLiveOut: { 407 if (const MachineFunction *MF = getMFIfAvailable(MO)) { 408 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); 409 unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs()); 410 const uint32_t *RegMask = MO.getRegMask(); 411 std::vector<stable_hash> RegMaskHashes(RegMask, RegMask + RegMaskSize); 412 return hash_combine(MO.getType(), MO.getTargetFlags(), 413 stable_hash_combine_array(RegMaskHashes.data(), 414 RegMaskHashes.size())); 415 } 416 417 assert(0 && "MachineOperand not associated with any MachineFunction"); 418 return hash_combine(MO.getType(), MO.getTargetFlags()); 419 } 420 case MachineOperand::MO_Metadata: 421 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata()); 422 case MachineOperand::MO_MCSymbol: 423 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); 424 case MachineOperand::MO_DbgInstrRef: 425 return hash_combine(MO.getType(), MO.getTargetFlags(), 426 MO.getInstrRefInstrIndex(), MO.getInstrRefOpIndex()); 427 case MachineOperand::MO_CFIIndex: 428 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex()); 429 case MachineOperand::MO_IntrinsicID: 430 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID()); 431 case MachineOperand::MO_Predicate: 432 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate()); 433 case MachineOperand::MO_ShuffleMask: 434 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getShuffleMask()); 435 } 436 llvm_unreachable("Invalid machine operand type"); 437 } 438 439 // Try to crawl up to the machine function and get TRI and IntrinsicInfo from 440 // it. 441 static void tryToGetTargetInfo(const MachineOperand &MO, 442 const TargetRegisterInfo *&TRI, 443 const TargetIntrinsicInfo *&IntrinsicInfo) { 444 if (const MachineFunction *MF = getMFIfAvailable(MO)) { 445 TRI = MF->getSubtarget().getRegisterInfo(); 446 IntrinsicInfo = MF->getTarget().getIntrinsicInfo(); 447 } 448 } 449 450 static const char *getTargetIndexName(const MachineFunction &MF, int Index) { 451 const auto *TII = MF.getSubtarget().getInstrInfo(); 452 assert(TII && "expected instruction info"); 453 auto Indices = TII->getSerializableTargetIndices(); 454 auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) { 455 return I.first == Index; 456 }); 457 if (Found != Indices.end()) 458 return Found->second; 459 return nullptr; 460 } 461 462 const char *MachineOperand::getTargetIndexName() const { 463 const MachineFunction *MF = getMFIfAvailable(*this); 464 return MF ? ::getTargetIndexName(*MF, this->getIndex()) : nullptr; 465 } 466 467 static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) { 468 auto Flags = TII->getSerializableDirectMachineOperandTargetFlags(); 469 for (const auto &I : Flags) { 470 if (I.first == TF) { 471 return I.second; 472 } 473 } 474 return nullptr; 475 } 476 477 static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS, 478 const TargetRegisterInfo *TRI) { 479 if (!TRI) { 480 OS << "%dwarfreg." << DwarfReg; 481 return; 482 } 483 484 if (std::optional<unsigned> Reg = TRI->getLLVMRegNum(DwarfReg, true)) 485 OS << printReg(*Reg, TRI); 486 else 487 OS << "<badreg>"; 488 } 489 490 static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, 491 ModuleSlotTracker &MST) { 492 OS << "%ir-block."; 493 if (BB.hasName()) { 494 printLLVMNameWithoutPrefix(OS, BB.getName()); 495 return; 496 } 497 std::optional<int> Slot; 498 if (const Function *F = BB.getParent()) { 499 if (F == MST.getCurrentFunction()) { 500 Slot = MST.getLocalSlot(&BB); 501 } else if (const Module *M = F->getParent()) { 502 ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false); 503 CustomMST.incorporateFunction(*F); 504 Slot = CustomMST.getLocalSlot(&BB); 505 } 506 } 507 if (Slot) 508 MachineOperand::printIRSlotNumber(OS, *Slot); 509 else 510 OS << "<unknown>"; 511 } 512 513 static void printSyncScope(raw_ostream &OS, const LLVMContext &Context, 514 SyncScope::ID SSID, 515 SmallVectorImpl<StringRef> &SSNs) { 516 switch (SSID) { 517 case SyncScope::System: 518 break; 519 default: 520 if (SSNs.empty()) 521 Context.getSyncScopeNames(SSNs); 522 523 OS << "syncscope(\""; 524 printEscapedString(SSNs[SSID], OS); 525 OS << "\") "; 526 break; 527 } 528 } 529 530 static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, 531 unsigned TMMOFlag) { 532 auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); 533 for (const auto &I : Flags) { 534 if (I.first == TMMOFlag) { 535 return I.second; 536 } 537 } 538 return nullptr; 539 } 540 541 static void printFrameIndex(raw_ostream& OS, int FrameIndex, bool IsFixed, 542 const MachineFrameInfo *MFI) { 543 StringRef Name; 544 if (MFI) { 545 IsFixed = MFI->isFixedObjectIndex(FrameIndex); 546 if (const AllocaInst *Alloca = MFI->getObjectAllocation(FrameIndex)) 547 if (Alloca->hasName()) 548 Name = Alloca->getName(); 549 if (IsFixed) 550 FrameIndex -= MFI->getObjectIndexBegin(); 551 } 552 MachineOperand::printStackObjectReference(OS, FrameIndex, IsFixed, Name); 553 } 554 555 void MachineOperand::printSubRegIdx(raw_ostream &OS, uint64_t Index, 556 const TargetRegisterInfo *TRI) { 557 OS << "%subreg."; 558 if (TRI && Index != 0 && Index < TRI->getNumSubRegIndices()) 559 OS << TRI->getSubRegIndexName(Index); 560 else 561 OS << Index; 562 } 563 564 void MachineOperand::printTargetFlags(raw_ostream &OS, 565 const MachineOperand &Op) { 566 if (!Op.getTargetFlags()) 567 return; 568 const MachineFunction *MF = getMFIfAvailable(Op); 569 if (!MF) 570 return; 571 572 const auto *TII = MF->getSubtarget().getInstrInfo(); 573 assert(TII && "expected instruction info"); 574 auto Flags = TII->decomposeMachineOperandsTargetFlags(Op.getTargetFlags()); 575 OS << "target-flags("; 576 const bool HasDirectFlags = Flags.first; 577 const bool HasBitmaskFlags = Flags.second; 578 if (!HasDirectFlags && !HasBitmaskFlags) { 579 OS << "<unknown>) "; 580 return; 581 } 582 if (HasDirectFlags) { 583 if (const auto *Name = getTargetFlagName(TII, Flags.first)) 584 OS << Name; 585 else 586 OS << "<unknown target flag>"; 587 } 588 if (!HasBitmaskFlags) { 589 OS << ") "; 590 return; 591 } 592 bool IsCommaNeeded = HasDirectFlags; 593 unsigned BitMask = Flags.second; 594 auto BitMasks = TII->getSerializableBitmaskMachineOperandTargetFlags(); 595 for (const auto &Mask : BitMasks) { 596 // Check if the flag's bitmask has the bits of the current mask set. 597 if ((BitMask & Mask.first) == Mask.first) { 598 if (IsCommaNeeded) 599 OS << ", "; 600 IsCommaNeeded = true; 601 OS << Mask.second; 602 // Clear the bits which were serialized from the flag's bitmask. 603 BitMask &= ~(Mask.first); 604 } 605 } 606 if (BitMask) { 607 // When the resulting flag's bitmask isn't zero, we know that we didn't 608 // serialize all of the bit flags. 609 if (IsCommaNeeded) 610 OS << ", "; 611 OS << "<unknown bitmask target flag>"; 612 } 613 OS << ") "; 614 } 615 616 void MachineOperand::printSymbol(raw_ostream &OS, MCSymbol &Sym) { 617 OS << "<mcsymbol " << Sym << ">"; 618 } 619 620 void MachineOperand::printStackObjectReference(raw_ostream &OS, 621 unsigned FrameIndex, 622 bool IsFixed, StringRef Name) { 623 if (IsFixed) { 624 OS << "%fixed-stack." << FrameIndex; 625 return; 626 } 627 628 OS << "%stack." << FrameIndex; 629 if (!Name.empty()) 630 OS << '.' << Name; 631 } 632 633 void MachineOperand::printOperandOffset(raw_ostream &OS, int64_t Offset) { 634 if (Offset == 0) 635 return; 636 if (Offset < 0) { 637 OS << " - " << -Offset; 638 return; 639 } 640 OS << " + " << Offset; 641 } 642 643 void MachineOperand::printIRSlotNumber(raw_ostream &OS, int Slot) { 644 if (Slot == -1) 645 OS << "<badref>"; 646 else 647 OS << Slot; 648 } 649 650 static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI, 651 const TargetRegisterInfo *TRI) { 652 switch (CFI.getOperation()) { 653 case MCCFIInstruction::OpSameValue: 654 OS << "same_value "; 655 if (MCSymbol *Label = CFI.getLabel()) 656 MachineOperand::printSymbol(OS, *Label); 657 printCFIRegister(CFI.getRegister(), OS, TRI); 658 break; 659 case MCCFIInstruction::OpRememberState: 660 OS << "remember_state "; 661 if (MCSymbol *Label = CFI.getLabel()) 662 MachineOperand::printSymbol(OS, *Label); 663 break; 664 case MCCFIInstruction::OpRestoreState: 665 OS << "restore_state "; 666 if (MCSymbol *Label = CFI.getLabel()) 667 MachineOperand::printSymbol(OS, *Label); 668 break; 669 case MCCFIInstruction::OpOffset: 670 OS << "offset "; 671 if (MCSymbol *Label = CFI.getLabel()) 672 MachineOperand::printSymbol(OS, *Label); 673 printCFIRegister(CFI.getRegister(), OS, TRI); 674 OS << ", " << CFI.getOffset(); 675 break; 676 case MCCFIInstruction::OpDefCfaRegister: 677 OS << "def_cfa_register "; 678 if (MCSymbol *Label = CFI.getLabel()) 679 MachineOperand::printSymbol(OS, *Label); 680 printCFIRegister(CFI.getRegister(), OS, TRI); 681 break; 682 case MCCFIInstruction::OpDefCfaOffset: 683 OS << "def_cfa_offset "; 684 if (MCSymbol *Label = CFI.getLabel()) 685 MachineOperand::printSymbol(OS, *Label); 686 OS << CFI.getOffset(); 687 break; 688 case MCCFIInstruction::OpDefCfa: 689 OS << "def_cfa "; 690 if (MCSymbol *Label = CFI.getLabel()) 691 MachineOperand::printSymbol(OS, *Label); 692 printCFIRegister(CFI.getRegister(), OS, TRI); 693 OS << ", " << CFI.getOffset(); 694 break; 695 case MCCFIInstruction::OpLLVMDefAspaceCfa: 696 OS << "llvm_def_aspace_cfa "; 697 if (MCSymbol *Label = CFI.getLabel()) 698 MachineOperand::printSymbol(OS, *Label); 699 printCFIRegister(CFI.getRegister(), OS, TRI); 700 OS << ", " << CFI.getOffset(); 701 OS << ", " << CFI.getAddressSpace(); 702 break; 703 case MCCFIInstruction::OpRelOffset: 704 OS << "rel_offset "; 705 if (MCSymbol *Label = CFI.getLabel()) 706 MachineOperand::printSymbol(OS, *Label); 707 printCFIRegister(CFI.getRegister(), OS, TRI); 708 OS << ", " << CFI.getOffset(); 709 break; 710 case MCCFIInstruction::OpAdjustCfaOffset: 711 OS << "adjust_cfa_offset "; 712 if (MCSymbol *Label = CFI.getLabel()) 713 MachineOperand::printSymbol(OS, *Label); 714 OS << CFI.getOffset(); 715 break; 716 case MCCFIInstruction::OpRestore: 717 OS << "restore "; 718 if (MCSymbol *Label = CFI.getLabel()) 719 MachineOperand::printSymbol(OS, *Label); 720 printCFIRegister(CFI.getRegister(), OS, TRI); 721 break; 722 case MCCFIInstruction::OpEscape: { 723 OS << "escape "; 724 if (MCSymbol *Label = CFI.getLabel()) 725 MachineOperand::printSymbol(OS, *Label); 726 if (!CFI.getValues().empty()) { 727 size_t e = CFI.getValues().size() - 1; 728 for (size_t i = 0; i < e; ++i) 729 OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", "; 730 OS << format("0x%02x", uint8_t(CFI.getValues()[e])); 731 } 732 break; 733 } 734 case MCCFIInstruction::OpUndefined: 735 OS << "undefined "; 736 if (MCSymbol *Label = CFI.getLabel()) 737 MachineOperand::printSymbol(OS, *Label); 738 printCFIRegister(CFI.getRegister(), OS, TRI); 739 break; 740 case MCCFIInstruction::OpRegister: 741 OS << "register "; 742 if (MCSymbol *Label = CFI.getLabel()) 743 MachineOperand::printSymbol(OS, *Label); 744 printCFIRegister(CFI.getRegister(), OS, TRI); 745 OS << ", "; 746 printCFIRegister(CFI.getRegister2(), OS, TRI); 747 break; 748 case MCCFIInstruction::OpWindowSave: 749 OS << "window_save "; 750 if (MCSymbol *Label = CFI.getLabel()) 751 MachineOperand::printSymbol(OS, *Label); 752 break; 753 case MCCFIInstruction::OpNegateRAState: 754 OS << "negate_ra_sign_state "; 755 if (MCSymbol *Label = CFI.getLabel()) 756 MachineOperand::printSymbol(OS, *Label); 757 break; 758 default: 759 // TODO: Print the other CFI Operations. 760 OS << "<unserializable cfi directive>"; 761 break; 762 } 763 } 764 765 void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI, 766 const TargetIntrinsicInfo *IntrinsicInfo) const { 767 print(OS, LLT{}, TRI, IntrinsicInfo); 768 } 769 770 void MachineOperand::print(raw_ostream &OS, LLT TypeToPrint, 771 const TargetRegisterInfo *TRI, 772 const TargetIntrinsicInfo *IntrinsicInfo) const { 773 tryToGetTargetInfo(*this, TRI, IntrinsicInfo); 774 ModuleSlotTracker DummyMST(nullptr); 775 print(OS, DummyMST, TypeToPrint, std::nullopt, /*PrintDef=*/false, 776 /*IsStandalone=*/true, 777 /*ShouldPrintRegisterTies=*/true, 778 /*TiedOperandIdx=*/0, TRI, IntrinsicInfo); 779 } 780 781 void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 782 LLT TypeToPrint, std::optional<unsigned> OpIdx, 783 bool PrintDef, bool IsStandalone, 784 bool ShouldPrintRegisterTies, 785 unsigned TiedOperandIdx, 786 const TargetRegisterInfo *TRI, 787 const TargetIntrinsicInfo *IntrinsicInfo) const { 788 printTargetFlags(OS, *this); 789 switch (getType()) { 790 case MachineOperand::MO_Register: { 791 Register Reg = getReg(); 792 if (isImplicit()) 793 OS << (isDef() ? "implicit-def " : "implicit "); 794 else if (PrintDef && isDef()) 795 // Print the 'def' flag only when the operand is defined after '='. 796 OS << "def "; 797 if (isInternalRead()) 798 OS << "internal "; 799 if (isDead()) 800 OS << "dead "; 801 if (isKill()) 802 OS << "killed "; 803 if (isUndef()) 804 OS << "undef "; 805 if (isEarlyClobber()) 806 OS << "early-clobber "; 807 if (getReg().isPhysical() && isRenamable()) 808 OS << "renamable "; 809 // isDebug() is exactly true for register operands of a DBG_VALUE. So we 810 // simply infer it when parsing and do not need to print it. 811 812 const MachineRegisterInfo *MRI = nullptr; 813 if (Reg.isVirtual()) { 814 if (const MachineFunction *MF = getMFIfAvailable(*this)) { 815 MRI = &MF->getRegInfo(); 816 } 817 } 818 819 OS << printReg(Reg, TRI, 0, MRI); 820 // Print the sub register. 821 if (unsigned SubReg = getSubReg()) { 822 if (TRI) 823 OS << '.' << TRI->getSubRegIndexName(SubReg); 824 else 825 OS << ".subreg" << SubReg; 826 } 827 // Print the register class / bank. 828 if (Reg.isVirtual()) { 829 if (const MachineFunction *MF = getMFIfAvailable(*this)) { 830 const MachineRegisterInfo &MRI = MF->getRegInfo(); 831 if (IsStandalone || !PrintDef || MRI.def_empty(Reg)) { 832 OS << ':'; 833 OS << printRegClassOrBank(Reg, MRI, TRI); 834 } 835 } 836 } 837 // Print ties. 838 if (ShouldPrintRegisterTies && isTied() && !isDef()) 839 OS << "(tied-def " << TiedOperandIdx << ")"; 840 // Print types. 841 if (TypeToPrint.isValid()) 842 OS << '(' << TypeToPrint << ')'; 843 break; 844 } 845 case MachineOperand::MO_Immediate: { 846 const MIRFormatter *Formatter = nullptr; 847 if (const MachineFunction *MF = getMFIfAvailable(*this)) { 848 const auto *TII = MF->getSubtarget().getInstrInfo(); 849 assert(TII && "expected instruction info"); 850 Formatter = TII->getMIRFormatter(); 851 } 852 if (Formatter) 853 Formatter->printImm(OS, *getParent(), OpIdx, getImm()); 854 else 855 OS << getImm(); 856 break; 857 } 858 case MachineOperand::MO_CImmediate: 859 getCImm()->printAsOperand(OS, /*PrintType=*/true, MST); 860 break; 861 case MachineOperand::MO_FPImmediate: 862 getFPImm()->printAsOperand(OS, /*PrintType=*/true, MST); 863 break; 864 case MachineOperand::MO_MachineBasicBlock: 865 OS << printMBBReference(*getMBB()); 866 break; 867 case MachineOperand::MO_FrameIndex: { 868 int FrameIndex = getIndex(); 869 bool IsFixed = false; 870 const MachineFrameInfo *MFI = nullptr; 871 if (const MachineFunction *MF = getMFIfAvailable(*this)) 872 MFI = &MF->getFrameInfo(); 873 printFrameIndex(OS, FrameIndex, IsFixed, MFI); 874 break; 875 } 876 case MachineOperand::MO_ConstantPoolIndex: 877 OS << "%const." << getIndex(); 878 printOperandOffset(OS, getOffset()); 879 break; 880 case MachineOperand::MO_TargetIndex: { 881 OS << "target-index("; 882 const char *Name = "<unknown>"; 883 if (const MachineFunction *MF = getMFIfAvailable(*this)) 884 if (const auto *TargetIndexName = ::getTargetIndexName(*MF, getIndex())) 885 Name = TargetIndexName; 886 OS << Name << ')'; 887 printOperandOffset(OS, getOffset()); 888 break; 889 } 890 case MachineOperand::MO_JumpTableIndex: 891 OS << printJumpTableEntryReference(getIndex()); 892 break; 893 case MachineOperand::MO_GlobalAddress: 894 getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST); 895 printOperandOffset(OS, getOffset()); 896 break; 897 case MachineOperand::MO_ExternalSymbol: { 898 StringRef Name = getSymbolName(); 899 OS << '&'; 900 if (Name.empty()) { 901 OS << "\"\""; 902 } else { 903 printLLVMNameWithoutPrefix(OS, Name); 904 } 905 printOperandOffset(OS, getOffset()); 906 break; 907 } 908 case MachineOperand::MO_BlockAddress: { 909 OS << "blockaddress("; 910 getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false, 911 MST); 912 OS << ", "; 913 printIRBlockReference(OS, *getBlockAddress()->getBasicBlock(), MST); 914 OS << ')'; 915 MachineOperand::printOperandOffset(OS, getOffset()); 916 break; 917 } 918 case MachineOperand::MO_RegisterMask: { 919 OS << "<regmask"; 920 if (TRI) { 921 unsigned NumRegsInMask = 0; 922 unsigned NumRegsEmitted = 0; 923 for (unsigned i = 0; i < TRI->getNumRegs(); ++i) { 924 unsigned MaskWord = i / 32; 925 unsigned MaskBit = i % 32; 926 if (getRegMask()[MaskWord] & (1 << MaskBit)) { 927 if (PrintRegMaskNumRegs < 0 || 928 NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) { 929 OS << " " << printReg(i, TRI); 930 NumRegsEmitted++; 931 } 932 NumRegsInMask++; 933 } 934 } 935 if (NumRegsEmitted != NumRegsInMask) 936 OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more..."; 937 } else { 938 OS << " ..."; 939 } 940 OS << ">"; 941 break; 942 } 943 case MachineOperand::MO_RegisterLiveOut: { 944 const uint32_t *RegMask = getRegLiveOut(); 945 OS << "liveout("; 946 if (!TRI) { 947 OS << "<unknown>"; 948 } else { 949 bool IsCommaNeeded = false; 950 for (unsigned Reg = 0, E = TRI->getNumRegs(); Reg < E; ++Reg) { 951 if (RegMask[Reg / 32] & (1U << (Reg % 32))) { 952 if (IsCommaNeeded) 953 OS << ", "; 954 OS << printReg(Reg, TRI); 955 IsCommaNeeded = true; 956 } 957 } 958 } 959 OS << ")"; 960 break; 961 } 962 case MachineOperand::MO_Metadata: 963 getMetadata()->printAsOperand(OS, MST); 964 break; 965 case MachineOperand::MO_MCSymbol: 966 printSymbol(OS, *getMCSymbol()); 967 break; 968 case MachineOperand::MO_DbgInstrRef: { 969 OS << "dbg-instr-ref(" << getInstrRefInstrIndex() << ", " 970 << getInstrRefOpIndex() << ')'; 971 break; 972 } 973 case MachineOperand::MO_CFIIndex: { 974 if (const MachineFunction *MF = getMFIfAvailable(*this)) 975 printCFI(OS, MF->getFrameInstructions()[getCFIIndex()], TRI); 976 else 977 OS << "<cfi directive>"; 978 break; 979 } 980 case MachineOperand::MO_IntrinsicID: { 981 Intrinsic::ID ID = getIntrinsicID(); 982 if (ID < Intrinsic::num_intrinsics) 983 OS << "intrinsic(@" << Intrinsic::getBaseName(ID) << ')'; 984 else if (IntrinsicInfo) 985 OS << "intrinsic(@" << IntrinsicInfo->getName(ID) << ')'; 986 else 987 OS << "intrinsic(" << ID << ')'; 988 break; 989 } 990 case MachineOperand::MO_Predicate: { 991 auto Pred = static_cast<CmpInst::Predicate>(getPredicate()); 992 OS << (CmpInst::isIntPredicate(Pred) ? "int" : "float") << "pred(" 993 << Pred << ')'; 994 break; 995 } 996 case MachineOperand::MO_ShuffleMask: 997 OS << "shufflemask("; 998 ArrayRef<int> Mask = getShuffleMask(); 999 StringRef Separator; 1000 for (int Elt : Mask) { 1001 if (Elt == -1) 1002 OS << Separator << "undef"; 1003 else 1004 OS << Separator << Elt; 1005 Separator = ", "; 1006 } 1007 1008 OS << ')'; 1009 break; 1010 } 1011 } 1012 1013 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1014 LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; } 1015 #endif 1016 1017 //===----------------------------------------------------------------------===// 1018 // MachineMemOperand Implementation 1019 //===----------------------------------------------------------------------===// 1020 1021 /// getAddrSpace - Return the LLVM IR address space number that this pointer 1022 /// points into. 1023 unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; } 1024 1025 /// isDereferenceable - Return true if V is always dereferenceable for 1026 /// Offset + Size byte. 1027 bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C, 1028 const DataLayout &DL) const { 1029 if (!isa<const Value *>(V)) 1030 return false; 1031 1032 const Value *BasePtr = cast<const Value *>(V); 1033 if (BasePtr == nullptr) 1034 return false; 1035 1036 return isDereferenceableAndAlignedPointer( 1037 BasePtr, Align(1), APInt(DL.getPointerSizeInBits(), Offset + Size), DL); 1038 } 1039 1040 /// getConstantPool - Return a MachinePointerInfo record that refers to the 1041 /// constant pool. 1042 MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) { 1043 return MachinePointerInfo(MF.getPSVManager().getConstantPool()); 1044 } 1045 1046 /// getFixedStack - Return a MachinePointerInfo record that refers to the 1047 /// the specified FrameIndex. 1048 MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF, 1049 int FI, int64_t Offset) { 1050 return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset); 1051 } 1052 1053 MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) { 1054 return MachinePointerInfo(MF.getPSVManager().getJumpTable()); 1055 } 1056 1057 MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) { 1058 return MachinePointerInfo(MF.getPSVManager().getGOT()); 1059 } 1060 1061 MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF, 1062 int64_t Offset, uint8_t ID) { 1063 return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID); 1064 } 1065 1066 MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) { 1067 return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace()); 1068 } 1069 1070 MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 1071 LLT type, Align a, const AAMDNodes &AAInfo, 1072 const MDNode *Ranges, SyncScope::ID SSID, 1073 AtomicOrdering Ordering, 1074 AtomicOrdering FailureOrdering) 1075 : PtrInfo(ptrinfo), MemoryType(type), FlagVals(f), BaseAlign(a), 1076 AAInfo(AAInfo), Ranges(Ranges) { 1077 assert((PtrInfo.V.isNull() || isa<const PseudoSourceValue *>(PtrInfo.V) || 1078 isa<PointerType>(cast<const Value *>(PtrInfo.V)->getType())) && 1079 "invalid pointer value"); 1080 assert((isLoad() || isStore()) && "Not a load/store!"); 1081 1082 AtomicInfo.SSID = static_cast<unsigned>(SSID); 1083 assert(getSyncScopeID() == SSID && "Value truncated"); 1084 AtomicInfo.Ordering = static_cast<unsigned>(Ordering); 1085 assert(getSuccessOrdering() == Ordering && "Value truncated"); 1086 AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering); 1087 assert(getFailureOrdering() == FailureOrdering && "Value truncated"); 1088 } 1089 1090 MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 1091 uint64_t s, Align a, 1092 const AAMDNodes &AAInfo, 1093 const MDNode *Ranges, SyncScope::ID SSID, 1094 AtomicOrdering Ordering, 1095 AtomicOrdering FailureOrdering) 1096 : MachineMemOperand(ptrinfo, f, 1097 s == ~UINT64_C(0) ? LLT() : LLT::scalar(8 * s), a, 1098 AAInfo, Ranges, SSID, Ordering, FailureOrdering) {} 1099 1100 void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) { 1101 // The Value and Offset may differ due to CSE. But the flags and size 1102 // should be the same. 1103 assert(MMO->getFlags() == getFlags() && "Flags mismatch!"); 1104 assert((MMO->getSize() == ~UINT64_C(0) || getSize() == ~UINT64_C(0) || 1105 MMO->getSize() == getSize()) && 1106 "Size mismatch!"); 1107 1108 if (MMO->getBaseAlign() >= getBaseAlign()) { 1109 // Update the alignment value. 1110 BaseAlign = MMO->getBaseAlign(); 1111 // Also update the base and offset, because the new alignment may 1112 // not be applicable with the old ones. 1113 PtrInfo = MMO->PtrInfo; 1114 } 1115 } 1116 1117 /// getAlign - Return the minimum known alignment in bytes of the 1118 /// actual memory reference. 1119 Align MachineMemOperand::getAlign() const { 1120 return commonAlignment(getBaseAlign(), getOffset()); 1121 } 1122 1123 void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 1124 SmallVectorImpl<StringRef> &SSNs, 1125 const LLVMContext &Context, 1126 const MachineFrameInfo *MFI, 1127 const TargetInstrInfo *TII) const { 1128 OS << '('; 1129 if (isVolatile()) 1130 OS << "volatile "; 1131 if (isNonTemporal()) 1132 OS << "non-temporal "; 1133 if (isDereferenceable()) 1134 OS << "dereferenceable "; 1135 if (isInvariant()) 1136 OS << "invariant "; 1137 if (TII) { 1138 if (getFlags() & MachineMemOperand::MOTargetFlag1) 1139 OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag1) 1140 << "\" "; 1141 if (getFlags() & MachineMemOperand::MOTargetFlag2) 1142 OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag2) 1143 << "\" "; 1144 if (getFlags() & MachineMemOperand::MOTargetFlag3) 1145 OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag3) 1146 << "\" "; 1147 } else { 1148 if (getFlags() & MachineMemOperand::MOTargetFlag1) 1149 OS << "\"MOTargetFlag1\" "; 1150 if (getFlags() & MachineMemOperand::MOTargetFlag2) 1151 OS << "\"MOTargetFlag2\" "; 1152 if (getFlags() & MachineMemOperand::MOTargetFlag3) 1153 OS << "\"MOTargetFlag3\" "; 1154 } 1155 1156 assert((isLoad() || isStore()) && 1157 "machine memory operand must be a load or store (or both)"); 1158 if (isLoad()) 1159 OS << "load "; 1160 if (isStore()) 1161 OS << "store "; 1162 1163 printSyncScope(OS, Context, getSyncScopeID(), SSNs); 1164 1165 if (getSuccessOrdering() != AtomicOrdering::NotAtomic) 1166 OS << toIRString(getSuccessOrdering()) << ' '; 1167 if (getFailureOrdering() != AtomicOrdering::NotAtomic) 1168 OS << toIRString(getFailureOrdering()) << ' '; 1169 1170 if (getMemoryType().isValid()) 1171 OS << '(' << getMemoryType() << ')'; 1172 else 1173 OS << "unknown-size"; 1174 1175 if (const Value *Val = getValue()) { 1176 OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1177 MIRFormatter::printIRValue(OS, *Val, MST); 1178 } else if (const PseudoSourceValue *PVal = getPseudoValue()) { 1179 OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1180 assert(PVal && "Expected a pseudo source value"); 1181 switch (PVal->kind()) { 1182 case PseudoSourceValue::Stack: 1183 OS << "stack"; 1184 break; 1185 case PseudoSourceValue::GOT: 1186 OS << "got"; 1187 break; 1188 case PseudoSourceValue::JumpTable: 1189 OS << "jump-table"; 1190 break; 1191 case PseudoSourceValue::ConstantPool: 1192 OS << "constant-pool"; 1193 break; 1194 case PseudoSourceValue::FixedStack: { 1195 int FrameIndex = cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex(); 1196 bool IsFixed = true; 1197 printFrameIndex(OS, FrameIndex, IsFixed, MFI); 1198 break; 1199 } 1200 case PseudoSourceValue::GlobalValueCallEntry: 1201 OS << "call-entry "; 1202 cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( 1203 OS, /*PrintType=*/false, MST); 1204 break; 1205 case PseudoSourceValue::ExternalSymbolCallEntry: 1206 OS << "call-entry &"; 1207 printLLVMNameWithoutPrefix( 1208 OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); 1209 break; 1210 default: { 1211 const MIRFormatter *Formatter = TII->getMIRFormatter(); 1212 // FIXME: This is not necessarily the correct MIR serialization format for 1213 // a custom pseudo source value, but at least it allows 1214 // MIR printing to work on a target with custom pseudo source 1215 // values. 1216 OS << "custom \""; 1217 Formatter->printCustomPseudoSourceValue(OS, MST, *PVal); 1218 OS << '\"'; 1219 break; 1220 } 1221 } 1222 } else if (getOpaqueValue() == nullptr && getOffset() != 0) { 1223 OS << ((isLoad() && isStore()) ? " on " 1224 : isLoad() ? " from " 1225 : " into ") 1226 << "unknown-address"; 1227 } 1228 MachineOperand::printOperandOffset(OS, getOffset()); 1229 if (getSize() > 0 && getAlign() != getSize()) 1230 OS << ", align " << getAlign().value(); 1231 if (getAlign() != getBaseAlign()) 1232 OS << ", basealign " << getBaseAlign().value(); 1233 auto AAInfo = getAAInfo(); 1234 if (AAInfo.TBAA) { 1235 OS << ", !tbaa "; 1236 AAInfo.TBAA->printAsOperand(OS, MST); 1237 } 1238 if (AAInfo.Scope) { 1239 OS << ", !alias.scope "; 1240 AAInfo.Scope->printAsOperand(OS, MST); 1241 } 1242 if (AAInfo.NoAlias) { 1243 OS << ", !noalias "; 1244 AAInfo.NoAlias->printAsOperand(OS, MST); 1245 } 1246 if (getRanges()) { 1247 OS << ", !range "; 1248 getRanges()->printAsOperand(OS, MST); 1249 } 1250 // FIXME: Implement addrspace printing/parsing in MIR. 1251 // For now, print this even though parsing it is not available in MIR. 1252 if (unsigned AS = getAddrSpace()) 1253 OS << ", addrspace " << AS; 1254 1255 OS << ')'; 1256 } 1257