1aa739695SFrancis Visoiu Mistrih //===- lib/CodeGen/MachineOperand.cpp -------------------------------------===// 2aa739695SFrancis Visoiu Mistrih // 3aa739695SFrancis Visoiu Mistrih // The LLVM Compiler Infrastructure 4aa739695SFrancis Visoiu Mistrih // 5aa739695SFrancis Visoiu Mistrih // This file is distributed under the University of Illinois Open Source 6aa739695SFrancis Visoiu Mistrih // License. See LICENSE.TXT for details. 7aa739695SFrancis Visoiu Mistrih // 8aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 9aa739695SFrancis Visoiu Mistrih // 103aa8eaa9SFrancis Visoiu Mistrih /// \file Methods common to all machine operands. 11aa739695SFrancis Visoiu Mistrih // 12aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 13aa739695SFrancis Visoiu Mistrih 14aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineOperand.h" 15e85b06d6SFrancis Visoiu Mistrih #include "llvm/ADT/StringExtras.h" 16aa739695SFrancis Visoiu Mistrih #include "llvm/Analysis/Loads.h" 17aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MIRPrinter.h" 180b5bdceaSFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineFrameInfo.h" 19b41dbbe3SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineJumpTableInfo.h" 20aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineRegisterInfo.h" 21b3a0d513SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetInstrInfo.h" 22aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetRegisterInfo.h" 23aa739695SFrancis Visoiu Mistrih #include "llvm/IR/Constants.h" 24e76c5fcdSFrancis Visoiu Mistrih #include "llvm/IR/IRPrintingPasses.h" 25aa739695SFrancis Visoiu Mistrih #include "llvm/IR/ModuleSlotTracker.h" 26a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetIntrinsicInfo.h" 27a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetMachine.h" 28aa739695SFrancis Visoiu Mistrih 29aa739695SFrancis Visoiu Mistrih using namespace llvm; 30aa739695SFrancis Visoiu Mistrih 31aa739695SFrancis Visoiu Mistrih static cl::opt<int> 32aa739695SFrancis Visoiu Mistrih PrintRegMaskNumRegs("print-regmask-num-regs", 33aa739695SFrancis Visoiu Mistrih cl::desc("Number of registers to limit to when " 34aa739695SFrancis Visoiu Mistrih "printing regmask operands in IR dumps. " 35aa739695SFrancis Visoiu Mistrih "unlimited = -1"), 36aa739695SFrancis Visoiu Mistrih cl::init(32), cl::Hidden); 37aa739695SFrancis Visoiu Mistrih 3895a05915SFrancis Visoiu Mistrih static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) { 3995a05915SFrancis Visoiu Mistrih if (const MachineInstr *MI = MO.getParent()) 4095a05915SFrancis Visoiu Mistrih if (const MachineBasicBlock *MBB = MI->getParent()) 4195a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = MBB->getParent()) 4295a05915SFrancis Visoiu Mistrih return MF; 4395a05915SFrancis Visoiu Mistrih return nullptr; 4495a05915SFrancis Visoiu Mistrih } 4595a05915SFrancis Visoiu Mistrih static MachineFunction *getMFIfAvailable(MachineOperand &MO) { 4695a05915SFrancis Visoiu Mistrih return const_cast<MachineFunction *>( 4795a05915SFrancis Visoiu Mistrih getMFIfAvailable(const_cast<const MachineOperand &>(MO))); 4895a05915SFrancis Visoiu Mistrih } 4995a05915SFrancis Visoiu Mistrih 50aa739695SFrancis Visoiu Mistrih void MachineOperand::setReg(unsigned Reg) { 51aa739695SFrancis Visoiu Mistrih if (getReg() == Reg) 52aa739695SFrancis Visoiu Mistrih return; // No change. 53aa739695SFrancis Visoiu Mistrih 54f8bf2ec0SGeoff Berry // Clear the IsRenamable bit to keep it conservatively correct. 55f8bf2ec0SGeoff Berry IsRenamable = false; 56f8bf2ec0SGeoff Berry 57aa739695SFrancis Visoiu Mistrih // Otherwise, we have to change the register. If this operand is embedded 58aa739695SFrancis Visoiu Mistrih // into a machine function, we need to update the old and new register's 59aa739695SFrancis Visoiu Mistrih // use/def lists. 6095a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 61aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 62aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 63aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 64aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 65aa739695SFrancis Visoiu Mistrih return; 66aa739695SFrancis Visoiu Mistrih } 67aa739695SFrancis Visoiu Mistrih 68aa739695SFrancis Visoiu Mistrih // Otherwise, just change the register, no problem. :) 69aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 70aa739695SFrancis Visoiu Mistrih } 71aa739695SFrancis Visoiu Mistrih 72aa739695SFrancis Visoiu Mistrih void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx, 73aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo &TRI) { 74aa739695SFrancis Visoiu Mistrih assert(TargetRegisterInfo::isVirtualRegister(Reg)); 75aa739695SFrancis Visoiu Mistrih if (SubIdx && getSubReg()) 76aa739695SFrancis Visoiu Mistrih SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg()); 77aa739695SFrancis Visoiu Mistrih setReg(Reg); 78aa739695SFrancis Visoiu Mistrih if (SubIdx) 79aa739695SFrancis Visoiu Mistrih setSubReg(SubIdx); 80aa739695SFrancis Visoiu Mistrih } 81aa739695SFrancis Visoiu Mistrih 82aa739695SFrancis Visoiu Mistrih void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) { 83aa739695SFrancis Visoiu Mistrih assert(TargetRegisterInfo::isPhysicalRegister(Reg)); 84aa739695SFrancis Visoiu Mistrih if (getSubReg()) { 85aa739695SFrancis Visoiu Mistrih Reg = TRI.getSubReg(Reg, getSubReg()); 86aa739695SFrancis Visoiu Mistrih // Note that getSubReg() may return 0 if the sub-register doesn't exist. 87aa739695SFrancis Visoiu Mistrih // That won't happen in legal code. 88aa739695SFrancis Visoiu Mistrih setSubReg(0); 89aa739695SFrancis Visoiu Mistrih if (isDef()) 90aa739695SFrancis Visoiu Mistrih setIsUndef(false); 91aa739695SFrancis Visoiu Mistrih } 92aa739695SFrancis Visoiu Mistrih setReg(Reg); 93aa739695SFrancis Visoiu Mistrih } 94aa739695SFrancis Visoiu Mistrih 95aa739695SFrancis Visoiu Mistrih /// Change a def to a use, or a use to a def. 96aa739695SFrancis Visoiu Mistrih void MachineOperand::setIsDef(bool Val) { 97aa739695SFrancis Visoiu Mistrih assert(isReg() && "Wrong MachineOperand accessor"); 98aa739695SFrancis Visoiu Mistrih assert((!Val || !isDebug()) && "Marking a debug operation as def"); 99aa739695SFrancis Visoiu Mistrih if (IsDef == Val) 100aa739695SFrancis Visoiu Mistrih return; 10160c43102SGeoff Berry assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported"); 102aa739695SFrancis Visoiu Mistrih // MRI may keep uses and defs in different list positions. 10395a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 104aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 105aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 106aa739695SFrancis Visoiu Mistrih IsDef = Val; 107aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 108aa739695SFrancis Visoiu Mistrih return; 109aa739695SFrancis Visoiu Mistrih } 110aa739695SFrancis Visoiu Mistrih IsDef = Val; 111aa739695SFrancis Visoiu Mistrih } 112aa739695SFrancis Visoiu Mistrih 11360c43102SGeoff Berry bool MachineOperand::isRenamable() const { 11460c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 11560c43102SGeoff Berry assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && 11660c43102SGeoff Berry "isRenamable should only be checked on physical registers"); 117f8bf2ec0SGeoff Berry if (!IsRenamable) 118f8bf2ec0SGeoff Berry return false; 119f8bf2ec0SGeoff Berry 120f8bf2ec0SGeoff Berry const MachineInstr *MI = getParent(); 121f8bf2ec0SGeoff Berry if (!MI) 122f8bf2ec0SGeoff Berry return true; 123f8bf2ec0SGeoff Berry 124f8bf2ec0SGeoff Berry if (isDef()) 125f8bf2ec0SGeoff Berry return !MI->hasExtraDefRegAllocReq(MachineInstr::IgnoreBundle); 126f8bf2ec0SGeoff Berry 127f8bf2ec0SGeoff Berry assert(isUse() && "Reg is not def or use"); 128f8bf2ec0SGeoff Berry return !MI->hasExtraSrcRegAllocReq(MachineInstr::IgnoreBundle); 12960c43102SGeoff Berry } 13060c43102SGeoff Berry 13160c43102SGeoff Berry void MachineOperand::setIsRenamable(bool Val) { 13260c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 13360c43102SGeoff Berry assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && 13460c43102SGeoff Berry "setIsRenamable should only be called on physical registers"); 13560c43102SGeoff Berry IsRenamable = Val; 13660c43102SGeoff Berry } 13760c43102SGeoff Berry 138aa739695SFrancis Visoiu Mistrih // If this operand is currently a register operand, and if this is in a 139aa739695SFrancis Visoiu Mistrih // function, deregister the operand from the register's use/def list. 140aa739695SFrancis Visoiu Mistrih void MachineOperand::removeRegFromUses() { 141aa739695SFrancis Visoiu Mistrih if (!isReg() || !isOnRegUseList()) 142aa739695SFrancis Visoiu Mistrih return; 143aa739695SFrancis Visoiu Mistrih 14495a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 145aa739695SFrancis Visoiu Mistrih MF->getRegInfo().removeRegOperandFromUseList(this); 146aa739695SFrancis Visoiu Mistrih } 147aa739695SFrancis Visoiu Mistrih 148aa739695SFrancis Visoiu Mistrih /// ChangeToImmediate - Replace this operand with a new immediate operand of 149aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an immediate already, 150aa739695SFrancis Visoiu Mistrih /// the setImm method should be used. 151aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToImmediate(int64_t ImmVal) { 152aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 153aa739695SFrancis Visoiu Mistrih 154aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 155aa739695SFrancis Visoiu Mistrih 156aa739695SFrancis Visoiu Mistrih OpKind = MO_Immediate; 157aa739695SFrancis Visoiu Mistrih Contents.ImmVal = ImmVal; 158aa739695SFrancis Visoiu Mistrih } 159aa739695SFrancis Visoiu Mistrih 160aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) { 161aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 162aa739695SFrancis Visoiu Mistrih 163aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 164aa739695SFrancis Visoiu Mistrih 165aa739695SFrancis Visoiu Mistrih OpKind = MO_FPImmediate; 166aa739695SFrancis Visoiu Mistrih Contents.CFP = FPImm; 167aa739695SFrancis Visoiu Mistrih } 168aa739695SFrancis Visoiu Mistrih 169aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToES(const char *SymName, 170aa739695SFrancis Visoiu Mistrih unsigned char TargetFlags) { 171aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 172aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an external symbol"); 173aa739695SFrancis Visoiu Mistrih 174aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 175aa739695SFrancis Visoiu Mistrih 176aa739695SFrancis Visoiu Mistrih OpKind = MO_ExternalSymbol; 177aa739695SFrancis Visoiu Mistrih Contents.OffsetedInfo.Val.SymbolName = SymName; 178aa739695SFrancis Visoiu Mistrih setOffset(0); // Offset is always 0. 179aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 180aa739695SFrancis Visoiu Mistrih } 181aa739695SFrancis Visoiu Mistrih 182aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) { 183aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 184aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an MCSymbol"); 185aa739695SFrancis Visoiu Mistrih 186aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 187aa739695SFrancis Visoiu Mistrih 188aa739695SFrancis Visoiu Mistrih OpKind = MO_MCSymbol; 189aa739695SFrancis Visoiu Mistrih Contents.Sym = Sym; 190aa739695SFrancis Visoiu Mistrih } 191aa739695SFrancis Visoiu Mistrih 192aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToFrameIndex(int Idx) { 193aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 194aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 195aa739695SFrancis Visoiu Mistrih 196aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 197aa739695SFrancis Visoiu Mistrih 198aa739695SFrancis Visoiu Mistrih OpKind = MO_FrameIndex; 199aa739695SFrancis Visoiu Mistrih setIndex(Idx); 200aa739695SFrancis Visoiu Mistrih } 201aa739695SFrancis Visoiu Mistrih 202aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset, 203aa739695SFrancis Visoiu Mistrih unsigned char TargetFlags) { 204aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 205aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 206aa739695SFrancis Visoiu Mistrih 207aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 208aa739695SFrancis Visoiu Mistrih 209aa739695SFrancis Visoiu Mistrih OpKind = MO_TargetIndex; 210aa739695SFrancis Visoiu Mistrih setIndex(Idx); 211aa739695SFrancis Visoiu Mistrih setOffset(Offset); 212aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 213aa739695SFrancis Visoiu Mistrih } 214aa739695SFrancis Visoiu Mistrih 215aa739695SFrancis Visoiu Mistrih /// ChangeToRegister - Replace this operand with a new register operand of 216aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an register already, 217aa739695SFrancis Visoiu Mistrih /// the setReg method should be used. 218aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp, 219aa739695SFrancis Visoiu Mistrih bool isKill, bool isDead, bool isUndef, 220aa739695SFrancis Visoiu Mistrih bool isDebug) { 221aa739695SFrancis Visoiu Mistrih MachineRegisterInfo *RegInfo = nullptr; 22295a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 223aa739695SFrancis Visoiu Mistrih RegInfo = &MF->getRegInfo(); 224aa739695SFrancis Visoiu Mistrih // If this operand is already a register operand, remove it from the 225aa739695SFrancis Visoiu Mistrih // register's use/def lists. 226aa739695SFrancis Visoiu Mistrih bool WasReg = isReg(); 227aa739695SFrancis Visoiu Mistrih if (RegInfo && WasReg) 228aa739695SFrancis Visoiu Mistrih RegInfo->removeRegOperandFromUseList(this); 229aa739695SFrancis Visoiu Mistrih 230aa739695SFrancis Visoiu Mistrih // Change this to a register and set the reg#. 23160c43102SGeoff Berry assert(!(isDead && !isDef) && "Dead flag on non-def"); 23260c43102SGeoff Berry assert(!(isKill && isDef) && "Kill flag on def"); 233aa739695SFrancis Visoiu Mistrih OpKind = MO_Register; 234aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 235aa739695SFrancis Visoiu Mistrih SubReg_TargetFlags = 0; 236aa739695SFrancis Visoiu Mistrih IsDef = isDef; 237aa739695SFrancis Visoiu Mistrih IsImp = isImp; 23860c43102SGeoff Berry IsDeadOrKill = isKill | isDead; 23960c43102SGeoff Berry IsRenamable = false; 240aa739695SFrancis Visoiu Mistrih IsUndef = isUndef; 241aa739695SFrancis Visoiu Mistrih IsInternalRead = false; 242aa739695SFrancis Visoiu Mistrih IsEarlyClobber = false; 243aa739695SFrancis Visoiu Mistrih IsDebug = isDebug; 244aa739695SFrancis Visoiu Mistrih // Ensure isOnRegUseList() returns false. 245aa739695SFrancis Visoiu Mistrih Contents.Reg.Prev = nullptr; 246aa739695SFrancis Visoiu Mistrih // Preserve the tie when the operand was already a register. 247aa739695SFrancis Visoiu Mistrih if (!WasReg) 248aa739695SFrancis Visoiu Mistrih TiedTo = 0; 249aa739695SFrancis Visoiu Mistrih 250aa739695SFrancis Visoiu Mistrih // If this operand is embedded in a function, add the operand to the 251aa739695SFrancis Visoiu Mistrih // register's use/def list. 252aa739695SFrancis Visoiu Mistrih if (RegInfo) 253aa739695SFrancis Visoiu Mistrih RegInfo->addRegOperandToUseList(this); 254aa739695SFrancis Visoiu Mistrih } 255aa739695SFrancis Visoiu Mistrih 256aa739695SFrancis Visoiu Mistrih /// isIdenticalTo - Return true if this operand is identical to the specified 257aa739695SFrancis Visoiu Mistrih /// operand. Note that this should stay in sync with the hash_value overload 258aa739695SFrancis Visoiu Mistrih /// below. 259aa739695SFrancis Visoiu Mistrih bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 260aa739695SFrancis Visoiu Mistrih if (getType() != Other.getType() || 261aa739695SFrancis Visoiu Mistrih getTargetFlags() != Other.getTargetFlags()) 262aa739695SFrancis Visoiu Mistrih return false; 263aa739695SFrancis Visoiu Mistrih 264aa739695SFrancis Visoiu Mistrih switch (getType()) { 265aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 266aa739695SFrancis Visoiu Mistrih return getReg() == Other.getReg() && isDef() == Other.isDef() && 267aa739695SFrancis Visoiu Mistrih getSubReg() == Other.getSubReg(); 268aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 269aa739695SFrancis Visoiu Mistrih return getImm() == Other.getImm(); 270aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 271aa739695SFrancis Visoiu Mistrih return getCImm() == Other.getCImm(); 272aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 273aa739695SFrancis Visoiu Mistrih return getFPImm() == Other.getFPImm(); 274aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 275aa739695SFrancis Visoiu Mistrih return getMBB() == Other.getMBB(); 276aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 277aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 278aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 279aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 280aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 281aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 282aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 283aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 284aa739695SFrancis Visoiu Mistrih return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 285aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 286aa739695SFrancis Visoiu Mistrih return strcmp(getSymbolName(), Other.getSymbolName()) == 0 && 287aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 288aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 289aa739695SFrancis Visoiu Mistrih return getBlockAddress() == Other.getBlockAddress() && 290aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 291aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 292aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: { 293aa739695SFrancis Visoiu Mistrih // Shallow compare of the two RegMasks 294aa739695SFrancis Visoiu Mistrih const uint32_t *RegMask = getRegMask(); 295aa739695SFrancis Visoiu Mistrih const uint32_t *OtherRegMask = Other.getRegMask(); 296aa739695SFrancis Visoiu Mistrih if (RegMask == OtherRegMask) 297aa739695SFrancis Visoiu Mistrih return true; 298aa739695SFrancis Visoiu Mistrih 29995a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 300aa739695SFrancis Visoiu Mistrih // Calculate the size of the RegMask 301aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); 302aa739695SFrancis Visoiu Mistrih unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32; 303aa739695SFrancis Visoiu Mistrih 304aa739695SFrancis Visoiu Mistrih // Deep compare of the two RegMasks 305aa739695SFrancis Visoiu Mistrih return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask); 306aa739695SFrancis Visoiu Mistrih } 30795a05915SFrancis Visoiu Mistrih // We don't know the size of the RegMask, so we can't deep compare the two 30895a05915SFrancis Visoiu Mistrih // reg masks. 30995a05915SFrancis Visoiu Mistrih return false; 31095a05915SFrancis Visoiu Mistrih } 311aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 312aa739695SFrancis Visoiu Mistrih return getMCSymbol() == Other.getMCSymbol(); 313aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 314aa739695SFrancis Visoiu Mistrih return getCFIIndex() == Other.getCFIIndex(); 315aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 316aa739695SFrancis Visoiu Mistrih return getMetadata() == Other.getMetadata(); 317aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 318aa739695SFrancis Visoiu Mistrih return getIntrinsicID() == Other.getIntrinsicID(); 319aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 320aa739695SFrancis Visoiu Mistrih return getPredicate() == Other.getPredicate(); 321aa739695SFrancis Visoiu Mistrih } 322aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 323aa739695SFrancis Visoiu Mistrih } 324aa739695SFrancis Visoiu Mistrih 325aa739695SFrancis Visoiu Mistrih // Note: this must stay exactly in sync with isIdenticalTo above. 326aa739695SFrancis Visoiu Mistrih hash_code llvm::hash_value(const MachineOperand &MO) { 327aa739695SFrancis Visoiu Mistrih switch (MO.getType()) { 328aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 329aa739695SFrancis Visoiu Mistrih // Register operands don't have target flags. 330aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getReg(), MO.getSubReg(), MO.isDef()); 331aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 332aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm()); 333aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 334aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm()); 335aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 336aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm()); 337aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 338aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB()); 339aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 340aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 341aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 342aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 343aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(), 344aa739695SFrancis Visoiu Mistrih MO.getOffset()); 345aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 346aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 347aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 348aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(), 349aa739695SFrancis Visoiu Mistrih MO.getSymbolName()); 350aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 351aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(), 352aa739695SFrancis Visoiu Mistrih MO.getOffset()); 353aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 354aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(), 355aa739695SFrancis Visoiu Mistrih MO.getOffset()); 356aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 357aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: 358aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask()); 359aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 360aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata()); 361aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 362aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); 363aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 364aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex()); 365aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 366aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID()); 367aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 368aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate()); 369aa739695SFrancis Visoiu Mistrih } 370aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 371aa739695SFrancis Visoiu Mistrih } 372aa739695SFrancis Visoiu Mistrih 373a8a83d15SFrancis Visoiu Mistrih // Try to crawl up to the machine function and get TRI and IntrinsicInfo from 374a8a83d15SFrancis Visoiu Mistrih // it. 375a8a83d15SFrancis Visoiu Mistrih static void tryToGetTargetInfo(const MachineOperand &MO, 376a8a83d15SFrancis Visoiu Mistrih const TargetRegisterInfo *&TRI, 377a8a83d15SFrancis Visoiu Mistrih const TargetIntrinsicInfo *&IntrinsicInfo) { 378567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(MO)) { 379a8a83d15SFrancis Visoiu Mistrih TRI = MF->getSubtarget().getRegisterInfo(); 380a8a83d15SFrancis Visoiu Mistrih IntrinsicInfo = MF->getTarget().getIntrinsicInfo(); 381a8a83d15SFrancis Visoiu Mistrih } 382a8a83d15SFrancis Visoiu Mistrih } 383a8a83d15SFrancis Visoiu Mistrih 384b3a0d513SFrancis Visoiu Mistrih static const char *getTargetIndexName(const MachineFunction &MF, int Index) { 385b3a0d513SFrancis Visoiu Mistrih const auto *TII = MF.getSubtarget().getInstrInfo(); 386b3a0d513SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 387b3a0d513SFrancis Visoiu Mistrih auto Indices = TII->getSerializableTargetIndices(); 388b3a0d513SFrancis Visoiu Mistrih auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) { 389b3a0d513SFrancis Visoiu Mistrih return I.first == Index; 390b3a0d513SFrancis Visoiu Mistrih }); 391b3a0d513SFrancis Visoiu Mistrih if (Found != Indices.end()) 392b3a0d513SFrancis Visoiu Mistrih return Found->second; 393b3a0d513SFrancis Visoiu Mistrih return nullptr; 394b3a0d513SFrancis Visoiu Mistrih } 395b3a0d513SFrancis Visoiu Mistrih 3965df3bbf3SFrancis Visoiu Mistrih static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) { 3975df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->getSerializableDirectMachineOperandTargetFlags(); 3985df3bbf3SFrancis Visoiu Mistrih for (const auto &I : Flags) { 3995df3bbf3SFrancis Visoiu Mistrih if (I.first == TF) { 4005df3bbf3SFrancis Visoiu Mistrih return I.second; 4015df3bbf3SFrancis Visoiu Mistrih } 4025df3bbf3SFrancis Visoiu Mistrih } 4035df3bbf3SFrancis Visoiu Mistrih return nullptr; 4045df3bbf3SFrancis Visoiu Mistrih } 4055df3bbf3SFrancis Visoiu Mistrih 406874ae6faSFrancis Visoiu Mistrih static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS, 407874ae6faSFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 408874ae6faSFrancis Visoiu Mistrih if (!TRI) { 409874ae6faSFrancis Visoiu Mistrih OS << "%dwarfreg." << DwarfReg; 410874ae6faSFrancis Visoiu Mistrih return; 411874ae6faSFrancis Visoiu Mistrih } 412874ae6faSFrancis Visoiu Mistrih 413874ae6faSFrancis Visoiu Mistrih int Reg = TRI->getLLVMRegNum(DwarfReg, true); 414874ae6faSFrancis Visoiu Mistrih if (Reg == -1) { 415874ae6faSFrancis Visoiu Mistrih OS << "<badreg>"; 416874ae6faSFrancis Visoiu Mistrih return; 417874ae6faSFrancis Visoiu Mistrih } 418874ae6faSFrancis Visoiu Mistrih OS << printReg(Reg, TRI); 419874ae6faSFrancis Visoiu Mistrih } 420874ae6faSFrancis Visoiu Mistrih 421f81727d1SFrancis Visoiu Mistrih static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, 422f81727d1SFrancis Visoiu Mistrih ModuleSlotTracker &MST) { 423f81727d1SFrancis Visoiu Mistrih OS << "%ir-block."; 424f81727d1SFrancis Visoiu Mistrih if (BB.hasName()) { 425f81727d1SFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, BB.getName()); 426f81727d1SFrancis Visoiu Mistrih return; 427f81727d1SFrancis Visoiu Mistrih } 428f81727d1SFrancis Visoiu Mistrih Optional<int> Slot; 429f81727d1SFrancis Visoiu Mistrih if (const Function *F = BB.getParent()) { 430f81727d1SFrancis Visoiu Mistrih if (F == MST.getCurrentFunction()) { 431f81727d1SFrancis Visoiu Mistrih Slot = MST.getLocalSlot(&BB); 432f81727d1SFrancis Visoiu Mistrih } else if (const Module *M = F->getParent()) { 433f81727d1SFrancis Visoiu Mistrih ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false); 434f81727d1SFrancis Visoiu Mistrih CustomMST.incorporateFunction(*F); 435f81727d1SFrancis Visoiu Mistrih Slot = CustomMST.getLocalSlot(&BB); 436f81727d1SFrancis Visoiu Mistrih } 437f81727d1SFrancis Visoiu Mistrih } 438f81727d1SFrancis Visoiu Mistrih if (Slot) 439f81727d1SFrancis Visoiu Mistrih MachineOperand::printIRSlotNumber(OS, *Slot); 440f81727d1SFrancis Visoiu Mistrih else 441f81727d1SFrancis Visoiu Mistrih OS << "<unknown>"; 442f81727d1SFrancis Visoiu Mistrih } 443f81727d1SFrancis Visoiu Mistrih 444e85b06d6SFrancis Visoiu Mistrih static void printIRValueReference(raw_ostream &OS, const Value &V, 445e85b06d6SFrancis Visoiu Mistrih ModuleSlotTracker &MST) { 446e85b06d6SFrancis Visoiu Mistrih if (isa<GlobalValue>(V)) { 447e85b06d6SFrancis Visoiu Mistrih V.printAsOperand(OS, /*PrintType=*/false, MST); 448e85b06d6SFrancis Visoiu Mistrih return; 449e85b06d6SFrancis Visoiu Mistrih } 450e85b06d6SFrancis Visoiu Mistrih if (isa<Constant>(V)) { 451e85b06d6SFrancis Visoiu Mistrih // Machine memory operands can load/store to/from constant value pointers. 452e85b06d6SFrancis Visoiu Mistrih OS << '`'; 453e85b06d6SFrancis Visoiu Mistrih V.printAsOperand(OS, /*PrintType=*/true, MST); 454e85b06d6SFrancis Visoiu Mistrih OS << '`'; 455e85b06d6SFrancis Visoiu Mistrih return; 456e85b06d6SFrancis Visoiu Mistrih } 457e85b06d6SFrancis Visoiu Mistrih OS << "%ir."; 458e85b06d6SFrancis Visoiu Mistrih if (V.hasName()) { 459e85b06d6SFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, V.getName()); 460e85b06d6SFrancis Visoiu Mistrih return; 461e85b06d6SFrancis Visoiu Mistrih } 462e85b06d6SFrancis Visoiu Mistrih MachineOperand::printIRSlotNumber(OS, MST.getLocalSlot(&V)); 463e85b06d6SFrancis Visoiu Mistrih } 464e85b06d6SFrancis Visoiu Mistrih 465e85b06d6SFrancis Visoiu Mistrih static void printSyncScope(raw_ostream &OS, const LLVMContext &Context, 466e85b06d6SFrancis Visoiu Mistrih SyncScope::ID SSID, 467e85b06d6SFrancis Visoiu Mistrih SmallVectorImpl<StringRef> &SSNs) { 468e85b06d6SFrancis Visoiu Mistrih switch (SSID) { 469e85b06d6SFrancis Visoiu Mistrih case SyncScope::System: 470e85b06d6SFrancis Visoiu Mistrih break; 471e85b06d6SFrancis Visoiu Mistrih default: 472e85b06d6SFrancis Visoiu Mistrih if (SSNs.empty()) 473e85b06d6SFrancis Visoiu Mistrih Context.getSyncScopeNames(SSNs); 474e85b06d6SFrancis Visoiu Mistrih 475e85b06d6SFrancis Visoiu Mistrih OS << "syncscope(\""; 476e85b06d6SFrancis Visoiu Mistrih PrintEscapedString(SSNs[SSID], OS); 477e85b06d6SFrancis Visoiu Mistrih OS << "\") "; 478e85b06d6SFrancis Visoiu Mistrih break; 479e85b06d6SFrancis Visoiu Mistrih } 480e85b06d6SFrancis Visoiu Mistrih } 481e85b06d6SFrancis Visoiu Mistrih 482e85b06d6SFrancis Visoiu Mistrih static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, 483e85b06d6SFrancis Visoiu Mistrih unsigned TMMOFlag) { 484e85b06d6SFrancis Visoiu Mistrih auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); 485e85b06d6SFrancis Visoiu Mistrih for (const auto &I : Flags) { 486e85b06d6SFrancis Visoiu Mistrih if (I.first == TMMOFlag) { 487e85b06d6SFrancis Visoiu Mistrih return I.second; 488e85b06d6SFrancis Visoiu Mistrih } 489e85b06d6SFrancis Visoiu Mistrih } 490e85b06d6SFrancis Visoiu Mistrih return nullptr; 491e85b06d6SFrancis Visoiu Mistrih } 492e85b06d6SFrancis Visoiu Mistrih 493e85b06d6SFrancis Visoiu Mistrih static void printFrameIndex(raw_ostream& OS, int FrameIndex, bool IsFixed, 494e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI) { 495e85b06d6SFrancis Visoiu Mistrih StringRef Name; 496e85b06d6SFrancis Visoiu Mistrih if (MFI) { 497e85b06d6SFrancis Visoiu Mistrih IsFixed = MFI->isFixedObjectIndex(FrameIndex); 498e85b06d6SFrancis Visoiu Mistrih if (const AllocaInst *Alloca = MFI->getObjectAllocation(FrameIndex)) 499e85b06d6SFrancis Visoiu Mistrih if (Alloca->hasName()) 500e85b06d6SFrancis Visoiu Mistrih Name = Alloca->getName(); 501e85b06d6SFrancis Visoiu Mistrih if (IsFixed) 502e85b06d6SFrancis Visoiu Mistrih FrameIndex -= MFI->getObjectIndexBegin(); 503e85b06d6SFrancis Visoiu Mistrih } 504e85b06d6SFrancis Visoiu Mistrih MachineOperand::printStackObjectReference(OS, FrameIndex, IsFixed, Name); 505e85b06d6SFrancis Visoiu Mistrih } 506e85b06d6SFrancis Visoiu Mistrih 507ecd0b833SFrancis Visoiu Mistrih void MachineOperand::printSubRegIdx(raw_ostream &OS, uint64_t Index, 508440f69c9SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 509440f69c9SFrancis Visoiu Mistrih OS << "%subreg."; 510440f69c9SFrancis Visoiu Mistrih if (TRI) 511440f69c9SFrancis Visoiu Mistrih OS << TRI->getSubRegIndexName(Index); 512440f69c9SFrancis Visoiu Mistrih else 513440f69c9SFrancis Visoiu Mistrih OS << Index; 514440f69c9SFrancis Visoiu Mistrih } 515440f69c9SFrancis Visoiu Mistrih 5165df3bbf3SFrancis Visoiu Mistrih void MachineOperand::printTargetFlags(raw_ostream &OS, 5175df3bbf3SFrancis Visoiu Mistrih const MachineOperand &Op) { 5185df3bbf3SFrancis Visoiu Mistrih if (!Op.getTargetFlags()) 5195df3bbf3SFrancis Visoiu Mistrih return; 5205df3bbf3SFrancis Visoiu Mistrih const MachineFunction *MF = getMFIfAvailable(Op); 5215df3bbf3SFrancis Visoiu Mistrih if (!MF) 5225df3bbf3SFrancis Visoiu Mistrih return; 5235df3bbf3SFrancis Visoiu Mistrih 5245df3bbf3SFrancis Visoiu Mistrih const auto *TII = MF->getSubtarget().getInstrInfo(); 5255df3bbf3SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 5265df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->decomposeMachineOperandsTargetFlags(Op.getTargetFlags()); 5275df3bbf3SFrancis Visoiu Mistrih OS << "target-flags("; 5285df3bbf3SFrancis Visoiu Mistrih const bool HasDirectFlags = Flags.first; 5295df3bbf3SFrancis Visoiu Mistrih const bool HasBitmaskFlags = Flags.second; 5305df3bbf3SFrancis Visoiu Mistrih if (!HasDirectFlags && !HasBitmaskFlags) { 5315df3bbf3SFrancis Visoiu Mistrih OS << "<unknown>) "; 5325df3bbf3SFrancis Visoiu Mistrih return; 5335df3bbf3SFrancis Visoiu Mistrih } 5345df3bbf3SFrancis Visoiu Mistrih if (HasDirectFlags) { 5355df3bbf3SFrancis Visoiu Mistrih if (const auto *Name = getTargetFlagName(TII, Flags.first)) 5365df3bbf3SFrancis Visoiu Mistrih OS << Name; 5375df3bbf3SFrancis Visoiu Mistrih else 5385df3bbf3SFrancis Visoiu Mistrih OS << "<unknown target flag>"; 5395df3bbf3SFrancis Visoiu Mistrih } 5405df3bbf3SFrancis Visoiu Mistrih if (!HasBitmaskFlags) { 5415df3bbf3SFrancis Visoiu Mistrih OS << ") "; 5425df3bbf3SFrancis Visoiu Mistrih return; 5435df3bbf3SFrancis Visoiu Mistrih } 5445df3bbf3SFrancis Visoiu Mistrih bool IsCommaNeeded = HasDirectFlags; 5455df3bbf3SFrancis Visoiu Mistrih unsigned BitMask = Flags.second; 5465df3bbf3SFrancis Visoiu Mistrih auto BitMasks = TII->getSerializableBitmaskMachineOperandTargetFlags(); 5475df3bbf3SFrancis Visoiu Mistrih for (const auto &Mask : BitMasks) { 5485df3bbf3SFrancis Visoiu Mistrih // Check if the flag's bitmask has the bits of the current mask set. 5495df3bbf3SFrancis Visoiu Mistrih if ((BitMask & Mask.first) == Mask.first) { 5505df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 5515df3bbf3SFrancis Visoiu Mistrih OS << ", "; 5525df3bbf3SFrancis Visoiu Mistrih IsCommaNeeded = true; 5535df3bbf3SFrancis Visoiu Mistrih OS << Mask.second; 5545df3bbf3SFrancis Visoiu Mistrih // Clear the bits which were serialized from the flag's bitmask. 5555df3bbf3SFrancis Visoiu Mistrih BitMask &= ~(Mask.first); 5565df3bbf3SFrancis Visoiu Mistrih } 5575df3bbf3SFrancis Visoiu Mistrih } 5585df3bbf3SFrancis Visoiu Mistrih if (BitMask) { 5595df3bbf3SFrancis Visoiu Mistrih // When the resulting flag's bitmask isn't zero, we know that we didn't 5605df3bbf3SFrancis Visoiu Mistrih // serialize all of the bit flags. 5615df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 5625df3bbf3SFrancis Visoiu Mistrih OS << ", "; 5635df3bbf3SFrancis Visoiu Mistrih OS << "<unknown bitmask target flag>"; 5645df3bbf3SFrancis Visoiu Mistrih } 5655df3bbf3SFrancis Visoiu Mistrih OS << ") "; 5665df3bbf3SFrancis Visoiu Mistrih } 5675df3bbf3SFrancis Visoiu Mistrih 5685de20e03SFrancis Visoiu Mistrih void MachineOperand::printSymbol(raw_ostream &OS, MCSymbol &Sym) { 5695de20e03SFrancis Visoiu Mistrih OS << "<mcsymbol " << Sym << ">"; 5705de20e03SFrancis Visoiu Mistrih } 5715de20e03SFrancis Visoiu Mistrih 5720b5bdceaSFrancis Visoiu Mistrih void MachineOperand::printStackObjectReference(raw_ostream &OS, 5730b5bdceaSFrancis Visoiu Mistrih unsigned FrameIndex, 5740b5bdceaSFrancis Visoiu Mistrih bool IsFixed, StringRef Name) { 5750b5bdceaSFrancis Visoiu Mistrih if (IsFixed) { 5760b5bdceaSFrancis Visoiu Mistrih OS << "%fixed-stack." << FrameIndex; 5770b5bdceaSFrancis Visoiu Mistrih return; 5780b5bdceaSFrancis Visoiu Mistrih } 5790b5bdceaSFrancis Visoiu Mistrih 5800b5bdceaSFrancis Visoiu Mistrih OS << "%stack." << FrameIndex; 5810b5bdceaSFrancis Visoiu Mistrih if (!Name.empty()) 5820b5bdceaSFrancis Visoiu Mistrih OS << '.' << Name; 5830b5bdceaSFrancis Visoiu Mistrih } 5840b5bdceaSFrancis Visoiu Mistrih 58581226602SFrancis Visoiu Mistrih void MachineOperand::printOperandOffset(raw_ostream &OS, int64_t Offset) { 58681226602SFrancis Visoiu Mistrih if (Offset == 0) 58781226602SFrancis Visoiu Mistrih return; 58881226602SFrancis Visoiu Mistrih if (Offset < 0) { 58981226602SFrancis Visoiu Mistrih OS << " - " << -Offset; 59081226602SFrancis Visoiu Mistrih return; 59181226602SFrancis Visoiu Mistrih } 59281226602SFrancis Visoiu Mistrih OS << " + " << Offset; 59381226602SFrancis Visoiu Mistrih } 59481226602SFrancis Visoiu Mistrih 595f81727d1SFrancis Visoiu Mistrih void MachineOperand::printIRSlotNumber(raw_ostream &OS, int Slot) { 596f81727d1SFrancis Visoiu Mistrih if (Slot == -1) 597f81727d1SFrancis Visoiu Mistrih OS << "<badref>"; 598f81727d1SFrancis Visoiu Mistrih else 599f81727d1SFrancis Visoiu Mistrih OS << Slot; 600f81727d1SFrancis Visoiu Mistrih } 601f81727d1SFrancis Visoiu Mistrih 602874ae6faSFrancis Visoiu Mistrih static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI, 603874ae6faSFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 604874ae6faSFrancis Visoiu Mistrih switch (CFI.getOperation()) { 605874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpSameValue: 606874ae6faSFrancis Visoiu Mistrih OS << "same_value "; 607874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 608874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 609874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 610874ae6faSFrancis Visoiu Mistrih break; 611874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRememberState: 612874ae6faSFrancis Visoiu Mistrih OS << "remember_state "; 613874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 614874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 615874ae6faSFrancis Visoiu Mistrih break; 616874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRestoreState: 617874ae6faSFrancis Visoiu Mistrih OS << "restore_state "; 618874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 619874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 620874ae6faSFrancis Visoiu Mistrih break; 621874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpOffset: 622874ae6faSFrancis Visoiu Mistrih OS << "offset "; 623874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 624874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 625874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 626874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 627874ae6faSFrancis Visoiu Mistrih break; 628874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfaRegister: 629874ae6faSFrancis Visoiu Mistrih OS << "def_cfa_register "; 630874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 631874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 632874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 633874ae6faSFrancis Visoiu Mistrih break; 634874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfaOffset: 635874ae6faSFrancis Visoiu Mistrih OS << "def_cfa_offset "; 636874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 637874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 638874ae6faSFrancis Visoiu Mistrih OS << CFI.getOffset(); 639874ae6faSFrancis Visoiu Mistrih break; 640874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfa: 641874ae6faSFrancis Visoiu Mistrih OS << "def_cfa "; 642874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 643874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 644874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 645874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 646874ae6faSFrancis Visoiu Mistrih break; 647874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRelOffset: 648874ae6faSFrancis Visoiu Mistrih OS << "rel_offset "; 649874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 650874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 651874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 652874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 653874ae6faSFrancis Visoiu Mistrih break; 654874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpAdjustCfaOffset: 655874ae6faSFrancis Visoiu Mistrih OS << "adjust_cfa_offset "; 656874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 657874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 658874ae6faSFrancis Visoiu Mistrih OS << CFI.getOffset(); 659874ae6faSFrancis Visoiu Mistrih break; 660874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRestore: 661874ae6faSFrancis Visoiu Mistrih OS << "restore "; 662874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 663874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 664874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 665874ae6faSFrancis Visoiu Mistrih break; 666874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpEscape: { 667874ae6faSFrancis Visoiu Mistrih OS << "escape "; 668874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 669874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 670874ae6faSFrancis Visoiu Mistrih if (!CFI.getValues().empty()) { 671874ae6faSFrancis Visoiu Mistrih size_t e = CFI.getValues().size() - 1; 672874ae6faSFrancis Visoiu Mistrih for (size_t i = 0; i < e; ++i) 673874ae6faSFrancis Visoiu Mistrih OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", "; 674874ae6faSFrancis Visoiu Mistrih OS << format("0x%02x", uint8_t(CFI.getValues()[e])) << ", "; 675874ae6faSFrancis Visoiu Mistrih } 676874ae6faSFrancis Visoiu Mistrih break; 677874ae6faSFrancis Visoiu Mistrih } 678874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpUndefined: 679874ae6faSFrancis Visoiu Mistrih OS << "undefined "; 680874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 681874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 682874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 683874ae6faSFrancis Visoiu Mistrih break; 684874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRegister: 685874ae6faSFrancis Visoiu Mistrih OS << "register "; 686874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 687874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 688874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 689874ae6faSFrancis Visoiu Mistrih OS << ", "; 690874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister2(), OS, TRI); 691874ae6faSFrancis Visoiu Mistrih break; 692874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpWindowSave: 693874ae6faSFrancis Visoiu Mistrih OS << "window_save "; 694874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 695874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 696874ae6faSFrancis Visoiu Mistrih break; 697874ae6faSFrancis Visoiu Mistrih default: 698874ae6faSFrancis Visoiu Mistrih // TODO: Print the other CFI Operations. 699874ae6faSFrancis Visoiu Mistrih OS << "<unserializable cfi directive>"; 700874ae6faSFrancis Visoiu Mistrih break; 701874ae6faSFrancis Visoiu Mistrih } 702874ae6faSFrancis Visoiu Mistrih } 703874ae6faSFrancis Visoiu Mistrih 704aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI, 705aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 706a8a83d15SFrancis Visoiu Mistrih tryToGetTargetInfo(*this, TRI, IntrinsicInfo); 707aa739695SFrancis Visoiu Mistrih ModuleSlotTracker DummyMST(nullptr); 708eb3f76fcSFrancis Visoiu Mistrih print(OS, DummyMST, LLT{}, /*PrintDef=*/false, /*IsStandalone=*/true, 709a8a83d15SFrancis Visoiu Mistrih /*ShouldPrintRegisterTies=*/true, 710a8a83d15SFrancis Visoiu Mistrih /*TiedOperandIdx=*/0, TRI, IntrinsicInfo); 711aa739695SFrancis Visoiu Mistrih } 712aa739695SFrancis Visoiu Mistrih 713aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 714eb3f76fcSFrancis Visoiu Mistrih LLT TypeToPrint, bool PrintDef, bool IsStandalone, 715a8a83d15SFrancis Visoiu Mistrih bool ShouldPrintRegisterTies, 716a8a83d15SFrancis Visoiu Mistrih unsigned TiedOperandIdx, 717aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI, 718aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 7195df3bbf3SFrancis Visoiu Mistrih printTargetFlags(OS, *this); 720aa739695SFrancis Visoiu Mistrih switch (getType()) { 721a8a83d15SFrancis Visoiu Mistrih case MachineOperand::MO_Register: { 722a8a83d15SFrancis Visoiu Mistrih unsigned Reg = getReg(); 723aa739695SFrancis Visoiu Mistrih if (isImplicit()) 724a8a83d15SFrancis Visoiu Mistrih OS << (isDef() ? "implicit-def " : "implicit "); 725a8a83d15SFrancis Visoiu Mistrih else if (PrintDef && isDef()) 726a8a83d15SFrancis Visoiu Mistrih // Print the 'def' flag only when the operand is defined after '='. 727aa739695SFrancis Visoiu Mistrih OS << "def "; 728a8a83d15SFrancis Visoiu Mistrih if (isInternalRead()) 729aa739695SFrancis Visoiu Mistrih OS << "internal "; 730a8a83d15SFrancis Visoiu Mistrih if (isDead()) 731a8a83d15SFrancis Visoiu Mistrih OS << "dead "; 732a8a83d15SFrancis Visoiu Mistrih if (isKill()) 733a8a83d15SFrancis Visoiu Mistrih OS << "killed "; 734a8a83d15SFrancis Visoiu Mistrih if (isUndef()) 735a8a83d15SFrancis Visoiu Mistrih OS << "undef "; 736a8a83d15SFrancis Visoiu Mistrih if (isEarlyClobber()) 737a8a83d15SFrancis Visoiu Mistrih OS << "early-clobber "; 738a8a83d15SFrancis Visoiu Mistrih if (isDebug()) 739a8a83d15SFrancis Visoiu Mistrih OS << "debug-use "; 74060c43102SGeoff Berry if (TargetRegisterInfo::isPhysicalRegister(getReg()) && isRenamable()) 74160c43102SGeoff Berry OS << "renamable "; 742399b46c9SPuyan Lotfi 743399b46c9SPuyan Lotfi const MachineRegisterInfo *MRI = nullptr; 744399b46c9SPuyan Lotfi if (TargetRegisterInfo::isVirtualRegister(Reg)) { 745399b46c9SPuyan Lotfi if (const MachineFunction *MF = getMFIfAvailable(*this)) { 746399b46c9SPuyan Lotfi MRI = &MF->getRegInfo(); 747399b46c9SPuyan Lotfi } 748399b46c9SPuyan Lotfi } 749399b46c9SPuyan Lotfi 750399b46c9SPuyan Lotfi OS << printReg(Reg, TRI, 0, MRI); 751a8a83d15SFrancis Visoiu Mistrih // Print the sub register. 752a8a83d15SFrancis Visoiu Mistrih if (unsigned SubReg = getSubReg()) { 753a8a83d15SFrancis Visoiu Mistrih if (TRI) 754a8a83d15SFrancis Visoiu Mistrih OS << '.' << TRI->getSubRegIndexName(SubReg); 755a8a83d15SFrancis Visoiu Mistrih else 756a8a83d15SFrancis Visoiu Mistrih OS << ".subreg" << SubReg; 757aa739695SFrancis Visoiu Mistrih } 758a8a83d15SFrancis Visoiu Mistrih // Print the register class / bank. 759a8a83d15SFrancis Visoiu Mistrih if (TargetRegisterInfo::isVirtualRegister(Reg)) { 760567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 761a8a83d15SFrancis Visoiu Mistrih const MachineRegisterInfo &MRI = MF->getRegInfo(); 762eb3f76fcSFrancis Visoiu Mistrih if (IsStandalone || !PrintDef || MRI.def_empty(Reg)) { 763a8a83d15SFrancis Visoiu Mistrih OS << ':'; 764a8a83d15SFrancis Visoiu Mistrih OS << printRegClassOrBank(Reg, MRI, TRI); 765aa739695SFrancis Visoiu Mistrih } 766aa739695SFrancis Visoiu Mistrih } 767a8a83d15SFrancis Visoiu Mistrih } 768a8a83d15SFrancis Visoiu Mistrih // Print ties. 769a8a83d15SFrancis Visoiu Mistrih if (ShouldPrintRegisterTies && isTied() && !isDef()) 770a8a83d15SFrancis Visoiu Mistrih OS << "(tied-def " << TiedOperandIdx << ")"; 771a8a83d15SFrancis Visoiu Mistrih // Print types. 772a8a83d15SFrancis Visoiu Mistrih if (TypeToPrint.isValid()) 773a8a83d15SFrancis Visoiu Mistrih OS << '(' << TypeToPrint << ')'; 774aa739695SFrancis Visoiu Mistrih break; 775a8a83d15SFrancis Visoiu Mistrih } 776aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 777aa739695SFrancis Visoiu Mistrih OS << getImm(); 778aa739695SFrancis Visoiu Mistrih break; 779aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 7806c4ca713SFrancis Visoiu Mistrih getCImm()->printAsOperand(OS, /*PrintType=*/true, MST); 781aa739695SFrancis Visoiu Mistrih break; 782aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 7833b265c8fSFrancis Visoiu Mistrih getFPImm()->printAsOperand(OS, /*PrintType=*/true, MST); 784aa739695SFrancis Visoiu Mistrih break; 785aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 78625528d6dSFrancis Visoiu Mistrih OS << printMBBReference(*getMBB()); 787aa739695SFrancis Visoiu Mistrih break; 7880b5bdceaSFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: { 7890b5bdceaSFrancis Visoiu Mistrih int FrameIndex = getIndex(); 7900b5bdceaSFrancis Visoiu Mistrih bool IsFixed = false; 791e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI = nullptr; 792e85b06d6SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 793e85b06d6SFrancis Visoiu Mistrih MFI = &MF->getFrameInfo(); 794e85b06d6SFrancis Visoiu Mistrih printFrameIndex(OS, FrameIndex, IsFixed, MFI); 795aa739695SFrancis Visoiu Mistrih break; 7960b5bdceaSFrancis Visoiu Mistrih } 797aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 79826ae8a65SFrancis Visoiu Mistrih OS << "%const." << getIndex(); 79981226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 800aa739695SFrancis Visoiu Mistrih break; 801b3a0d513SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: { 802b3a0d513SFrancis Visoiu Mistrih OS << "target-index("; 803b3a0d513SFrancis Visoiu Mistrih const char *Name = "<unknown>"; 804b3a0d513SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 805b3a0d513SFrancis Visoiu Mistrih if (const auto *TargetIndexName = getTargetIndexName(*MF, getIndex())) 806b3a0d513SFrancis Visoiu Mistrih Name = TargetIndexName; 807b3a0d513SFrancis Visoiu Mistrih OS << Name << ')'; 80881226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 809aa739695SFrancis Visoiu Mistrih break; 810b3a0d513SFrancis Visoiu Mistrih } 811aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 812b41dbbe3SFrancis Visoiu Mistrih OS << printJumpTableEntryReference(getIndex()); 813aa739695SFrancis Visoiu Mistrih break; 814aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 815aa739695SFrancis Visoiu Mistrih getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST); 81681226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 817aa739695SFrancis Visoiu Mistrih break; 818e76c5fcdSFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: { 819e76c5fcdSFrancis Visoiu Mistrih StringRef Name = getSymbolName(); 820fe6c9cbbSPuyan Lotfi OS << '&'; 821e76c5fcdSFrancis Visoiu Mistrih if (Name.empty()) { 822e76c5fcdSFrancis Visoiu Mistrih OS << "\"\""; 823e76c5fcdSFrancis Visoiu Mistrih } else { 824e76c5fcdSFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, Name); 825e76c5fcdSFrancis Visoiu Mistrih } 82681226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 827aa739695SFrancis Visoiu Mistrih break; 828e76c5fcdSFrancis Visoiu Mistrih } 829f81727d1SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: { 830f81727d1SFrancis Visoiu Mistrih OS << "blockaddress("; 831f81727d1SFrancis Visoiu Mistrih getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false, 832f81727d1SFrancis Visoiu Mistrih MST); 833f81727d1SFrancis Visoiu Mistrih OS << ", "; 834f81727d1SFrancis Visoiu Mistrih printIRBlockReference(OS, *getBlockAddress()->getBasicBlock(), MST); 835f81727d1SFrancis Visoiu Mistrih OS << ')'; 836f81727d1SFrancis Visoiu Mistrih MachineOperand::printOperandOffset(OS, getOffset()); 837aa739695SFrancis Visoiu Mistrih break; 838f81727d1SFrancis Visoiu Mistrih } 839aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: { 840a8a83d15SFrancis Visoiu Mistrih OS << "<regmask"; 841a8a83d15SFrancis Visoiu Mistrih if (TRI) { 842aa739695SFrancis Visoiu Mistrih unsigned NumRegsInMask = 0; 843aa739695SFrancis Visoiu Mistrih unsigned NumRegsEmitted = 0; 844aa739695SFrancis Visoiu Mistrih for (unsigned i = 0; i < TRI->getNumRegs(); ++i) { 845aa739695SFrancis Visoiu Mistrih unsigned MaskWord = i / 32; 846aa739695SFrancis Visoiu Mistrih unsigned MaskBit = i % 32; 847aa739695SFrancis Visoiu Mistrih if (getRegMask()[MaskWord] & (1 << MaskBit)) { 848aa739695SFrancis Visoiu Mistrih if (PrintRegMaskNumRegs < 0 || 849aa739695SFrancis Visoiu Mistrih NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) { 850aa739695SFrancis Visoiu Mistrih OS << " " << printReg(i, TRI); 851aa739695SFrancis Visoiu Mistrih NumRegsEmitted++; 852aa739695SFrancis Visoiu Mistrih } 853aa739695SFrancis Visoiu Mistrih NumRegsInMask++; 854aa739695SFrancis Visoiu Mistrih } 855aa739695SFrancis Visoiu Mistrih } 856aa739695SFrancis Visoiu Mistrih if (NumRegsEmitted != NumRegsInMask) 857aa739695SFrancis Visoiu Mistrih OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more..."; 858a8a83d15SFrancis Visoiu Mistrih } else { 859a8a83d15SFrancis Visoiu Mistrih OS << " ..."; 860a8a83d15SFrancis Visoiu Mistrih } 861aa739695SFrancis Visoiu Mistrih OS << ">"; 862aa739695SFrancis Visoiu Mistrih break; 863aa739695SFrancis Visoiu Mistrih } 864bdaf8bfaSFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: { 865bdaf8bfaSFrancis Visoiu Mistrih const uint32_t *RegMask = getRegLiveOut(); 866bdaf8bfaSFrancis Visoiu Mistrih OS << "liveout("; 867bdaf8bfaSFrancis Visoiu Mistrih if (!TRI) { 868bdaf8bfaSFrancis Visoiu Mistrih OS << "<unknown>"; 869bdaf8bfaSFrancis Visoiu Mistrih } else { 870bdaf8bfaSFrancis Visoiu Mistrih bool IsCommaNeeded = false; 871bdaf8bfaSFrancis Visoiu Mistrih for (unsigned Reg = 0, E = TRI->getNumRegs(); Reg < E; ++Reg) { 872bdaf8bfaSFrancis Visoiu Mistrih if (RegMask[Reg / 32] & (1U << (Reg % 32))) { 873bdaf8bfaSFrancis Visoiu Mistrih if (IsCommaNeeded) 874bdaf8bfaSFrancis Visoiu Mistrih OS << ", "; 875bdaf8bfaSFrancis Visoiu Mistrih OS << printReg(Reg, TRI); 876bdaf8bfaSFrancis Visoiu Mistrih IsCommaNeeded = true; 877bdaf8bfaSFrancis Visoiu Mistrih } 878bdaf8bfaSFrancis Visoiu Mistrih } 879bdaf8bfaSFrancis Visoiu Mistrih } 880bdaf8bfaSFrancis Visoiu Mistrih OS << ")"; 881aa739695SFrancis Visoiu Mistrih break; 882bdaf8bfaSFrancis Visoiu Mistrih } 883aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 884aa739695SFrancis Visoiu Mistrih getMetadata()->printAsOperand(OS, MST); 885aa739695SFrancis Visoiu Mistrih break; 886aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 8875de20e03SFrancis Visoiu Mistrih printSymbol(OS, *getMCSymbol()); 888aa739695SFrancis Visoiu Mistrih break; 889874ae6faSFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: { 890874ae6faSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 891874ae6faSFrancis Visoiu Mistrih printCFI(OS, MF->getFrameInstructions()[getCFIIndex()], TRI); 892874ae6faSFrancis Visoiu Mistrih else 893874ae6faSFrancis Visoiu Mistrih OS << "<cfi directive>"; 894aa739695SFrancis Visoiu Mistrih break; 895874ae6faSFrancis Visoiu Mistrih } 896aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: { 897aa739695SFrancis Visoiu Mistrih Intrinsic::ID ID = getIntrinsicID(); 898aa739695SFrancis Visoiu Mistrih if (ID < Intrinsic::num_intrinsics) 899bbd610aeSFrancis Visoiu Mistrih OS << "intrinsic(@" << Intrinsic::getName(ID, None) << ')'; 900aa739695SFrancis Visoiu Mistrih else if (IntrinsicInfo) 901bbd610aeSFrancis Visoiu Mistrih OS << "intrinsic(@" << IntrinsicInfo->getName(ID) << ')'; 902aa739695SFrancis Visoiu Mistrih else 903bbd610aeSFrancis Visoiu Mistrih OS << "intrinsic(" << ID << ')'; 904aa739695SFrancis Visoiu Mistrih break; 905aa739695SFrancis Visoiu Mistrih } 906aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: { 907aa739695SFrancis Visoiu Mistrih auto Pred = static_cast<CmpInst::Predicate>(getPredicate()); 908cb2683d4SFrancis Visoiu Mistrih OS << (CmpInst::isIntPredicate(Pred) ? "int" : "float") << "pred(" 909cb2683d4SFrancis Visoiu Mistrih << CmpInst::getPredicateName(Pred) << ')'; 910aa739695SFrancis Visoiu Mistrih break; 911aa739695SFrancis Visoiu Mistrih } 912aa739695SFrancis Visoiu Mistrih } 913aa739695SFrancis Visoiu Mistrih } 914aa739695SFrancis Visoiu Mistrih 915aa739695SFrancis Visoiu Mistrih #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 916aa739695SFrancis Visoiu Mistrih LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; } 917aa739695SFrancis Visoiu Mistrih #endif 918aa739695SFrancis Visoiu Mistrih 919aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 920aa739695SFrancis Visoiu Mistrih // MachineMemOperand Implementation 921aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 922aa739695SFrancis Visoiu Mistrih 923aa739695SFrancis Visoiu Mistrih /// getAddrSpace - Return the LLVM IR address space number that this pointer 924aa739695SFrancis Visoiu Mistrih /// points into. 92549477040SYaxun Liu unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; } 926aa739695SFrancis Visoiu Mistrih 927aa739695SFrancis Visoiu Mistrih /// isDereferenceable - Return true if V is always dereferenceable for 928aa739695SFrancis Visoiu Mistrih /// Offset + Size byte. 929aa739695SFrancis Visoiu Mistrih bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C, 930aa739695SFrancis Visoiu Mistrih const DataLayout &DL) const { 931aa739695SFrancis Visoiu Mistrih if (!V.is<const Value *>()) 932aa739695SFrancis Visoiu Mistrih return false; 933aa739695SFrancis Visoiu Mistrih 934aa739695SFrancis Visoiu Mistrih const Value *BasePtr = V.get<const Value *>(); 935aa739695SFrancis Visoiu Mistrih if (BasePtr == nullptr) 936aa739695SFrancis Visoiu Mistrih return false; 937aa739695SFrancis Visoiu Mistrih 938aa739695SFrancis Visoiu Mistrih return isDereferenceableAndAlignedPointer( 939aa739695SFrancis Visoiu Mistrih BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL); 940aa739695SFrancis Visoiu Mistrih } 941aa739695SFrancis Visoiu Mistrih 942aa739695SFrancis Visoiu Mistrih /// getConstantPool - Return a MachinePointerInfo record that refers to the 943aa739695SFrancis Visoiu Mistrih /// constant pool. 944aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) { 945aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getConstantPool()); 946aa739695SFrancis Visoiu Mistrih } 947aa739695SFrancis Visoiu Mistrih 948aa739695SFrancis Visoiu Mistrih /// getFixedStack - Return a MachinePointerInfo record that refers to the 949aa739695SFrancis Visoiu Mistrih /// the specified FrameIndex. 950aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF, 951aa739695SFrancis Visoiu Mistrih int FI, int64_t Offset) { 952aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset); 953aa739695SFrancis Visoiu Mistrih } 954aa739695SFrancis Visoiu Mistrih 955aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) { 956aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getJumpTable()); 957aa739695SFrancis Visoiu Mistrih } 958aa739695SFrancis Visoiu Mistrih 959aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) { 960aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getGOT()); 961aa739695SFrancis Visoiu Mistrih } 962aa739695SFrancis Visoiu Mistrih 963aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF, 964aa739695SFrancis Visoiu Mistrih int64_t Offset, uint8_t ID) { 965aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID); 966aa739695SFrancis Visoiu Mistrih } 967aa739695SFrancis Visoiu Mistrih 96849477040SYaxun Liu MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) { 96949477040SYaxun Liu return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace()); 97049477040SYaxun Liu } 97149477040SYaxun Liu 972aa739695SFrancis Visoiu Mistrih MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 973*c01efe69SDaniel Sanders uint64_t s, uint64_t a, 974aa739695SFrancis Visoiu Mistrih const AAMDNodes &AAInfo, 975aa739695SFrancis Visoiu Mistrih const MDNode *Ranges, SyncScope::ID SSID, 976aa739695SFrancis Visoiu Mistrih AtomicOrdering Ordering, 977aa739695SFrancis Visoiu Mistrih AtomicOrdering FailureOrdering) 978aa739695SFrancis Visoiu Mistrih : PtrInfo(ptrinfo), Size(s), FlagVals(f), BaseAlignLog2(Log2_32(a) + 1), 979aa739695SFrancis Visoiu Mistrih AAInfo(AAInfo), Ranges(Ranges) { 980aa739695SFrancis Visoiu Mistrih assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() || 981aa739695SFrancis Visoiu Mistrih isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) && 982aa739695SFrancis Visoiu Mistrih "invalid pointer value"); 983aa739695SFrancis Visoiu Mistrih assert(getBaseAlignment() == a && "Alignment is not a power of 2!"); 984aa739695SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && "Not a load/store!"); 985aa739695SFrancis Visoiu Mistrih 986aa739695SFrancis Visoiu Mistrih AtomicInfo.SSID = static_cast<unsigned>(SSID); 987aa739695SFrancis Visoiu Mistrih assert(getSyncScopeID() == SSID && "Value truncated"); 988aa739695SFrancis Visoiu Mistrih AtomicInfo.Ordering = static_cast<unsigned>(Ordering); 989aa739695SFrancis Visoiu Mistrih assert(getOrdering() == Ordering && "Value truncated"); 990aa739695SFrancis Visoiu Mistrih AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering); 991aa739695SFrancis Visoiu Mistrih assert(getFailureOrdering() == FailureOrdering && "Value truncated"); 992aa739695SFrancis Visoiu Mistrih } 993aa739695SFrancis Visoiu Mistrih 994aa739695SFrancis Visoiu Mistrih /// Profile - Gather unique data for the object. 995aa739695SFrancis Visoiu Mistrih /// 996aa739695SFrancis Visoiu Mistrih void MachineMemOperand::Profile(FoldingSetNodeID &ID) const { 997aa739695SFrancis Visoiu Mistrih ID.AddInteger(getOffset()); 998aa739695SFrancis Visoiu Mistrih ID.AddInteger(Size); 999aa739695SFrancis Visoiu Mistrih ID.AddPointer(getOpaqueValue()); 1000aa739695SFrancis Visoiu Mistrih ID.AddInteger(getFlags()); 1001aa739695SFrancis Visoiu Mistrih ID.AddInteger(getBaseAlignment()); 1002aa739695SFrancis Visoiu Mistrih } 1003aa739695SFrancis Visoiu Mistrih 1004aa739695SFrancis Visoiu Mistrih void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) { 1005aa739695SFrancis Visoiu Mistrih // The Value and Offset may differ due to CSE. But the flags and size 1006aa739695SFrancis Visoiu Mistrih // should be the same. 1007aa739695SFrancis Visoiu Mistrih assert(MMO->getFlags() == getFlags() && "Flags mismatch!"); 1008aa739695SFrancis Visoiu Mistrih assert(MMO->getSize() == getSize() && "Size mismatch!"); 1009aa739695SFrancis Visoiu Mistrih 1010aa739695SFrancis Visoiu Mistrih if (MMO->getBaseAlignment() >= getBaseAlignment()) { 1011aa739695SFrancis Visoiu Mistrih // Update the alignment value. 1012aa739695SFrancis Visoiu Mistrih BaseAlignLog2 = Log2_32(MMO->getBaseAlignment()) + 1; 1013aa739695SFrancis Visoiu Mistrih // Also update the base and offset, because the new alignment may 1014aa739695SFrancis Visoiu Mistrih // not be applicable with the old ones. 1015aa739695SFrancis Visoiu Mistrih PtrInfo = MMO->PtrInfo; 1016aa739695SFrancis Visoiu Mistrih } 1017aa739695SFrancis Visoiu Mistrih } 1018aa739695SFrancis Visoiu Mistrih 1019aa739695SFrancis Visoiu Mistrih /// getAlignment - Return the minimum known alignment in bytes of the 1020aa739695SFrancis Visoiu Mistrih /// actual memory reference. 1021aa739695SFrancis Visoiu Mistrih uint64_t MachineMemOperand::getAlignment() const { 1022aa739695SFrancis Visoiu Mistrih return MinAlign(getBaseAlignment(), getOffset()); 1023aa739695SFrancis Visoiu Mistrih } 1024aa739695SFrancis Visoiu Mistrih 1025aa739695SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS) const { 1026aa739695SFrancis Visoiu Mistrih ModuleSlotTracker DummyMST(nullptr); 1027aa739695SFrancis Visoiu Mistrih print(OS, DummyMST); 1028aa739695SFrancis Visoiu Mistrih } 1029e85b06d6SFrancis Visoiu Mistrih 1030aa739695SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const { 1031e85b06d6SFrancis Visoiu Mistrih SmallVector<StringRef, 0> SSNs; 1032e85b06d6SFrancis Visoiu Mistrih LLVMContext Ctx; 1033e85b06d6SFrancis Visoiu Mistrih print(OS, MST, SSNs, Ctx, nullptr, nullptr); 1034e85b06d6SFrancis Visoiu Mistrih } 1035aa739695SFrancis Visoiu Mistrih 1036e85b06d6SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 1037e85b06d6SFrancis Visoiu Mistrih SmallVectorImpl<StringRef> &SSNs, 1038e85b06d6SFrancis Visoiu Mistrih const LLVMContext &Context, 1039e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI, 1040e85b06d6SFrancis Visoiu Mistrih const TargetInstrInfo *TII) const { 1041e85b06d6SFrancis Visoiu Mistrih OS << '('; 1042aa739695SFrancis Visoiu Mistrih if (isVolatile()) 1043e85b06d6SFrancis Visoiu Mistrih OS << "volatile "; 1044e85b06d6SFrancis Visoiu Mistrih if (isNonTemporal()) 1045e85b06d6SFrancis Visoiu Mistrih OS << "non-temporal "; 1046e85b06d6SFrancis Visoiu Mistrih if (isDereferenceable()) 1047e85b06d6SFrancis Visoiu Mistrih OS << "dereferenceable "; 1048e85b06d6SFrancis Visoiu Mistrih if (isInvariant()) 1049e85b06d6SFrancis Visoiu Mistrih OS << "invariant "; 1050e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag1) 1051e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag1) 1052e85b06d6SFrancis Visoiu Mistrih << "\" "; 1053e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag2) 1054e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag2) 1055e85b06d6SFrancis Visoiu Mistrih << "\" "; 1056e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag3) 1057e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag3) 1058e85b06d6SFrancis Visoiu Mistrih << "\" "; 1059aa739695SFrancis Visoiu Mistrih 1060e85b06d6SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && 1061e85b06d6SFrancis Visoiu Mistrih "machine memory operand must be a load or store (or both)"); 1062aa739695SFrancis Visoiu Mistrih if (isLoad()) 1063e85b06d6SFrancis Visoiu Mistrih OS << "load "; 1064aa739695SFrancis Visoiu Mistrih if (isStore()) 1065e85b06d6SFrancis Visoiu Mistrih OS << "store "; 1066e85b06d6SFrancis Visoiu Mistrih 1067e85b06d6SFrancis Visoiu Mistrih printSyncScope(OS, Context, getSyncScopeID(), SSNs); 1068e85b06d6SFrancis Visoiu Mistrih 1069e85b06d6SFrancis Visoiu Mistrih if (getOrdering() != AtomicOrdering::NotAtomic) 1070e85b06d6SFrancis Visoiu Mistrih OS << toIRString(getOrdering()) << ' '; 1071e85b06d6SFrancis Visoiu Mistrih if (getFailureOrdering() != AtomicOrdering::NotAtomic) 1072e85b06d6SFrancis Visoiu Mistrih OS << toIRString(getFailureOrdering()) << ' '; 1073e85b06d6SFrancis Visoiu Mistrih 1074aa739695SFrancis Visoiu Mistrih OS << getSize(); 1075e85b06d6SFrancis Visoiu Mistrih if (const Value *Val = getValue()) { 1076e85b06d6SFrancis Visoiu Mistrih OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1077e85b06d6SFrancis Visoiu Mistrih printIRValueReference(OS, *Val, MST); 1078e85b06d6SFrancis Visoiu Mistrih } else if (const PseudoSourceValue *PVal = getPseudoValue()) { 1079e85b06d6SFrancis Visoiu Mistrih OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1080e85b06d6SFrancis Visoiu Mistrih assert(PVal && "Expected a pseudo source value"); 1081e85b06d6SFrancis Visoiu Mistrih switch (PVal->kind()) { 1082e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::Stack: 1083e85b06d6SFrancis Visoiu Mistrih OS << "stack"; 1084e85b06d6SFrancis Visoiu Mistrih break; 1085e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::GOT: 1086e85b06d6SFrancis Visoiu Mistrih OS << "got"; 1087e85b06d6SFrancis Visoiu Mistrih break; 1088e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::JumpTable: 1089e85b06d6SFrancis Visoiu Mistrih OS << "jump-table"; 1090e85b06d6SFrancis Visoiu Mistrih break; 1091e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::ConstantPool: 1092e85b06d6SFrancis Visoiu Mistrih OS << "constant-pool"; 1093e85b06d6SFrancis Visoiu Mistrih break; 1094e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::FixedStack: { 1095e85b06d6SFrancis Visoiu Mistrih int FrameIndex = cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex(); 1096e85b06d6SFrancis Visoiu Mistrih bool IsFixed = true; 1097e85b06d6SFrancis Visoiu Mistrih printFrameIndex(OS, FrameIndex, IsFixed, MFI); 1098e85b06d6SFrancis Visoiu Mistrih break; 1099aa739695SFrancis Visoiu Mistrih } 1100e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::GlobalValueCallEntry: 1101e85b06d6SFrancis Visoiu Mistrih OS << "call-entry "; 1102e85b06d6SFrancis Visoiu Mistrih cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( 1103e85b06d6SFrancis Visoiu Mistrih OS, /*PrintType=*/false, MST); 1104e85b06d6SFrancis Visoiu Mistrih break; 1105e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::ExternalSymbolCallEntry: 1106e85b06d6SFrancis Visoiu Mistrih OS << "call-entry &"; 1107e85b06d6SFrancis Visoiu Mistrih printLLVMNameWithoutPrefix( 1108e85b06d6SFrancis Visoiu Mistrih OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); 1109e85b06d6SFrancis Visoiu Mistrih break; 1110e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::TargetCustom: 11114db09604STim Renouf // FIXME: This is not necessarily the correct MIR serialization format for 11124db09604STim Renouf // a custom pseudo source value, but at least it allows 11134db09604STim Renouf // -print-machineinstrs to work on a target with custom pseudo source 11144db09604STim Renouf // values. 11154db09604STim Renouf OS << "custom "; 11164db09604STim Renouf PVal->printCustom(OS); 1117e85b06d6SFrancis Visoiu Mistrih break; 1118aa739695SFrancis Visoiu Mistrih } 1119aa739695SFrancis Visoiu Mistrih } 1120e85b06d6SFrancis Visoiu Mistrih MachineOperand::printOperandOffset(OS, getOffset()); 1121e85b06d6SFrancis Visoiu Mistrih if (getBaseAlignment() != getSize()) 1122e85b06d6SFrancis Visoiu Mistrih OS << ", align " << getBaseAlignment(); 1123e85b06d6SFrancis Visoiu Mistrih auto AAInfo = getAAInfo(); 1124e85b06d6SFrancis Visoiu Mistrih if (AAInfo.TBAA) { 1125e85b06d6SFrancis Visoiu Mistrih OS << ", !tbaa "; 1126e85b06d6SFrancis Visoiu Mistrih AAInfo.TBAA->printAsOperand(OS, MST); 1127aa739695SFrancis Visoiu Mistrih } 1128e85b06d6SFrancis Visoiu Mistrih if (AAInfo.Scope) { 1129e85b06d6SFrancis Visoiu Mistrih OS << ", !alias.scope "; 1130e85b06d6SFrancis Visoiu Mistrih AAInfo.Scope->printAsOperand(OS, MST); 1131aa739695SFrancis Visoiu Mistrih } 1132e85b06d6SFrancis Visoiu Mistrih if (AAInfo.NoAlias) { 1133e85b06d6SFrancis Visoiu Mistrih OS << ", !noalias "; 1134e85b06d6SFrancis Visoiu Mistrih AAInfo.NoAlias->printAsOperand(OS, MST); 1135aa739695SFrancis Visoiu Mistrih } 1136e85b06d6SFrancis Visoiu Mistrih if (getRanges()) { 1137e85b06d6SFrancis Visoiu Mistrih OS << ", !range "; 1138e85b06d6SFrancis Visoiu Mistrih getRanges()->printAsOperand(OS, MST); 1139e85b06d6SFrancis Visoiu Mistrih } 1140e85b06d6SFrancis Visoiu Mistrih // FIXME: Implement addrspace printing/parsing in MIR. 1141e85b06d6SFrancis Visoiu Mistrih // For now, print this even though parsing it is not available in MIR. 1142e85b06d6SFrancis Visoiu Mistrih if (unsigned AS = getAddrSpace()) 1143e85b06d6SFrancis Visoiu Mistrih OS << ", addrspace " << AS; 1144aa739695SFrancis Visoiu Mistrih 1145aa739695SFrancis Visoiu Mistrih OS << ')'; 1146aa739695SFrancis Visoiu Mistrih } 1147