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