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" 15aa739695SFrancis Visoiu Mistrih #include "llvm/Analysis/Loads.h" 16aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MIRPrinter.h" 17b41dbbe3SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineJumpTableInfo.h" 18aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineRegisterInfo.h" 19b3a0d513SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetInstrInfo.h" 20aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetRegisterInfo.h" 21aa739695SFrancis Visoiu Mistrih #include "llvm/IR/Constants.h" 22e76c5fcdSFrancis Visoiu Mistrih #include "llvm/IR/IRPrintingPasses.h" 23aa739695SFrancis Visoiu Mistrih #include "llvm/IR/ModuleSlotTracker.h" 24a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetIntrinsicInfo.h" 25a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetMachine.h" 26aa739695SFrancis Visoiu Mistrih 27aa739695SFrancis Visoiu Mistrih using namespace llvm; 28aa739695SFrancis Visoiu Mistrih 29aa739695SFrancis Visoiu Mistrih static cl::opt<int> 30aa739695SFrancis Visoiu Mistrih PrintRegMaskNumRegs("print-regmask-num-regs", 31aa739695SFrancis Visoiu Mistrih cl::desc("Number of registers to limit to when " 32aa739695SFrancis Visoiu Mistrih "printing regmask operands in IR dumps. " 33aa739695SFrancis Visoiu Mistrih "unlimited = -1"), 34aa739695SFrancis Visoiu Mistrih cl::init(32), cl::Hidden); 35aa739695SFrancis Visoiu Mistrih 3695a05915SFrancis Visoiu Mistrih static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) { 3795a05915SFrancis Visoiu Mistrih if (const MachineInstr *MI = MO.getParent()) 3895a05915SFrancis Visoiu Mistrih if (const MachineBasicBlock *MBB = MI->getParent()) 3995a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = MBB->getParent()) 4095a05915SFrancis Visoiu Mistrih return MF; 4195a05915SFrancis Visoiu Mistrih return nullptr; 4295a05915SFrancis Visoiu Mistrih } 4395a05915SFrancis Visoiu Mistrih static MachineFunction *getMFIfAvailable(MachineOperand &MO) { 4495a05915SFrancis Visoiu Mistrih return const_cast<MachineFunction *>( 4595a05915SFrancis Visoiu Mistrih getMFIfAvailable(const_cast<const MachineOperand &>(MO))); 4695a05915SFrancis Visoiu Mistrih } 4795a05915SFrancis Visoiu Mistrih 48aa739695SFrancis Visoiu Mistrih void MachineOperand::setReg(unsigned Reg) { 49aa739695SFrancis Visoiu Mistrih if (getReg() == Reg) 50aa739695SFrancis Visoiu Mistrih return; // No change. 51aa739695SFrancis Visoiu Mistrih 52aa739695SFrancis Visoiu Mistrih // Otherwise, we have to change the register. If this operand is embedded 53aa739695SFrancis Visoiu Mistrih // into a machine function, we need to update the old and new register's 54aa739695SFrancis Visoiu Mistrih // use/def lists. 5595a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 56aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 57aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 58aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 59aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 60aa739695SFrancis Visoiu Mistrih return; 61aa739695SFrancis Visoiu Mistrih } 62aa739695SFrancis Visoiu Mistrih 63aa739695SFrancis Visoiu Mistrih // Otherwise, just change the register, no problem. :) 64aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 65aa739695SFrancis Visoiu Mistrih } 66aa739695SFrancis Visoiu Mistrih 67aa739695SFrancis Visoiu Mistrih void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx, 68aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo &TRI) { 69aa739695SFrancis Visoiu Mistrih assert(TargetRegisterInfo::isVirtualRegister(Reg)); 70aa739695SFrancis Visoiu Mistrih if (SubIdx && getSubReg()) 71aa739695SFrancis Visoiu Mistrih SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg()); 72aa739695SFrancis Visoiu Mistrih setReg(Reg); 73aa739695SFrancis Visoiu Mistrih if (SubIdx) 74aa739695SFrancis Visoiu Mistrih setSubReg(SubIdx); 75aa739695SFrancis Visoiu Mistrih } 76aa739695SFrancis Visoiu Mistrih 77aa739695SFrancis Visoiu Mistrih void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) { 78aa739695SFrancis Visoiu Mistrih assert(TargetRegisterInfo::isPhysicalRegister(Reg)); 79aa739695SFrancis Visoiu Mistrih if (getSubReg()) { 80aa739695SFrancis Visoiu Mistrih Reg = TRI.getSubReg(Reg, getSubReg()); 81aa739695SFrancis Visoiu Mistrih // Note that getSubReg() may return 0 if the sub-register doesn't exist. 82aa739695SFrancis Visoiu Mistrih // That won't happen in legal code. 83aa739695SFrancis Visoiu Mistrih setSubReg(0); 84aa739695SFrancis Visoiu Mistrih if (isDef()) 85aa739695SFrancis Visoiu Mistrih setIsUndef(false); 86aa739695SFrancis Visoiu Mistrih } 87aa739695SFrancis Visoiu Mistrih setReg(Reg); 88aa739695SFrancis Visoiu Mistrih } 89aa739695SFrancis Visoiu Mistrih 90aa739695SFrancis Visoiu Mistrih /// Change a def to a use, or a use to a def. 91aa739695SFrancis Visoiu Mistrih void MachineOperand::setIsDef(bool Val) { 92aa739695SFrancis Visoiu Mistrih assert(isReg() && "Wrong MachineOperand accessor"); 93aa739695SFrancis Visoiu Mistrih assert((!Val || !isDebug()) && "Marking a debug operation as def"); 94aa739695SFrancis Visoiu Mistrih if (IsDef == Val) 95aa739695SFrancis Visoiu Mistrih return; 9660c43102SGeoff Berry assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported"); 97aa739695SFrancis Visoiu Mistrih // MRI may keep uses and defs in different list positions. 9895a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 99aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 100aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 101aa739695SFrancis Visoiu Mistrih IsDef = Val; 102aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 103aa739695SFrancis Visoiu Mistrih return; 104aa739695SFrancis Visoiu Mistrih } 105aa739695SFrancis Visoiu Mistrih IsDef = Val; 106aa739695SFrancis Visoiu Mistrih } 107aa739695SFrancis Visoiu Mistrih 10860c43102SGeoff Berry bool MachineOperand::isRenamable() const { 10960c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 11060c43102SGeoff Berry assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && 11160c43102SGeoff Berry "isRenamable should only be checked on physical registers"); 11260c43102SGeoff Berry return IsRenamable; 11360c43102SGeoff Berry } 11460c43102SGeoff Berry 11560c43102SGeoff Berry void MachineOperand::setIsRenamable(bool Val) { 11660c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 11760c43102SGeoff Berry assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && 11860c43102SGeoff Berry "setIsRenamable should only be called on physical registers"); 11960c43102SGeoff Berry if (const MachineInstr *MI = getParent()) 12060c43102SGeoff Berry if ((isDef() && MI->hasExtraDefRegAllocReq()) || 12160c43102SGeoff Berry (isUse() && MI->hasExtraSrcRegAllocReq())) 12260c43102SGeoff Berry assert(!Val && "isRenamable should be false for " 12360c43102SGeoff Berry "hasExtraDefRegAllocReq/hasExtraSrcRegAllocReq opcodes"); 12460c43102SGeoff Berry IsRenamable = Val; 12560c43102SGeoff Berry } 12660c43102SGeoff Berry 12760c43102SGeoff Berry void MachineOperand::setIsRenamableIfNoExtraRegAllocReq() { 12860c43102SGeoff Berry if (const MachineInstr *MI = getParent()) 12960c43102SGeoff Berry if ((isDef() && MI->hasExtraDefRegAllocReq()) || 13060c43102SGeoff Berry (isUse() && MI->hasExtraSrcRegAllocReq())) 13160c43102SGeoff Berry return; 13260c43102SGeoff Berry 13360c43102SGeoff Berry setIsRenamable(true); 13460c43102SGeoff Berry } 13560c43102SGeoff Berry 136aa739695SFrancis Visoiu Mistrih // If this operand is currently a register operand, and if this is in a 137aa739695SFrancis Visoiu Mistrih // function, deregister the operand from the register's use/def list. 138aa739695SFrancis Visoiu Mistrih void MachineOperand::removeRegFromUses() { 139aa739695SFrancis Visoiu Mistrih if (!isReg() || !isOnRegUseList()) 140aa739695SFrancis Visoiu Mistrih return; 141aa739695SFrancis Visoiu Mistrih 14295a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 143aa739695SFrancis Visoiu Mistrih MF->getRegInfo().removeRegOperandFromUseList(this); 144aa739695SFrancis Visoiu Mistrih } 145aa739695SFrancis Visoiu Mistrih 146aa739695SFrancis Visoiu Mistrih /// ChangeToImmediate - Replace this operand with a new immediate operand of 147aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an immediate already, 148aa739695SFrancis Visoiu Mistrih /// the setImm method should be used. 149aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToImmediate(int64_t ImmVal) { 150aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 151aa739695SFrancis Visoiu Mistrih 152aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 153aa739695SFrancis Visoiu Mistrih 154aa739695SFrancis Visoiu Mistrih OpKind = MO_Immediate; 155aa739695SFrancis Visoiu Mistrih Contents.ImmVal = ImmVal; 156aa739695SFrancis Visoiu Mistrih } 157aa739695SFrancis Visoiu Mistrih 158aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) { 159aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 160aa739695SFrancis Visoiu Mistrih 161aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 162aa739695SFrancis Visoiu Mistrih 163aa739695SFrancis Visoiu Mistrih OpKind = MO_FPImmediate; 164aa739695SFrancis Visoiu Mistrih Contents.CFP = FPImm; 165aa739695SFrancis Visoiu Mistrih } 166aa739695SFrancis Visoiu Mistrih 167aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToES(const char *SymName, 168aa739695SFrancis Visoiu Mistrih unsigned char TargetFlags) { 169aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 170aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an external symbol"); 171aa739695SFrancis Visoiu Mistrih 172aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 173aa739695SFrancis Visoiu Mistrih 174aa739695SFrancis Visoiu Mistrih OpKind = MO_ExternalSymbol; 175aa739695SFrancis Visoiu Mistrih Contents.OffsetedInfo.Val.SymbolName = SymName; 176aa739695SFrancis Visoiu Mistrih setOffset(0); // Offset is always 0. 177aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 178aa739695SFrancis Visoiu Mistrih } 179aa739695SFrancis Visoiu Mistrih 180aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) { 181aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 182aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an MCSymbol"); 183aa739695SFrancis Visoiu Mistrih 184aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 185aa739695SFrancis Visoiu Mistrih 186aa739695SFrancis Visoiu Mistrih OpKind = MO_MCSymbol; 187aa739695SFrancis Visoiu Mistrih Contents.Sym = Sym; 188aa739695SFrancis Visoiu Mistrih } 189aa739695SFrancis Visoiu Mistrih 190aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToFrameIndex(int Idx) { 191aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 192aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 193aa739695SFrancis Visoiu Mistrih 194aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 195aa739695SFrancis Visoiu Mistrih 196aa739695SFrancis Visoiu Mistrih OpKind = MO_FrameIndex; 197aa739695SFrancis Visoiu Mistrih setIndex(Idx); 198aa739695SFrancis Visoiu Mistrih } 199aa739695SFrancis Visoiu Mistrih 200aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset, 201aa739695SFrancis Visoiu Mistrih unsigned char TargetFlags) { 202aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 203aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 204aa739695SFrancis Visoiu Mistrih 205aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 206aa739695SFrancis Visoiu Mistrih 207aa739695SFrancis Visoiu Mistrih OpKind = MO_TargetIndex; 208aa739695SFrancis Visoiu Mistrih setIndex(Idx); 209aa739695SFrancis Visoiu Mistrih setOffset(Offset); 210aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 211aa739695SFrancis Visoiu Mistrih } 212aa739695SFrancis Visoiu Mistrih 213aa739695SFrancis Visoiu Mistrih /// ChangeToRegister - Replace this operand with a new register operand of 214aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an register already, 215aa739695SFrancis Visoiu Mistrih /// the setReg method should be used. 216aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp, 217aa739695SFrancis Visoiu Mistrih bool isKill, bool isDead, bool isUndef, 218aa739695SFrancis Visoiu Mistrih bool isDebug) { 219aa739695SFrancis Visoiu Mistrih MachineRegisterInfo *RegInfo = nullptr; 22095a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 221aa739695SFrancis Visoiu Mistrih RegInfo = &MF->getRegInfo(); 222aa739695SFrancis Visoiu Mistrih // If this operand is already a register operand, remove it from the 223aa739695SFrancis Visoiu Mistrih // register's use/def lists. 224aa739695SFrancis Visoiu Mistrih bool WasReg = isReg(); 225aa739695SFrancis Visoiu Mistrih if (RegInfo && WasReg) 226aa739695SFrancis Visoiu Mistrih RegInfo->removeRegOperandFromUseList(this); 227aa739695SFrancis Visoiu Mistrih 228aa739695SFrancis Visoiu Mistrih // Change this to a register and set the reg#. 22960c43102SGeoff Berry assert(!(isDead && !isDef) && "Dead flag on non-def"); 23060c43102SGeoff Berry assert(!(isKill && isDef) && "Kill flag on def"); 231aa739695SFrancis Visoiu Mistrih OpKind = MO_Register; 232aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 233aa739695SFrancis Visoiu Mistrih SubReg_TargetFlags = 0; 234aa739695SFrancis Visoiu Mistrih IsDef = isDef; 235aa739695SFrancis Visoiu Mistrih IsImp = isImp; 23660c43102SGeoff Berry IsDeadOrKill = isKill | isDead; 23760c43102SGeoff Berry IsRenamable = false; 238aa739695SFrancis Visoiu Mistrih IsUndef = isUndef; 239aa739695SFrancis Visoiu Mistrih IsInternalRead = false; 240aa739695SFrancis Visoiu Mistrih IsEarlyClobber = false; 241aa739695SFrancis Visoiu Mistrih IsDebug = isDebug; 242aa739695SFrancis Visoiu Mistrih // Ensure isOnRegUseList() returns false. 243aa739695SFrancis Visoiu Mistrih Contents.Reg.Prev = nullptr; 244aa739695SFrancis Visoiu Mistrih // Preserve the tie when the operand was already a register. 245aa739695SFrancis Visoiu Mistrih if (!WasReg) 246aa739695SFrancis Visoiu Mistrih TiedTo = 0; 247aa739695SFrancis Visoiu Mistrih 248aa739695SFrancis Visoiu Mistrih // If this operand is embedded in a function, add the operand to the 249aa739695SFrancis Visoiu Mistrih // register's use/def list. 250aa739695SFrancis Visoiu Mistrih if (RegInfo) 251aa739695SFrancis Visoiu Mistrih RegInfo->addRegOperandToUseList(this); 252aa739695SFrancis Visoiu Mistrih } 253aa739695SFrancis Visoiu Mistrih 254aa739695SFrancis Visoiu Mistrih /// isIdenticalTo - Return true if this operand is identical to the specified 255aa739695SFrancis Visoiu Mistrih /// operand. Note that this should stay in sync with the hash_value overload 256aa739695SFrancis Visoiu Mistrih /// below. 257aa739695SFrancis Visoiu Mistrih bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 258aa739695SFrancis Visoiu Mistrih if (getType() != Other.getType() || 259aa739695SFrancis Visoiu Mistrih getTargetFlags() != Other.getTargetFlags()) 260aa739695SFrancis Visoiu Mistrih return false; 261aa739695SFrancis Visoiu Mistrih 262aa739695SFrancis Visoiu Mistrih switch (getType()) { 263aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 264aa739695SFrancis Visoiu Mistrih return getReg() == Other.getReg() && isDef() == Other.isDef() && 265aa739695SFrancis Visoiu Mistrih getSubReg() == Other.getSubReg(); 266aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 267aa739695SFrancis Visoiu Mistrih return getImm() == Other.getImm(); 268aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 269aa739695SFrancis Visoiu Mistrih return getCImm() == Other.getCImm(); 270aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 271aa739695SFrancis Visoiu Mistrih return getFPImm() == Other.getFPImm(); 272aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 273aa739695SFrancis Visoiu Mistrih return getMBB() == Other.getMBB(); 274aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 275aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 276aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 277aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 278aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 279aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 280aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 281aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 282aa739695SFrancis Visoiu Mistrih return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 283aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 284aa739695SFrancis Visoiu Mistrih return strcmp(getSymbolName(), Other.getSymbolName()) == 0 && 285aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 286aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 287aa739695SFrancis Visoiu Mistrih return getBlockAddress() == Other.getBlockAddress() && 288aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 289aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 290aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: { 291aa739695SFrancis Visoiu Mistrih // Shallow compare of the two RegMasks 292aa739695SFrancis Visoiu Mistrih const uint32_t *RegMask = getRegMask(); 293aa739695SFrancis Visoiu Mistrih const uint32_t *OtherRegMask = Other.getRegMask(); 294aa739695SFrancis Visoiu Mistrih if (RegMask == OtherRegMask) 295aa739695SFrancis Visoiu Mistrih return true; 296aa739695SFrancis Visoiu Mistrih 29795a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 298aa739695SFrancis Visoiu Mistrih // Calculate the size of the RegMask 299aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); 300aa739695SFrancis Visoiu Mistrih unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32; 301aa739695SFrancis Visoiu Mistrih 302aa739695SFrancis Visoiu Mistrih // Deep compare of the two RegMasks 303aa739695SFrancis Visoiu Mistrih return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask); 304aa739695SFrancis Visoiu Mistrih } 30595a05915SFrancis Visoiu Mistrih // We don't know the size of the RegMask, so we can't deep compare the two 30695a05915SFrancis Visoiu Mistrih // reg masks. 30795a05915SFrancis Visoiu Mistrih return false; 30895a05915SFrancis Visoiu Mistrih } 309aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 310aa739695SFrancis Visoiu Mistrih return getMCSymbol() == Other.getMCSymbol(); 311aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 312aa739695SFrancis Visoiu Mistrih return getCFIIndex() == Other.getCFIIndex(); 313aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 314aa739695SFrancis Visoiu Mistrih return getMetadata() == Other.getMetadata(); 315aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 316aa739695SFrancis Visoiu Mistrih return getIntrinsicID() == Other.getIntrinsicID(); 317aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 318aa739695SFrancis Visoiu Mistrih return getPredicate() == Other.getPredicate(); 319aa739695SFrancis Visoiu Mistrih } 320aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 321aa739695SFrancis Visoiu Mistrih } 322aa739695SFrancis Visoiu Mistrih 323aa739695SFrancis Visoiu Mistrih // Note: this must stay exactly in sync with isIdenticalTo above. 324aa739695SFrancis Visoiu Mistrih hash_code llvm::hash_value(const MachineOperand &MO) { 325aa739695SFrancis Visoiu Mistrih switch (MO.getType()) { 326aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 327aa739695SFrancis Visoiu Mistrih // Register operands don't have target flags. 328aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getReg(), MO.getSubReg(), MO.isDef()); 329aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 330aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm()); 331aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 332aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm()); 333aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 334aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm()); 335aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 336aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB()); 337aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 338aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 339aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 340aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 341aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(), 342aa739695SFrancis Visoiu Mistrih MO.getOffset()); 343aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 344aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 345aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 346aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(), 347aa739695SFrancis Visoiu Mistrih MO.getSymbolName()); 348aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 349aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(), 350aa739695SFrancis Visoiu Mistrih MO.getOffset()); 351aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 352aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(), 353aa739695SFrancis Visoiu Mistrih MO.getOffset()); 354aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 355aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: 356aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask()); 357aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 358aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata()); 359aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 360aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); 361aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 362aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex()); 363aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 364aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID()); 365aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 366aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate()); 367aa739695SFrancis Visoiu Mistrih } 368aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 369aa739695SFrancis Visoiu Mistrih } 370aa739695SFrancis Visoiu Mistrih 371a8a83d15SFrancis Visoiu Mistrih // Try to crawl up to the machine function and get TRI and IntrinsicInfo from 372a8a83d15SFrancis Visoiu Mistrih // it. 373a8a83d15SFrancis Visoiu Mistrih static void tryToGetTargetInfo(const MachineOperand &MO, 374a8a83d15SFrancis Visoiu Mistrih const TargetRegisterInfo *&TRI, 375a8a83d15SFrancis Visoiu Mistrih const TargetIntrinsicInfo *&IntrinsicInfo) { 376567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(MO)) { 377a8a83d15SFrancis Visoiu Mistrih TRI = MF->getSubtarget().getRegisterInfo(); 378a8a83d15SFrancis Visoiu Mistrih IntrinsicInfo = MF->getTarget().getIntrinsicInfo(); 379a8a83d15SFrancis Visoiu Mistrih } 380a8a83d15SFrancis Visoiu Mistrih } 381a8a83d15SFrancis Visoiu Mistrih 38226ae8a65SFrancis Visoiu Mistrih static void printOffset(raw_ostream &OS, int64_t Offset) { 38326ae8a65SFrancis Visoiu Mistrih if (Offset == 0) 38426ae8a65SFrancis Visoiu Mistrih return; 38526ae8a65SFrancis Visoiu Mistrih if (Offset < 0) { 38626ae8a65SFrancis Visoiu Mistrih OS << " - " << -Offset; 38726ae8a65SFrancis Visoiu Mistrih return; 38826ae8a65SFrancis Visoiu Mistrih } 38926ae8a65SFrancis Visoiu Mistrih OS << " + " << Offset; 39026ae8a65SFrancis Visoiu Mistrih } 39126ae8a65SFrancis Visoiu Mistrih 392b3a0d513SFrancis Visoiu Mistrih static const char *getTargetIndexName(const MachineFunction &MF, int Index) { 393b3a0d513SFrancis Visoiu Mistrih const auto *TII = MF.getSubtarget().getInstrInfo(); 394b3a0d513SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 395b3a0d513SFrancis Visoiu Mistrih auto Indices = TII->getSerializableTargetIndices(); 396b3a0d513SFrancis Visoiu Mistrih auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) { 397b3a0d513SFrancis Visoiu Mistrih return I.first == Index; 398b3a0d513SFrancis Visoiu Mistrih }); 399b3a0d513SFrancis Visoiu Mistrih if (Found != Indices.end()) 400b3a0d513SFrancis Visoiu Mistrih return Found->second; 401b3a0d513SFrancis Visoiu Mistrih return nullptr; 402b3a0d513SFrancis Visoiu Mistrih } 403b3a0d513SFrancis Visoiu Mistrih 404*5df3bbf3SFrancis Visoiu Mistrih static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) { 405*5df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->getSerializableDirectMachineOperandTargetFlags(); 406*5df3bbf3SFrancis Visoiu Mistrih for (const auto &I : Flags) { 407*5df3bbf3SFrancis Visoiu Mistrih if (I.first == TF) { 408*5df3bbf3SFrancis Visoiu Mistrih return I.second; 409*5df3bbf3SFrancis Visoiu Mistrih } 410*5df3bbf3SFrancis Visoiu Mistrih } 411*5df3bbf3SFrancis Visoiu Mistrih return nullptr; 412*5df3bbf3SFrancis Visoiu Mistrih } 413*5df3bbf3SFrancis Visoiu Mistrih 414440f69c9SFrancis Visoiu Mistrih void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index, 415440f69c9SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 416440f69c9SFrancis Visoiu Mistrih OS << "%subreg."; 417440f69c9SFrancis Visoiu Mistrih if (TRI) 418440f69c9SFrancis Visoiu Mistrih OS << TRI->getSubRegIndexName(Index); 419440f69c9SFrancis Visoiu Mistrih else 420440f69c9SFrancis Visoiu Mistrih OS << Index; 421440f69c9SFrancis Visoiu Mistrih } 422440f69c9SFrancis Visoiu Mistrih 423*5df3bbf3SFrancis Visoiu Mistrih void MachineOperand::printTargetFlags(raw_ostream &OS, 424*5df3bbf3SFrancis Visoiu Mistrih const MachineOperand &Op) { 425*5df3bbf3SFrancis Visoiu Mistrih if (!Op.getTargetFlags()) 426*5df3bbf3SFrancis Visoiu Mistrih return; 427*5df3bbf3SFrancis Visoiu Mistrih const MachineFunction *MF = getMFIfAvailable(Op); 428*5df3bbf3SFrancis Visoiu Mistrih if (!MF) 429*5df3bbf3SFrancis Visoiu Mistrih return; 430*5df3bbf3SFrancis Visoiu Mistrih 431*5df3bbf3SFrancis Visoiu Mistrih const auto *TII = MF->getSubtarget().getInstrInfo(); 432*5df3bbf3SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 433*5df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->decomposeMachineOperandsTargetFlags(Op.getTargetFlags()); 434*5df3bbf3SFrancis Visoiu Mistrih OS << "target-flags("; 435*5df3bbf3SFrancis Visoiu Mistrih const bool HasDirectFlags = Flags.first; 436*5df3bbf3SFrancis Visoiu Mistrih const bool HasBitmaskFlags = Flags.second; 437*5df3bbf3SFrancis Visoiu Mistrih if (!HasDirectFlags && !HasBitmaskFlags) { 438*5df3bbf3SFrancis Visoiu Mistrih OS << "<unknown>) "; 439*5df3bbf3SFrancis Visoiu Mistrih return; 440*5df3bbf3SFrancis Visoiu Mistrih } 441*5df3bbf3SFrancis Visoiu Mistrih if (HasDirectFlags) { 442*5df3bbf3SFrancis Visoiu Mistrih if (const auto *Name = getTargetFlagName(TII, Flags.first)) 443*5df3bbf3SFrancis Visoiu Mistrih OS << Name; 444*5df3bbf3SFrancis Visoiu Mistrih else 445*5df3bbf3SFrancis Visoiu Mistrih OS << "<unknown target flag>"; 446*5df3bbf3SFrancis Visoiu Mistrih } 447*5df3bbf3SFrancis Visoiu Mistrih if (!HasBitmaskFlags) { 448*5df3bbf3SFrancis Visoiu Mistrih OS << ") "; 449*5df3bbf3SFrancis Visoiu Mistrih return; 450*5df3bbf3SFrancis Visoiu Mistrih } 451*5df3bbf3SFrancis Visoiu Mistrih bool IsCommaNeeded = HasDirectFlags; 452*5df3bbf3SFrancis Visoiu Mistrih unsigned BitMask = Flags.second; 453*5df3bbf3SFrancis Visoiu Mistrih auto BitMasks = TII->getSerializableBitmaskMachineOperandTargetFlags(); 454*5df3bbf3SFrancis Visoiu Mistrih for (const auto &Mask : BitMasks) { 455*5df3bbf3SFrancis Visoiu Mistrih // Check if the flag's bitmask has the bits of the current mask set. 456*5df3bbf3SFrancis Visoiu Mistrih if ((BitMask & Mask.first) == Mask.first) { 457*5df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 458*5df3bbf3SFrancis Visoiu Mistrih OS << ", "; 459*5df3bbf3SFrancis Visoiu Mistrih IsCommaNeeded = true; 460*5df3bbf3SFrancis Visoiu Mistrih OS << Mask.second; 461*5df3bbf3SFrancis Visoiu Mistrih // Clear the bits which were serialized from the flag's bitmask. 462*5df3bbf3SFrancis Visoiu Mistrih BitMask &= ~(Mask.first); 463*5df3bbf3SFrancis Visoiu Mistrih } 464*5df3bbf3SFrancis Visoiu Mistrih } 465*5df3bbf3SFrancis Visoiu Mistrih if (BitMask) { 466*5df3bbf3SFrancis Visoiu Mistrih // When the resulting flag's bitmask isn't zero, we know that we didn't 467*5df3bbf3SFrancis Visoiu Mistrih // serialize all of the bit flags. 468*5df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 469*5df3bbf3SFrancis Visoiu Mistrih OS << ", "; 470*5df3bbf3SFrancis Visoiu Mistrih OS << "<unknown bitmask target flag>"; 471*5df3bbf3SFrancis Visoiu Mistrih } 472*5df3bbf3SFrancis Visoiu Mistrih OS << ") "; 473*5df3bbf3SFrancis Visoiu Mistrih } 474*5df3bbf3SFrancis Visoiu Mistrih 475aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI, 476aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 477a8a83d15SFrancis Visoiu Mistrih tryToGetTargetInfo(*this, TRI, IntrinsicInfo); 478aa739695SFrancis Visoiu Mistrih ModuleSlotTracker DummyMST(nullptr); 479a8a83d15SFrancis Visoiu Mistrih print(OS, DummyMST, LLT{}, /*PrintDef=*/false, 480a8a83d15SFrancis Visoiu Mistrih /*ShouldPrintRegisterTies=*/true, 481a8a83d15SFrancis Visoiu Mistrih /*TiedOperandIdx=*/0, TRI, IntrinsicInfo); 482aa739695SFrancis Visoiu Mistrih } 483aa739695SFrancis Visoiu Mistrih 484aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 485a8a83d15SFrancis Visoiu Mistrih LLT TypeToPrint, bool PrintDef, 486a8a83d15SFrancis Visoiu Mistrih bool ShouldPrintRegisterTies, 487a8a83d15SFrancis Visoiu Mistrih unsigned TiedOperandIdx, 488aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI, 489aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 490*5df3bbf3SFrancis Visoiu Mistrih printTargetFlags(OS, *this); 491aa739695SFrancis Visoiu Mistrih switch (getType()) { 492a8a83d15SFrancis Visoiu Mistrih case MachineOperand::MO_Register: { 493a8a83d15SFrancis Visoiu Mistrih unsigned Reg = getReg(); 494aa739695SFrancis Visoiu Mistrih if (isImplicit()) 495a8a83d15SFrancis Visoiu Mistrih OS << (isDef() ? "implicit-def " : "implicit "); 496a8a83d15SFrancis Visoiu Mistrih else if (PrintDef && isDef()) 497a8a83d15SFrancis Visoiu Mistrih // Print the 'def' flag only when the operand is defined after '='. 498aa739695SFrancis Visoiu Mistrih OS << "def "; 499a8a83d15SFrancis Visoiu Mistrih if (isInternalRead()) 500aa739695SFrancis Visoiu Mistrih OS << "internal "; 501a8a83d15SFrancis Visoiu Mistrih if (isDead()) 502a8a83d15SFrancis Visoiu Mistrih OS << "dead "; 503a8a83d15SFrancis Visoiu Mistrih if (isKill()) 504a8a83d15SFrancis Visoiu Mistrih OS << "killed "; 505a8a83d15SFrancis Visoiu Mistrih if (isUndef()) 506a8a83d15SFrancis Visoiu Mistrih OS << "undef "; 507a8a83d15SFrancis Visoiu Mistrih if (isEarlyClobber()) 508a8a83d15SFrancis Visoiu Mistrih OS << "early-clobber "; 509a8a83d15SFrancis Visoiu Mistrih if (isDebug()) 510a8a83d15SFrancis Visoiu Mistrih OS << "debug-use "; 51160c43102SGeoff Berry if (TargetRegisterInfo::isPhysicalRegister(getReg()) && isRenamable()) 51260c43102SGeoff Berry OS << "renamable "; 513a8a83d15SFrancis Visoiu Mistrih OS << printReg(Reg, TRI); 514a8a83d15SFrancis Visoiu Mistrih // Print the sub register. 515a8a83d15SFrancis Visoiu Mistrih if (unsigned SubReg = getSubReg()) { 516a8a83d15SFrancis Visoiu Mistrih if (TRI) 517a8a83d15SFrancis Visoiu Mistrih OS << '.' << TRI->getSubRegIndexName(SubReg); 518a8a83d15SFrancis Visoiu Mistrih else 519a8a83d15SFrancis Visoiu Mistrih OS << ".subreg" << SubReg; 520aa739695SFrancis Visoiu Mistrih } 521a8a83d15SFrancis Visoiu Mistrih // Print the register class / bank. 522a8a83d15SFrancis Visoiu Mistrih if (TargetRegisterInfo::isVirtualRegister(Reg)) { 523567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 524a8a83d15SFrancis Visoiu Mistrih const MachineRegisterInfo &MRI = MF->getRegInfo(); 525a8a83d15SFrancis Visoiu Mistrih if (!PrintDef || MRI.def_empty(Reg)) { 526a8a83d15SFrancis Visoiu Mistrih OS << ':'; 527a8a83d15SFrancis Visoiu Mistrih OS << printRegClassOrBank(Reg, MRI, TRI); 528aa739695SFrancis Visoiu Mistrih } 529aa739695SFrancis Visoiu Mistrih } 530a8a83d15SFrancis Visoiu Mistrih } 531a8a83d15SFrancis Visoiu Mistrih // Print ties. 532a8a83d15SFrancis Visoiu Mistrih if (ShouldPrintRegisterTies && isTied() && !isDef()) 533a8a83d15SFrancis Visoiu Mistrih OS << "(tied-def " << TiedOperandIdx << ")"; 534a8a83d15SFrancis Visoiu Mistrih // Print types. 535a8a83d15SFrancis Visoiu Mistrih if (TypeToPrint.isValid()) 536a8a83d15SFrancis Visoiu Mistrih OS << '(' << TypeToPrint << ')'; 537aa739695SFrancis Visoiu Mistrih break; 538a8a83d15SFrancis Visoiu Mistrih } 539aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 540aa739695SFrancis Visoiu Mistrih OS << getImm(); 541aa739695SFrancis Visoiu Mistrih break; 542aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 5436c4ca713SFrancis Visoiu Mistrih getCImm()->printAsOperand(OS, /*PrintType=*/true, MST); 544aa739695SFrancis Visoiu Mistrih break; 545aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 546aa739695SFrancis Visoiu Mistrih if (getFPImm()->getType()->isFloatTy()) { 547aa739695SFrancis Visoiu Mistrih OS << getFPImm()->getValueAPF().convertToFloat(); 548aa739695SFrancis Visoiu Mistrih } else if (getFPImm()->getType()->isHalfTy()) { 549aa739695SFrancis Visoiu Mistrih APFloat APF = getFPImm()->getValueAPF(); 550aa739695SFrancis Visoiu Mistrih bool Unused; 551aa739695SFrancis Visoiu Mistrih APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Unused); 552aa739695SFrancis Visoiu Mistrih OS << "half " << APF.convertToFloat(); 553aa739695SFrancis Visoiu Mistrih } else if (getFPImm()->getType()->isFP128Ty()) { 554aa739695SFrancis Visoiu Mistrih APFloat APF = getFPImm()->getValueAPF(); 555aa739695SFrancis Visoiu Mistrih SmallString<16> Str; 556aa739695SFrancis Visoiu Mistrih getFPImm()->getValueAPF().toString(Str); 557aa739695SFrancis Visoiu Mistrih OS << "quad " << Str; 558aa739695SFrancis Visoiu Mistrih } else if (getFPImm()->getType()->isX86_FP80Ty()) { 559aa739695SFrancis Visoiu Mistrih APFloat APF = getFPImm()->getValueAPF(); 560aa739695SFrancis Visoiu Mistrih OS << "x86_fp80 0xK"; 561aa739695SFrancis Visoiu Mistrih APInt API = APF.bitcastToAPInt(); 562aa739695SFrancis Visoiu Mistrih OS << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4, 563aa739695SFrancis Visoiu Mistrih /*Upper=*/true); 564aa739695SFrancis Visoiu Mistrih OS << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16, 565aa739695SFrancis Visoiu Mistrih /*Upper=*/true); 566aa739695SFrancis Visoiu Mistrih } else { 567aa739695SFrancis Visoiu Mistrih OS << getFPImm()->getValueAPF().convertToDouble(); 568aa739695SFrancis Visoiu Mistrih } 569aa739695SFrancis Visoiu Mistrih break; 570aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 57125528d6dSFrancis Visoiu Mistrih OS << printMBBReference(*getMBB()); 572aa739695SFrancis Visoiu Mistrih break; 573aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 574aa739695SFrancis Visoiu Mistrih OS << "<fi#" << getIndex() << '>'; 575aa739695SFrancis Visoiu Mistrih break; 576aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 57726ae8a65SFrancis Visoiu Mistrih OS << "%const." << getIndex(); 57826ae8a65SFrancis Visoiu Mistrih printOffset(OS, getOffset()); 579aa739695SFrancis Visoiu Mistrih break; 580b3a0d513SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: { 581b3a0d513SFrancis Visoiu Mistrih OS << "target-index("; 582b3a0d513SFrancis Visoiu Mistrih const char *Name = "<unknown>"; 583b3a0d513SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 584b3a0d513SFrancis Visoiu Mistrih if (const auto *TargetIndexName = getTargetIndexName(*MF, getIndex())) 585b3a0d513SFrancis Visoiu Mistrih Name = TargetIndexName; 586b3a0d513SFrancis Visoiu Mistrih OS << Name << ')'; 587b3a0d513SFrancis Visoiu Mistrih printOffset(OS, getOffset()); 588aa739695SFrancis Visoiu Mistrih break; 589b3a0d513SFrancis Visoiu Mistrih } 590aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 591b41dbbe3SFrancis Visoiu Mistrih OS << printJumpTableEntryReference(getIndex()); 592aa739695SFrancis Visoiu Mistrih break; 593aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 594aa739695SFrancis Visoiu Mistrih getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST); 595*5df3bbf3SFrancis Visoiu Mistrih printOffset(OS, getOffset()); 596aa739695SFrancis Visoiu Mistrih break; 597e76c5fcdSFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: { 598e76c5fcdSFrancis Visoiu Mistrih StringRef Name = getSymbolName(); 599e76c5fcdSFrancis Visoiu Mistrih OS << '$'; 600e76c5fcdSFrancis Visoiu Mistrih if (Name.empty()) { 601e76c5fcdSFrancis Visoiu Mistrih OS << "\"\""; 602e76c5fcdSFrancis Visoiu Mistrih } else { 603e76c5fcdSFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, Name); 604e76c5fcdSFrancis Visoiu Mistrih } 605e76c5fcdSFrancis Visoiu Mistrih printOffset(OS, getOffset()); 606aa739695SFrancis Visoiu Mistrih break; 607e76c5fcdSFrancis Visoiu Mistrih } 608aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 609aa739695SFrancis Visoiu Mistrih OS << '<'; 610aa739695SFrancis Visoiu Mistrih getBlockAddress()->printAsOperand(OS, /*PrintType=*/false, MST); 611aa739695SFrancis Visoiu Mistrih if (getOffset()) 612aa739695SFrancis Visoiu Mistrih OS << "+" << getOffset(); 613aa739695SFrancis Visoiu Mistrih OS << '>'; 614aa739695SFrancis Visoiu Mistrih break; 615aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: { 616a8a83d15SFrancis Visoiu Mistrih OS << "<regmask"; 617a8a83d15SFrancis Visoiu Mistrih if (TRI) { 618aa739695SFrancis Visoiu Mistrih unsigned NumRegsInMask = 0; 619aa739695SFrancis Visoiu Mistrih unsigned NumRegsEmitted = 0; 620aa739695SFrancis Visoiu Mistrih for (unsigned i = 0; i < TRI->getNumRegs(); ++i) { 621aa739695SFrancis Visoiu Mistrih unsigned MaskWord = i / 32; 622aa739695SFrancis Visoiu Mistrih unsigned MaskBit = i % 32; 623aa739695SFrancis Visoiu Mistrih if (getRegMask()[MaskWord] & (1 << MaskBit)) { 624aa739695SFrancis Visoiu Mistrih if (PrintRegMaskNumRegs < 0 || 625aa739695SFrancis Visoiu Mistrih NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) { 626aa739695SFrancis Visoiu Mistrih OS << " " << printReg(i, TRI); 627aa739695SFrancis Visoiu Mistrih NumRegsEmitted++; 628aa739695SFrancis Visoiu Mistrih } 629aa739695SFrancis Visoiu Mistrih NumRegsInMask++; 630aa739695SFrancis Visoiu Mistrih } 631aa739695SFrancis Visoiu Mistrih } 632aa739695SFrancis Visoiu Mistrih if (NumRegsEmitted != NumRegsInMask) 633aa739695SFrancis Visoiu Mistrih OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more..."; 634a8a83d15SFrancis Visoiu Mistrih } else { 635a8a83d15SFrancis Visoiu Mistrih OS << " ..."; 636a8a83d15SFrancis Visoiu Mistrih } 637aa739695SFrancis Visoiu Mistrih OS << ">"; 638aa739695SFrancis Visoiu Mistrih break; 639aa739695SFrancis Visoiu Mistrih } 640aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: 641aa739695SFrancis Visoiu Mistrih OS << "<regliveout>"; 642aa739695SFrancis Visoiu Mistrih break; 643aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 644aa739695SFrancis Visoiu Mistrih OS << '<'; 645aa739695SFrancis Visoiu Mistrih getMetadata()->printAsOperand(OS, MST); 646aa739695SFrancis Visoiu Mistrih OS << '>'; 647aa739695SFrancis Visoiu Mistrih break; 648aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 649aa739695SFrancis Visoiu Mistrih OS << "<MCSym=" << *getMCSymbol() << '>'; 650aa739695SFrancis Visoiu Mistrih break; 651aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 652aa739695SFrancis Visoiu Mistrih OS << "<call frame instruction>"; 653aa739695SFrancis Visoiu Mistrih break; 654aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: { 655aa739695SFrancis Visoiu Mistrih Intrinsic::ID ID = getIntrinsicID(); 656aa739695SFrancis Visoiu Mistrih if (ID < Intrinsic::num_intrinsics) 657aa739695SFrancis Visoiu Mistrih OS << "<intrinsic:@" << Intrinsic::getName(ID, None) << '>'; 658aa739695SFrancis Visoiu Mistrih else if (IntrinsicInfo) 659aa739695SFrancis Visoiu Mistrih OS << "<intrinsic:@" << IntrinsicInfo->getName(ID) << '>'; 660aa739695SFrancis Visoiu Mistrih else 661aa739695SFrancis Visoiu Mistrih OS << "<intrinsic:" << ID << '>'; 662aa739695SFrancis Visoiu Mistrih break; 663aa739695SFrancis Visoiu Mistrih } 664aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: { 665aa739695SFrancis Visoiu Mistrih auto Pred = static_cast<CmpInst::Predicate>(getPredicate()); 666aa739695SFrancis Visoiu Mistrih OS << '<' << (CmpInst::isIntPredicate(Pred) ? "intpred" : "floatpred") 667aa739695SFrancis Visoiu Mistrih << CmpInst::getPredicateName(Pred) << '>'; 668aa739695SFrancis Visoiu Mistrih break; 669aa739695SFrancis Visoiu Mistrih } 670aa739695SFrancis Visoiu Mistrih } 671aa739695SFrancis Visoiu Mistrih } 672aa739695SFrancis Visoiu Mistrih 673aa739695SFrancis Visoiu Mistrih #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 674aa739695SFrancis Visoiu Mistrih LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; } 675aa739695SFrancis Visoiu Mistrih #endif 676aa739695SFrancis Visoiu Mistrih 677aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 678aa739695SFrancis Visoiu Mistrih // MachineMemOperand Implementation 679aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 680aa739695SFrancis Visoiu Mistrih 681aa739695SFrancis Visoiu Mistrih /// getAddrSpace - Return the LLVM IR address space number that this pointer 682aa739695SFrancis Visoiu Mistrih /// points into. 68349477040SYaxun Liu unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; } 684aa739695SFrancis Visoiu Mistrih 685aa739695SFrancis Visoiu Mistrih /// isDereferenceable - Return true if V is always dereferenceable for 686aa739695SFrancis Visoiu Mistrih /// Offset + Size byte. 687aa739695SFrancis Visoiu Mistrih bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C, 688aa739695SFrancis Visoiu Mistrih const DataLayout &DL) const { 689aa739695SFrancis Visoiu Mistrih if (!V.is<const Value *>()) 690aa739695SFrancis Visoiu Mistrih return false; 691aa739695SFrancis Visoiu Mistrih 692aa739695SFrancis Visoiu Mistrih const Value *BasePtr = V.get<const Value *>(); 693aa739695SFrancis Visoiu Mistrih if (BasePtr == nullptr) 694aa739695SFrancis Visoiu Mistrih return false; 695aa739695SFrancis Visoiu Mistrih 696aa739695SFrancis Visoiu Mistrih return isDereferenceableAndAlignedPointer( 697aa739695SFrancis Visoiu Mistrih BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL); 698aa739695SFrancis Visoiu Mistrih } 699aa739695SFrancis Visoiu Mistrih 700aa739695SFrancis Visoiu Mistrih /// getConstantPool - Return a MachinePointerInfo record that refers to the 701aa739695SFrancis Visoiu Mistrih /// constant pool. 702aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) { 703aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getConstantPool()); 704aa739695SFrancis Visoiu Mistrih } 705aa739695SFrancis Visoiu Mistrih 706aa739695SFrancis Visoiu Mistrih /// getFixedStack - Return a MachinePointerInfo record that refers to the 707aa739695SFrancis Visoiu Mistrih /// the specified FrameIndex. 708aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF, 709aa739695SFrancis Visoiu Mistrih int FI, int64_t Offset) { 710aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset); 711aa739695SFrancis Visoiu Mistrih } 712aa739695SFrancis Visoiu Mistrih 713aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) { 714aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getJumpTable()); 715aa739695SFrancis Visoiu Mistrih } 716aa739695SFrancis Visoiu Mistrih 717aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) { 718aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getGOT()); 719aa739695SFrancis Visoiu Mistrih } 720aa739695SFrancis Visoiu Mistrih 721aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF, 722aa739695SFrancis Visoiu Mistrih int64_t Offset, uint8_t ID) { 723aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID); 724aa739695SFrancis Visoiu Mistrih } 725aa739695SFrancis Visoiu Mistrih 72649477040SYaxun Liu MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) { 72749477040SYaxun Liu return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace()); 72849477040SYaxun Liu } 72949477040SYaxun Liu 730aa739695SFrancis Visoiu Mistrih MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 731aa739695SFrancis Visoiu Mistrih uint64_t s, unsigned int a, 732aa739695SFrancis Visoiu Mistrih const AAMDNodes &AAInfo, 733aa739695SFrancis Visoiu Mistrih const MDNode *Ranges, SyncScope::ID SSID, 734aa739695SFrancis Visoiu Mistrih AtomicOrdering Ordering, 735aa739695SFrancis Visoiu Mistrih AtomicOrdering FailureOrdering) 736aa739695SFrancis Visoiu Mistrih : PtrInfo(ptrinfo), Size(s), FlagVals(f), BaseAlignLog2(Log2_32(a) + 1), 737aa739695SFrancis Visoiu Mistrih AAInfo(AAInfo), Ranges(Ranges) { 738aa739695SFrancis Visoiu Mistrih assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() || 739aa739695SFrancis Visoiu Mistrih isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) && 740aa739695SFrancis Visoiu Mistrih "invalid pointer value"); 741aa739695SFrancis Visoiu Mistrih assert(getBaseAlignment() == a && "Alignment is not a power of 2!"); 742aa739695SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && "Not a load/store!"); 743aa739695SFrancis Visoiu Mistrih 744aa739695SFrancis Visoiu Mistrih AtomicInfo.SSID = static_cast<unsigned>(SSID); 745aa739695SFrancis Visoiu Mistrih assert(getSyncScopeID() == SSID && "Value truncated"); 746aa739695SFrancis Visoiu Mistrih AtomicInfo.Ordering = static_cast<unsigned>(Ordering); 747aa739695SFrancis Visoiu Mistrih assert(getOrdering() == Ordering && "Value truncated"); 748aa739695SFrancis Visoiu Mistrih AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering); 749aa739695SFrancis Visoiu Mistrih assert(getFailureOrdering() == FailureOrdering && "Value truncated"); 750aa739695SFrancis Visoiu Mistrih } 751aa739695SFrancis Visoiu Mistrih 752aa739695SFrancis Visoiu Mistrih /// Profile - Gather unique data for the object. 753aa739695SFrancis Visoiu Mistrih /// 754aa739695SFrancis Visoiu Mistrih void MachineMemOperand::Profile(FoldingSetNodeID &ID) const { 755aa739695SFrancis Visoiu Mistrih ID.AddInteger(getOffset()); 756aa739695SFrancis Visoiu Mistrih ID.AddInteger(Size); 757aa739695SFrancis Visoiu Mistrih ID.AddPointer(getOpaqueValue()); 758aa739695SFrancis Visoiu Mistrih ID.AddInteger(getFlags()); 759aa739695SFrancis Visoiu Mistrih ID.AddInteger(getBaseAlignment()); 760aa739695SFrancis Visoiu Mistrih } 761aa739695SFrancis Visoiu Mistrih 762aa739695SFrancis Visoiu Mistrih void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) { 763aa739695SFrancis Visoiu Mistrih // The Value and Offset may differ due to CSE. But the flags and size 764aa739695SFrancis Visoiu Mistrih // should be the same. 765aa739695SFrancis Visoiu Mistrih assert(MMO->getFlags() == getFlags() && "Flags mismatch!"); 766aa739695SFrancis Visoiu Mistrih assert(MMO->getSize() == getSize() && "Size mismatch!"); 767aa739695SFrancis Visoiu Mistrih 768aa739695SFrancis Visoiu Mistrih if (MMO->getBaseAlignment() >= getBaseAlignment()) { 769aa739695SFrancis Visoiu Mistrih // Update the alignment value. 770aa739695SFrancis Visoiu Mistrih BaseAlignLog2 = Log2_32(MMO->getBaseAlignment()) + 1; 771aa739695SFrancis Visoiu Mistrih // Also update the base and offset, because the new alignment may 772aa739695SFrancis Visoiu Mistrih // not be applicable with the old ones. 773aa739695SFrancis Visoiu Mistrih PtrInfo = MMO->PtrInfo; 774aa739695SFrancis Visoiu Mistrih } 775aa739695SFrancis Visoiu Mistrih } 776aa739695SFrancis Visoiu Mistrih 777aa739695SFrancis Visoiu Mistrih /// getAlignment - Return the minimum known alignment in bytes of the 778aa739695SFrancis Visoiu Mistrih /// actual memory reference. 779aa739695SFrancis Visoiu Mistrih uint64_t MachineMemOperand::getAlignment() const { 780aa739695SFrancis Visoiu Mistrih return MinAlign(getBaseAlignment(), getOffset()); 781aa739695SFrancis Visoiu Mistrih } 782aa739695SFrancis Visoiu Mistrih 783aa739695SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS) const { 784aa739695SFrancis Visoiu Mistrih ModuleSlotTracker DummyMST(nullptr); 785aa739695SFrancis Visoiu Mistrih print(OS, DummyMST); 786aa739695SFrancis Visoiu Mistrih } 787aa739695SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const { 788aa739695SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && "SV has to be a load, store or both."); 789aa739695SFrancis Visoiu Mistrih 790aa739695SFrancis Visoiu Mistrih if (isVolatile()) 791aa739695SFrancis Visoiu Mistrih OS << "Volatile "; 792aa739695SFrancis Visoiu Mistrih 793aa739695SFrancis Visoiu Mistrih if (isLoad()) 794aa739695SFrancis Visoiu Mistrih OS << "LD"; 795aa739695SFrancis Visoiu Mistrih if (isStore()) 796aa739695SFrancis Visoiu Mistrih OS << "ST"; 797aa739695SFrancis Visoiu Mistrih OS << getSize(); 798aa739695SFrancis Visoiu Mistrih 799aa739695SFrancis Visoiu Mistrih // Print the address information. 800aa739695SFrancis Visoiu Mistrih OS << "["; 801aa739695SFrancis Visoiu Mistrih if (const Value *V = getValue()) 802aa739695SFrancis Visoiu Mistrih V->printAsOperand(OS, /*PrintType=*/false, MST); 803aa739695SFrancis Visoiu Mistrih else if (const PseudoSourceValue *PSV = getPseudoValue()) 804aa739695SFrancis Visoiu Mistrih PSV->printCustom(OS); 805aa739695SFrancis Visoiu Mistrih else 806aa739695SFrancis Visoiu Mistrih OS << "<unknown>"; 807aa739695SFrancis Visoiu Mistrih 808aa739695SFrancis Visoiu Mistrih unsigned AS = getAddrSpace(); 809aa739695SFrancis Visoiu Mistrih if (AS != 0) 810aa739695SFrancis Visoiu Mistrih OS << "(addrspace=" << AS << ')'; 811aa739695SFrancis Visoiu Mistrih 812aa739695SFrancis Visoiu Mistrih // If the alignment of the memory reference itself differs from the alignment 813aa739695SFrancis Visoiu Mistrih // of the base pointer, print the base alignment explicitly, next to the base 814aa739695SFrancis Visoiu Mistrih // pointer. 815aa739695SFrancis Visoiu Mistrih if (getBaseAlignment() != getAlignment()) 816aa739695SFrancis Visoiu Mistrih OS << "(align=" << getBaseAlignment() << ")"; 817aa739695SFrancis Visoiu Mistrih 818aa739695SFrancis Visoiu Mistrih if (getOffset() != 0) 819aa739695SFrancis Visoiu Mistrih OS << "+" << getOffset(); 820aa739695SFrancis Visoiu Mistrih OS << "]"; 821aa739695SFrancis Visoiu Mistrih 822aa739695SFrancis Visoiu Mistrih // Print the alignment of the reference. 823aa739695SFrancis Visoiu Mistrih if (getBaseAlignment() != getAlignment() || getBaseAlignment() != getSize()) 824aa739695SFrancis Visoiu Mistrih OS << "(align=" << getAlignment() << ")"; 825aa739695SFrancis Visoiu Mistrih 826aa739695SFrancis Visoiu Mistrih // Print TBAA info. 827aa739695SFrancis Visoiu Mistrih if (const MDNode *TBAAInfo = getAAInfo().TBAA) { 828aa739695SFrancis Visoiu Mistrih OS << "(tbaa="; 829aa739695SFrancis Visoiu Mistrih if (TBAAInfo->getNumOperands() > 0) 830aa739695SFrancis Visoiu Mistrih TBAAInfo->getOperand(0)->printAsOperand(OS, MST); 831aa739695SFrancis Visoiu Mistrih else 832aa739695SFrancis Visoiu Mistrih OS << "<unknown>"; 833aa739695SFrancis Visoiu Mistrih OS << ")"; 834aa739695SFrancis Visoiu Mistrih } 835aa739695SFrancis Visoiu Mistrih 836aa739695SFrancis Visoiu Mistrih // Print AA scope info. 837aa739695SFrancis Visoiu Mistrih if (const MDNode *ScopeInfo = getAAInfo().Scope) { 838aa739695SFrancis Visoiu Mistrih OS << "(alias.scope="; 839aa739695SFrancis Visoiu Mistrih if (ScopeInfo->getNumOperands() > 0) 840aa739695SFrancis Visoiu Mistrih for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) { 841aa739695SFrancis Visoiu Mistrih ScopeInfo->getOperand(i)->printAsOperand(OS, MST); 842aa739695SFrancis Visoiu Mistrih if (i != ie - 1) 843aa739695SFrancis Visoiu Mistrih OS << ","; 844aa739695SFrancis Visoiu Mistrih } 845aa739695SFrancis Visoiu Mistrih else 846aa739695SFrancis Visoiu Mistrih OS << "<unknown>"; 847aa739695SFrancis Visoiu Mistrih OS << ")"; 848aa739695SFrancis Visoiu Mistrih } 849aa739695SFrancis Visoiu Mistrih 850aa739695SFrancis Visoiu Mistrih // Print AA noalias scope info. 851aa739695SFrancis Visoiu Mistrih if (const MDNode *NoAliasInfo = getAAInfo().NoAlias) { 852aa739695SFrancis Visoiu Mistrih OS << "(noalias="; 853aa739695SFrancis Visoiu Mistrih if (NoAliasInfo->getNumOperands() > 0) 854aa739695SFrancis Visoiu Mistrih for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) { 855aa739695SFrancis Visoiu Mistrih NoAliasInfo->getOperand(i)->printAsOperand(OS, MST); 856aa739695SFrancis Visoiu Mistrih if (i != ie - 1) 857aa739695SFrancis Visoiu Mistrih OS << ","; 858aa739695SFrancis Visoiu Mistrih } 859aa739695SFrancis Visoiu Mistrih else 860aa739695SFrancis Visoiu Mistrih OS << "<unknown>"; 861aa739695SFrancis Visoiu Mistrih OS << ")"; 862aa739695SFrancis Visoiu Mistrih } 863aa739695SFrancis Visoiu Mistrih 864aa739695SFrancis Visoiu Mistrih if (const MDNode *Ranges = getRanges()) { 865aa739695SFrancis Visoiu Mistrih unsigned NumRanges = Ranges->getNumOperands(); 866aa739695SFrancis Visoiu Mistrih if (NumRanges != 0) { 867aa739695SFrancis Visoiu Mistrih OS << "(ranges="; 868aa739695SFrancis Visoiu Mistrih 869aa739695SFrancis Visoiu Mistrih for (unsigned I = 0; I != NumRanges; ++I) { 870aa739695SFrancis Visoiu Mistrih Ranges->getOperand(I)->printAsOperand(OS, MST); 871aa739695SFrancis Visoiu Mistrih if (I != NumRanges - 1) 872aa739695SFrancis Visoiu Mistrih OS << ','; 873aa739695SFrancis Visoiu Mistrih } 874aa739695SFrancis Visoiu Mistrih 875aa739695SFrancis Visoiu Mistrih OS << ')'; 876aa739695SFrancis Visoiu Mistrih } 877aa739695SFrancis Visoiu Mistrih } 878aa739695SFrancis Visoiu Mistrih 879aa739695SFrancis Visoiu Mistrih if (isNonTemporal()) 880aa739695SFrancis Visoiu Mistrih OS << "(nontemporal)"; 881aa739695SFrancis Visoiu Mistrih if (isDereferenceable()) 882aa739695SFrancis Visoiu Mistrih OS << "(dereferenceable)"; 883aa739695SFrancis Visoiu Mistrih if (isInvariant()) 884aa739695SFrancis Visoiu Mistrih OS << "(invariant)"; 885aa739695SFrancis Visoiu Mistrih if (getFlags() & MOTargetFlag1) 886aa739695SFrancis Visoiu Mistrih OS << "(flag1)"; 887aa739695SFrancis Visoiu Mistrih if (getFlags() & MOTargetFlag2) 888aa739695SFrancis Visoiu Mistrih OS << "(flag2)"; 889aa739695SFrancis Visoiu Mistrih if (getFlags() & MOTargetFlag3) 890aa739695SFrancis Visoiu Mistrih OS << "(flag3)"; 891aa739695SFrancis Visoiu Mistrih } 892