1aa739695SFrancis Visoiu Mistrih //===- lib/CodeGen/MachineOperand.cpp -------------------------------------===// 2aa739695SFrancis Visoiu Mistrih // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6aa739695SFrancis Visoiu Mistrih // 7aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 8aa739695SFrancis Visoiu Mistrih // 93aa8eaa9SFrancis Visoiu Mistrih /// \file Methods common to all machine operands. 10aa739695SFrancis Visoiu Mistrih // 11aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 12aa739695SFrancis Visoiu Mistrih 13aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineOperand.h" 14423e3db6SReid Kleckner #include "llvm/ADT/FoldingSet.h" 15e85b06d6SFrancis Visoiu Mistrih #include "llvm/ADT/StringExtras.h" 16aa739695SFrancis Visoiu Mistrih #include "llvm/Analysis/Loads.h" 17cc3f6302SKrzysztof Parzyszek #include "llvm/Analysis/MemoryLocation.h" 18de3d0ee0SDaniel Sanders #include "llvm/CodeGen/MIRFormatter.h" 19aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MIRPrinter.h" 200b5bdceaSFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineFrameInfo.h" 21b41dbbe3SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineJumpTableInfo.h" 22aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/MachineRegisterInfo.h" 23b3a0d513SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetInstrInfo.h" 24aa739695SFrancis Visoiu Mistrih #include "llvm/CodeGen/TargetRegisterInfo.h" 25432a3883SNico Weber #include "llvm/Config/llvm-config.h" 26aa739695SFrancis Visoiu Mistrih #include "llvm/IR/Constants.h" 27e76c5fcdSFrancis Visoiu Mistrih #include "llvm/IR/IRPrintingPasses.h" 28bf77c7efSSimon Pilgrim #include "llvm/IR/Instructions.h" 29aa739695SFrancis Visoiu Mistrih #include "llvm/IR/ModuleSlotTracker.h" 30b6c190daSEric Christopher #include "llvm/MC/MCDwarf.h" 31a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetIntrinsicInfo.h" 32a8a83d15SFrancis Visoiu Mistrih #include "llvm/Target/TargetMachine.h" 33aa739695SFrancis Visoiu Mistrih 34aa739695SFrancis Visoiu Mistrih using namespace llvm; 35aa739695SFrancis Visoiu Mistrih 36aa739695SFrancis Visoiu Mistrih static cl::opt<int> 37aa739695SFrancis Visoiu Mistrih PrintRegMaskNumRegs("print-regmask-num-regs", 38aa739695SFrancis Visoiu Mistrih cl::desc("Number of registers to limit to when " 39aa739695SFrancis Visoiu Mistrih "printing regmask operands in IR dumps. " 40aa739695SFrancis Visoiu Mistrih "unlimited = -1"), 41aa739695SFrancis Visoiu Mistrih cl::init(32), cl::Hidden); 42aa739695SFrancis Visoiu Mistrih 4395a05915SFrancis Visoiu Mistrih static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) { 4495a05915SFrancis Visoiu Mistrih if (const MachineInstr *MI = MO.getParent()) 4595a05915SFrancis Visoiu Mistrih if (const MachineBasicBlock *MBB = MI->getParent()) 4695a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = MBB->getParent()) 4795a05915SFrancis Visoiu Mistrih return MF; 4895a05915SFrancis Visoiu Mistrih return nullptr; 4995a05915SFrancis Visoiu Mistrih } 5095a05915SFrancis Visoiu Mistrih static MachineFunction *getMFIfAvailable(MachineOperand &MO) { 5195a05915SFrancis Visoiu Mistrih return const_cast<MachineFunction *>( 5295a05915SFrancis Visoiu Mistrih getMFIfAvailable(const_cast<const MachineOperand &>(MO))); 5395a05915SFrancis Visoiu Mistrih } 5495a05915SFrancis Visoiu Mistrih 55f4d3113aSMatt Arsenault void MachineOperand::setReg(Register Reg) { 56aa739695SFrancis Visoiu Mistrih if (getReg() == Reg) 57aa739695SFrancis Visoiu Mistrih return; // No change. 58aa739695SFrancis Visoiu Mistrih 59f8bf2ec0SGeoff Berry // Clear the IsRenamable bit to keep it conservatively correct. 60f8bf2ec0SGeoff Berry IsRenamable = false; 61f8bf2ec0SGeoff Berry 62aa739695SFrancis Visoiu Mistrih // Otherwise, we have to change the register. If this operand is embedded 63aa739695SFrancis Visoiu Mistrih // into a machine function, we need to update the old and new register's 64aa739695SFrancis Visoiu Mistrih // use/def lists. 6595a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 66aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 67aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 68aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 69aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 70aa739695SFrancis Visoiu Mistrih return; 71aa739695SFrancis Visoiu Mistrih } 72aa739695SFrancis Visoiu Mistrih 73aa739695SFrancis Visoiu Mistrih // Otherwise, just change the register, no problem. :) 74aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 75aa739695SFrancis Visoiu Mistrih } 76aa739695SFrancis Visoiu Mistrih 77f4d3113aSMatt Arsenault void MachineOperand::substVirtReg(Register Reg, unsigned SubIdx, 78aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo &TRI) { 79f4d3113aSMatt Arsenault assert(Reg.isVirtual()); 80aa739695SFrancis Visoiu Mistrih if (SubIdx && getSubReg()) 81aa739695SFrancis Visoiu Mistrih SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg()); 82aa739695SFrancis Visoiu Mistrih setReg(Reg); 83aa739695SFrancis Visoiu Mistrih if (SubIdx) 84aa739695SFrancis Visoiu Mistrih setSubReg(SubIdx); 85aa739695SFrancis Visoiu Mistrih } 86aa739695SFrancis Visoiu Mistrih 87f4d3113aSMatt Arsenault void MachineOperand::substPhysReg(MCRegister Reg, const TargetRegisterInfo &TRI) { 882c4c2dc2SFangrui Song assert(Register::isPhysicalRegister(Reg)); 89aa739695SFrancis Visoiu Mistrih if (getSubReg()) { 90aa739695SFrancis Visoiu Mistrih Reg = TRI.getSubReg(Reg, getSubReg()); 91aa739695SFrancis Visoiu Mistrih // Note that getSubReg() may return 0 if the sub-register doesn't exist. 92aa739695SFrancis Visoiu Mistrih // That won't happen in legal code. 93aa739695SFrancis Visoiu Mistrih setSubReg(0); 94aa739695SFrancis Visoiu Mistrih if (isDef()) 95aa739695SFrancis Visoiu Mistrih setIsUndef(false); 96aa739695SFrancis Visoiu Mistrih } 97aa739695SFrancis Visoiu Mistrih setReg(Reg); 98aa739695SFrancis Visoiu Mistrih } 99aa739695SFrancis Visoiu Mistrih 100aa739695SFrancis Visoiu Mistrih /// Change a def to a use, or a use to a def. 101aa739695SFrancis Visoiu Mistrih void MachineOperand::setIsDef(bool Val) { 102aa739695SFrancis Visoiu Mistrih assert(isReg() && "Wrong MachineOperand accessor"); 103aa739695SFrancis Visoiu Mistrih assert((!Val || !isDebug()) && "Marking a debug operation as def"); 104aa739695SFrancis Visoiu Mistrih if (IsDef == Val) 105aa739695SFrancis Visoiu Mistrih return; 10660c43102SGeoff Berry assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported"); 107aa739695SFrancis Visoiu Mistrih // MRI may keep uses and defs in different list positions. 10895a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) { 109aa739695SFrancis Visoiu Mistrih MachineRegisterInfo &MRI = MF->getRegInfo(); 110aa739695SFrancis Visoiu Mistrih MRI.removeRegOperandFromUseList(this); 111aa739695SFrancis Visoiu Mistrih IsDef = Val; 112aa739695SFrancis Visoiu Mistrih MRI.addRegOperandToUseList(this); 113aa739695SFrancis Visoiu Mistrih return; 114aa739695SFrancis Visoiu Mistrih } 115aa739695SFrancis Visoiu Mistrih IsDef = Val; 116aa739695SFrancis Visoiu Mistrih } 117aa739695SFrancis Visoiu Mistrih 11860c43102SGeoff Berry bool MachineOperand::isRenamable() const { 11960c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 1202bea69bfSDaniel Sanders assert(Register::isPhysicalRegister(getReg()) && 12160c43102SGeoff Berry "isRenamable should only be checked on physical registers"); 122f8bf2ec0SGeoff Berry if (!IsRenamable) 123f8bf2ec0SGeoff Berry return false; 124f8bf2ec0SGeoff Berry 125f8bf2ec0SGeoff Berry const MachineInstr *MI = getParent(); 126f8bf2ec0SGeoff Berry if (!MI) 127f8bf2ec0SGeoff Berry return true; 128f8bf2ec0SGeoff Berry 129f8bf2ec0SGeoff Berry if (isDef()) 130f8bf2ec0SGeoff Berry return !MI->hasExtraDefRegAllocReq(MachineInstr::IgnoreBundle); 131f8bf2ec0SGeoff Berry 132f8bf2ec0SGeoff Berry assert(isUse() && "Reg is not def or use"); 133f8bf2ec0SGeoff Berry return !MI->hasExtraSrcRegAllocReq(MachineInstr::IgnoreBundle); 13460c43102SGeoff Berry } 13560c43102SGeoff Berry 13660c43102SGeoff Berry void MachineOperand::setIsRenamable(bool Val) { 13760c43102SGeoff Berry assert(isReg() && "Wrong MachineOperand accessor"); 1382bea69bfSDaniel Sanders assert(Register::isPhysicalRegister(getReg()) && 13960c43102SGeoff Berry "setIsRenamable should only be called on physical registers"); 14060c43102SGeoff Berry IsRenamable = Val; 14160c43102SGeoff Berry } 14260c43102SGeoff Berry 143aa739695SFrancis Visoiu Mistrih // If this operand is currently a register operand, and if this is in a 144aa739695SFrancis Visoiu Mistrih // function, deregister the operand from the register's use/def list. 145aa739695SFrancis Visoiu Mistrih void MachineOperand::removeRegFromUses() { 146aa739695SFrancis Visoiu Mistrih if (!isReg() || !isOnRegUseList()) 147aa739695SFrancis Visoiu Mistrih return; 148aa739695SFrancis Visoiu Mistrih 14995a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 150aa739695SFrancis Visoiu Mistrih MF->getRegInfo().removeRegOperandFromUseList(this); 151aa739695SFrancis Visoiu Mistrih } 152aa739695SFrancis Visoiu Mistrih 153aa739695SFrancis Visoiu Mistrih /// ChangeToImmediate - Replace this operand with a new immediate operand of 154aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an immediate already, 155aa739695SFrancis Visoiu Mistrih /// the setImm method should be used. 156bf41c4d2SMichael Liao void MachineOperand::ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags) { 157aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 158aa739695SFrancis Visoiu Mistrih 159aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 160aa739695SFrancis Visoiu Mistrih 161aa739695SFrancis Visoiu Mistrih OpKind = MO_Immediate; 162aa739695SFrancis Visoiu Mistrih Contents.ImmVal = ImmVal; 163bf41c4d2SMichael Liao setTargetFlags(TargetFlags); 164aa739695SFrancis Visoiu Mistrih } 165aa739695SFrancis Visoiu Mistrih 166bf41c4d2SMichael Liao void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm, 167bf41c4d2SMichael Liao unsigned TargetFlags) { 168aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm"); 169aa739695SFrancis Visoiu Mistrih 170aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 171aa739695SFrancis Visoiu Mistrih 172aa739695SFrancis Visoiu Mistrih OpKind = MO_FPImmediate; 173aa739695SFrancis Visoiu Mistrih Contents.CFP = FPImm; 174bf41c4d2SMichael Liao setTargetFlags(TargetFlags); 175aa739695SFrancis Visoiu Mistrih } 176aa739695SFrancis Visoiu Mistrih 177aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToES(const char *SymName, 17833773d5cSPeter Collingbourne unsigned TargetFlags) { 179aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 180aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an external symbol"); 181aa739695SFrancis Visoiu Mistrih 182aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 183aa739695SFrancis Visoiu Mistrih 184aa739695SFrancis Visoiu Mistrih OpKind = MO_ExternalSymbol; 185aa739695SFrancis Visoiu Mistrih Contents.OffsetedInfo.Val.SymbolName = SymName; 186aa739695SFrancis Visoiu Mistrih setOffset(0); // Offset is always 0. 187aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 188aa739695SFrancis Visoiu Mistrih } 189aa739695SFrancis Visoiu Mistrih 190f672b617SNicolai Haehnle void MachineOperand::ChangeToGA(const GlobalValue *GV, int64_t Offset, 19133773d5cSPeter Collingbourne unsigned TargetFlags) { 192f672b617SNicolai Haehnle assert((!isReg() || !isTied()) && 193f672b617SNicolai Haehnle "Cannot change a tied operand into a global address"); 194f672b617SNicolai Haehnle 195f672b617SNicolai Haehnle removeRegFromUses(); 196f672b617SNicolai Haehnle 197f672b617SNicolai Haehnle OpKind = MO_GlobalAddress; 198f672b617SNicolai Haehnle Contents.OffsetedInfo.Val.GV = GV; 199f672b617SNicolai Haehnle setOffset(Offset); 200f672b617SNicolai Haehnle setTargetFlags(TargetFlags); 201f672b617SNicolai Haehnle } 202f672b617SNicolai Haehnle 203bf41c4d2SMichael Liao void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags) { 204aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 205aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into an MCSymbol"); 206aa739695SFrancis Visoiu Mistrih 207aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 208aa739695SFrancis Visoiu Mistrih 209aa739695SFrancis Visoiu Mistrih OpKind = MO_MCSymbol; 210aa739695SFrancis Visoiu Mistrih Contents.Sym = Sym; 211bf41c4d2SMichael Liao setTargetFlags(TargetFlags); 212aa739695SFrancis Visoiu Mistrih } 213aa739695SFrancis Visoiu Mistrih 214bf41c4d2SMichael Liao void MachineOperand::ChangeToFrameIndex(int Idx, unsigned TargetFlags) { 215aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 216aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 217aa739695SFrancis Visoiu Mistrih 218aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 219aa739695SFrancis Visoiu Mistrih 220aa739695SFrancis Visoiu Mistrih OpKind = MO_FrameIndex; 221aa739695SFrancis Visoiu Mistrih setIndex(Idx); 222bf41c4d2SMichael Liao setTargetFlags(TargetFlags); 223aa739695SFrancis Visoiu Mistrih } 224aa739695SFrancis Visoiu Mistrih 225aa739695SFrancis Visoiu Mistrih void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset, 22633773d5cSPeter Collingbourne unsigned TargetFlags) { 227aa739695SFrancis Visoiu Mistrih assert((!isReg() || !isTied()) && 228aa739695SFrancis Visoiu Mistrih "Cannot change a tied operand into a FrameIndex"); 229aa739695SFrancis Visoiu Mistrih 230aa739695SFrancis Visoiu Mistrih removeRegFromUses(); 231aa739695SFrancis Visoiu Mistrih 232aa739695SFrancis Visoiu Mistrih OpKind = MO_TargetIndex; 233aa739695SFrancis Visoiu Mistrih setIndex(Idx); 234aa739695SFrancis Visoiu Mistrih setOffset(Offset); 235aa739695SFrancis Visoiu Mistrih setTargetFlags(TargetFlags); 236aa739695SFrancis Visoiu Mistrih } 237aa739695SFrancis Visoiu Mistrih 238aa739695SFrancis Visoiu Mistrih /// ChangeToRegister - Replace this operand with a new register operand of 239aa739695SFrancis Visoiu Mistrih /// the specified value. If an operand is known to be an register already, 240aa739695SFrancis Visoiu Mistrih /// the setReg method should be used. 241f4d3113aSMatt Arsenault void MachineOperand::ChangeToRegister(Register Reg, bool isDef, bool isImp, 242aa739695SFrancis Visoiu Mistrih bool isKill, bool isDead, bool isUndef, 243aa739695SFrancis Visoiu Mistrih bool isDebug) { 244aa739695SFrancis Visoiu Mistrih MachineRegisterInfo *RegInfo = nullptr; 24595a05915SFrancis Visoiu Mistrih if (MachineFunction *MF = getMFIfAvailable(*this)) 246aa739695SFrancis Visoiu Mistrih RegInfo = &MF->getRegInfo(); 247aa739695SFrancis Visoiu Mistrih // If this operand is already a register operand, remove it from the 248aa739695SFrancis Visoiu Mistrih // register's use/def lists. 249aa739695SFrancis Visoiu Mistrih bool WasReg = isReg(); 250aa739695SFrancis Visoiu Mistrih if (RegInfo && WasReg) 251aa739695SFrancis Visoiu Mistrih RegInfo->removeRegOperandFromUseList(this); 252aa739695SFrancis Visoiu Mistrih 253bd4dad87SJack Andersen // Ensure debug instructions set debug flag on register uses. 254bd4dad87SJack Andersen const MachineInstr *MI = getParent(); 255bd4dad87SJack Andersen if (!isDef && MI && MI->isDebugInstr()) 256bd4dad87SJack Andersen isDebug = true; 257bd4dad87SJack Andersen 258aa739695SFrancis Visoiu Mistrih // Change this to a register and set the reg#. 25960c43102SGeoff Berry assert(!(isDead && !isDef) && "Dead flag on non-def"); 26060c43102SGeoff Berry assert(!(isKill && isDef) && "Kill flag on def"); 261aa739695SFrancis Visoiu Mistrih OpKind = MO_Register; 262aa739695SFrancis Visoiu Mistrih SmallContents.RegNo = Reg; 263aa739695SFrancis Visoiu Mistrih SubReg_TargetFlags = 0; 264aa739695SFrancis Visoiu Mistrih IsDef = isDef; 265aa739695SFrancis Visoiu Mistrih IsImp = isImp; 26660c43102SGeoff Berry IsDeadOrKill = isKill | isDead; 26760c43102SGeoff Berry IsRenamable = false; 268aa739695SFrancis Visoiu Mistrih IsUndef = isUndef; 269aa739695SFrancis Visoiu Mistrih IsInternalRead = false; 270aa739695SFrancis Visoiu Mistrih IsEarlyClobber = false; 271aa739695SFrancis Visoiu Mistrih IsDebug = isDebug; 272aa739695SFrancis Visoiu Mistrih // Ensure isOnRegUseList() returns false. 273aa739695SFrancis Visoiu Mistrih Contents.Reg.Prev = nullptr; 274aa739695SFrancis Visoiu Mistrih // Preserve the tie when the operand was already a register. 275aa739695SFrancis Visoiu Mistrih if (!WasReg) 276aa739695SFrancis Visoiu Mistrih TiedTo = 0; 277aa739695SFrancis Visoiu Mistrih 278aa739695SFrancis Visoiu Mistrih // If this operand is embedded in a function, add the operand to the 279aa739695SFrancis Visoiu Mistrih // register's use/def list. 280aa739695SFrancis Visoiu Mistrih if (RegInfo) 281aa739695SFrancis Visoiu Mistrih RegInfo->addRegOperandToUseList(this); 282aa739695SFrancis Visoiu Mistrih } 283aa739695SFrancis Visoiu Mistrih 284aa739695SFrancis Visoiu Mistrih /// isIdenticalTo - Return true if this operand is identical to the specified 285aa739695SFrancis Visoiu Mistrih /// operand. Note that this should stay in sync with the hash_value overload 286aa739695SFrancis Visoiu Mistrih /// below. 287aa739695SFrancis Visoiu Mistrih bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 288aa739695SFrancis Visoiu Mistrih if (getType() != Other.getType() || 289aa739695SFrancis Visoiu Mistrih getTargetFlags() != Other.getTargetFlags()) 290aa739695SFrancis Visoiu Mistrih return false; 291aa739695SFrancis Visoiu Mistrih 292aa739695SFrancis Visoiu Mistrih switch (getType()) { 293aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 294aa739695SFrancis Visoiu Mistrih return getReg() == Other.getReg() && isDef() == Other.isDef() && 295aa739695SFrancis Visoiu Mistrih getSubReg() == Other.getSubReg(); 296aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 297aa739695SFrancis Visoiu Mistrih return getImm() == Other.getImm(); 298aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 299aa739695SFrancis Visoiu Mistrih return getCImm() == Other.getCImm(); 300aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 301aa739695SFrancis Visoiu Mistrih return getFPImm() == Other.getFPImm(); 302aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 303aa739695SFrancis Visoiu Mistrih return getMBB() == Other.getMBB(); 304aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 305aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 306aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 307aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 308aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 309aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 310aa739695SFrancis Visoiu Mistrih return getIndex() == Other.getIndex(); 311aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 312aa739695SFrancis Visoiu Mistrih return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 313aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 314aa739695SFrancis Visoiu Mistrih return strcmp(getSymbolName(), Other.getSymbolName()) == 0 && 315aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 316aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 317aa739695SFrancis Visoiu Mistrih return getBlockAddress() == Other.getBlockAddress() && 318aa739695SFrancis Visoiu Mistrih getOffset() == Other.getOffset(); 319aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 320aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: { 321aa739695SFrancis Visoiu Mistrih // Shallow compare of the two RegMasks 322aa739695SFrancis Visoiu Mistrih const uint32_t *RegMask = getRegMask(); 323aa739695SFrancis Visoiu Mistrih const uint32_t *OtherRegMask = Other.getRegMask(); 324aa739695SFrancis Visoiu Mistrih if (RegMask == OtherRegMask) 325aa739695SFrancis Visoiu Mistrih return true; 326aa739695SFrancis Visoiu Mistrih 32795a05915SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 328aa739695SFrancis Visoiu Mistrih // Calculate the size of the RegMask 329aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); 330aa739695SFrancis Visoiu Mistrih unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32; 331aa739695SFrancis Visoiu Mistrih 332aa739695SFrancis Visoiu Mistrih // Deep compare of the two RegMasks 333aa739695SFrancis Visoiu Mistrih return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask); 334aa739695SFrancis Visoiu Mistrih } 33595a05915SFrancis Visoiu Mistrih // We don't know the size of the RegMask, so we can't deep compare the two 33695a05915SFrancis Visoiu Mistrih // reg masks. 33795a05915SFrancis Visoiu Mistrih return false; 33895a05915SFrancis Visoiu Mistrih } 339aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 340aa739695SFrancis Visoiu Mistrih return getMCSymbol() == Other.getMCSymbol(); 341aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 342aa739695SFrancis Visoiu Mistrih return getCFIIndex() == Other.getCFIIndex(); 343aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 344aa739695SFrancis Visoiu Mistrih return getMetadata() == Other.getMetadata(); 345aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 346aa739695SFrancis Visoiu Mistrih return getIntrinsicID() == Other.getIntrinsicID(); 347aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 348aa739695SFrancis Visoiu Mistrih return getPredicate() == Other.getPredicate(); 3495af9cf04SMatt Arsenault case MachineOperand::MO_ShuffleMask: 3505af9cf04SMatt Arsenault return getShuffleMask() == Other.getShuffleMask(); 351aa739695SFrancis Visoiu Mistrih } 352aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 353aa739695SFrancis Visoiu Mistrih } 354aa739695SFrancis Visoiu Mistrih 355aa739695SFrancis Visoiu Mistrih // Note: this must stay exactly in sync with isIdenticalTo above. 356aa739695SFrancis Visoiu Mistrih hash_code llvm::hash_value(const MachineOperand &MO) { 357aa739695SFrancis Visoiu Mistrih switch (MO.getType()) { 358aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Register: 359aa739695SFrancis Visoiu Mistrih // Register operands don't have target flags. 360e3a676e9SMatt Arsenault return hash_combine(MO.getType(), (unsigned)MO.getReg(), MO.getSubReg(), MO.isDef()); 361aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Immediate: 362aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm()); 363aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 364aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm()); 365aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 366aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm()); 367aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 368aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB()); 369aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: 370aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 371aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 372aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: 373aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(), 374aa739695SFrancis Visoiu Mistrih MO.getOffset()); 375aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 376aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); 377aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: 378aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(), 379d8e87227SEli Friedman StringRef(MO.getSymbolName())); 380aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 381aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(), 382aa739695SFrancis Visoiu Mistrih MO.getOffset()); 383aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: 384aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(), 385aa739695SFrancis Visoiu Mistrih MO.getOffset()); 386aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: 387aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: 388aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask()); 389aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 390aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata()); 391aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 392aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); 393aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: 394aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex()); 395aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: 396aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID()); 397aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: 398aa739695SFrancis Visoiu Mistrih return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate()); 3995af9cf04SMatt Arsenault case MachineOperand::MO_ShuffleMask: 4005af9cf04SMatt Arsenault return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getShuffleMask()); 401aa739695SFrancis Visoiu Mistrih } 402aa739695SFrancis Visoiu Mistrih llvm_unreachable("Invalid machine operand type"); 403aa739695SFrancis Visoiu Mistrih } 404aa739695SFrancis Visoiu Mistrih 405a8a83d15SFrancis Visoiu Mistrih // Try to crawl up to the machine function and get TRI and IntrinsicInfo from 406a8a83d15SFrancis Visoiu Mistrih // it. 407a8a83d15SFrancis Visoiu Mistrih static void tryToGetTargetInfo(const MachineOperand &MO, 408a8a83d15SFrancis Visoiu Mistrih const TargetRegisterInfo *&TRI, 409a8a83d15SFrancis Visoiu Mistrih const TargetIntrinsicInfo *&IntrinsicInfo) { 410567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(MO)) { 411a8a83d15SFrancis Visoiu Mistrih TRI = MF->getSubtarget().getRegisterInfo(); 412a8a83d15SFrancis Visoiu Mistrih IntrinsicInfo = MF->getTarget().getIntrinsicInfo(); 413a8a83d15SFrancis Visoiu Mistrih } 414a8a83d15SFrancis Visoiu Mistrih } 415a8a83d15SFrancis Visoiu Mistrih 416b3a0d513SFrancis Visoiu Mistrih static const char *getTargetIndexName(const MachineFunction &MF, int Index) { 417b3a0d513SFrancis Visoiu Mistrih const auto *TII = MF.getSubtarget().getInstrInfo(); 418b3a0d513SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 419b3a0d513SFrancis Visoiu Mistrih auto Indices = TII->getSerializableTargetIndices(); 420b3a0d513SFrancis Visoiu Mistrih auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) { 421b3a0d513SFrancis Visoiu Mistrih return I.first == Index; 422b3a0d513SFrancis Visoiu Mistrih }); 423b3a0d513SFrancis Visoiu Mistrih if (Found != Indices.end()) 424b3a0d513SFrancis Visoiu Mistrih return Found->second; 425b3a0d513SFrancis Visoiu Mistrih return nullptr; 426b3a0d513SFrancis Visoiu Mistrih } 427b3a0d513SFrancis Visoiu Mistrih 4287fff1fbdSPuyan Lotfi const char *MachineOperand::getTargetIndexName() const { 4297fff1fbdSPuyan Lotfi const MachineFunction *MF = getMFIfAvailable(*this); 4307fff1fbdSPuyan Lotfi return MF ? ::getTargetIndexName(*MF, this->getIndex()) : nullptr; 4317fff1fbdSPuyan Lotfi } 4327fff1fbdSPuyan Lotfi 4335df3bbf3SFrancis Visoiu Mistrih static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) { 4345df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->getSerializableDirectMachineOperandTargetFlags(); 4355df3bbf3SFrancis Visoiu Mistrih for (const auto &I : Flags) { 4365df3bbf3SFrancis Visoiu Mistrih if (I.first == TF) { 4375df3bbf3SFrancis Visoiu Mistrih return I.second; 4385df3bbf3SFrancis Visoiu Mistrih } 4395df3bbf3SFrancis Visoiu Mistrih } 4405df3bbf3SFrancis Visoiu Mistrih return nullptr; 4415df3bbf3SFrancis Visoiu Mistrih } 4425df3bbf3SFrancis Visoiu Mistrih 443874ae6faSFrancis Visoiu Mistrih static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS, 444874ae6faSFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 445874ae6faSFrancis Visoiu Mistrih if (!TRI) { 446874ae6faSFrancis Visoiu Mistrih OS << "%dwarfreg." << DwarfReg; 447874ae6faSFrancis Visoiu Mistrih return; 448874ae6faSFrancis Visoiu Mistrih } 449874ae6faSFrancis Visoiu Mistrih 450aaff1a63SPavel Labath if (Optional<unsigned> Reg = TRI->getLLVMRegNum(DwarfReg, true)) 451aaff1a63SPavel Labath OS << printReg(*Reg, TRI); 452aaff1a63SPavel Labath else 453874ae6faSFrancis Visoiu Mistrih OS << "<badreg>"; 454874ae6faSFrancis Visoiu Mistrih } 455874ae6faSFrancis Visoiu Mistrih 456f81727d1SFrancis Visoiu Mistrih static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, 457f81727d1SFrancis Visoiu Mistrih ModuleSlotTracker &MST) { 458f81727d1SFrancis Visoiu Mistrih OS << "%ir-block."; 459f81727d1SFrancis Visoiu Mistrih if (BB.hasName()) { 460f81727d1SFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, BB.getName()); 461f81727d1SFrancis Visoiu Mistrih return; 462f81727d1SFrancis Visoiu Mistrih } 463f81727d1SFrancis Visoiu Mistrih Optional<int> Slot; 464f81727d1SFrancis Visoiu Mistrih if (const Function *F = BB.getParent()) { 465f81727d1SFrancis Visoiu Mistrih if (F == MST.getCurrentFunction()) { 466f81727d1SFrancis Visoiu Mistrih Slot = MST.getLocalSlot(&BB); 467f81727d1SFrancis Visoiu Mistrih } else if (const Module *M = F->getParent()) { 468f81727d1SFrancis Visoiu Mistrih ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false); 469f81727d1SFrancis Visoiu Mistrih CustomMST.incorporateFunction(*F); 470f81727d1SFrancis Visoiu Mistrih Slot = CustomMST.getLocalSlot(&BB); 471f81727d1SFrancis Visoiu Mistrih } 472f81727d1SFrancis Visoiu Mistrih } 473f81727d1SFrancis Visoiu Mistrih if (Slot) 474f81727d1SFrancis Visoiu Mistrih MachineOperand::printIRSlotNumber(OS, *Slot); 475f81727d1SFrancis Visoiu Mistrih else 476f81727d1SFrancis Visoiu Mistrih OS << "<unknown>"; 477f81727d1SFrancis Visoiu Mistrih } 478f81727d1SFrancis Visoiu Mistrih 479e85b06d6SFrancis Visoiu Mistrih static void printSyncScope(raw_ostream &OS, const LLVMContext &Context, 480e85b06d6SFrancis Visoiu Mistrih SyncScope::ID SSID, 481e85b06d6SFrancis Visoiu Mistrih SmallVectorImpl<StringRef> &SSNs) { 482e85b06d6SFrancis Visoiu Mistrih switch (SSID) { 483e85b06d6SFrancis Visoiu Mistrih case SyncScope::System: 484e85b06d6SFrancis Visoiu Mistrih break; 485e85b06d6SFrancis Visoiu Mistrih default: 486e85b06d6SFrancis Visoiu Mistrih if (SSNs.empty()) 487e85b06d6SFrancis Visoiu Mistrih Context.getSyncScopeNames(SSNs); 488e85b06d6SFrancis Visoiu Mistrih 489e85b06d6SFrancis Visoiu Mistrih OS << "syncscope(\""; 490745918ffSJonas Devlieghere printEscapedString(SSNs[SSID], OS); 491e85b06d6SFrancis Visoiu Mistrih OS << "\") "; 492e85b06d6SFrancis Visoiu Mistrih break; 493e85b06d6SFrancis Visoiu Mistrih } 494e85b06d6SFrancis Visoiu Mistrih } 495e85b06d6SFrancis Visoiu Mistrih 496e85b06d6SFrancis Visoiu Mistrih static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, 497e85b06d6SFrancis Visoiu Mistrih unsigned TMMOFlag) { 498e85b06d6SFrancis Visoiu Mistrih auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); 499e85b06d6SFrancis Visoiu Mistrih for (const auto &I : Flags) { 500e85b06d6SFrancis Visoiu Mistrih if (I.first == TMMOFlag) { 501e85b06d6SFrancis Visoiu Mistrih return I.second; 502e85b06d6SFrancis Visoiu Mistrih } 503e85b06d6SFrancis Visoiu Mistrih } 504e85b06d6SFrancis Visoiu Mistrih return nullptr; 505e85b06d6SFrancis Visoiu Mistrih } 506e85b06d6SFrancis Visoiu Mistrih 507e85b06d6SFrancis Visoiu Mistrih static void printFrameIndex(raw_ostream& OS, int FrameIndex, bool IsFixed, 508e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI) { 509e85b06d6SFrancis Visoiu Mistrih StringRef Name; 510e85b06d6SFrancis Visoiu Mistrih if (MFI) { 511e85b06d6SFrancis Visoiu Mistrih IsFixed = MFI->isFixedObjectIndex(FrameIndex); 512e85b06d6SFrancis Visoiu Mistrih if (const AllocaInst *Alloca = MFI->getObjectAllocation(FrameIndex)) 513e85b06d6SFrancis Visoiu Mistrih if (Alloca->hasName()) 514e85b06d6SFrancis Visoiu Mistrih Name = Alloca->getName(); 515e85b06d6SFrancis Visoiu Mistrih if (IsFixed) 516e85b06d6SFrancis Visoiu Mistrih FrameIndex -= MFI->getObjectIndexBegin(); 517e85b06d6SFrancis Visoiu Mistrih } 518e85b06d6SFrancis Visoiu Mistrih MachineOperand::printStackObjectReference(OS, FrameIndex, IsFixed, Name); 519e85b06d6SFrancis Visoiu Mistrih } 520e85b06d6SFrancis Visoiu Mistrih 521ecd0b833SFrancis Visoiu Mistrih void MachineOperand::printSubRegIdx(raw_ostream &OS, uint64_t Index, 522440f69c9SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 523440f69c9SFrancis Visoiu Mistrih OS << "%subreg."; 524440f69c9SFrancis Visoiu Mistrih if (TRI) 525440f69c9SFrancis Visoiu Mistrih OS << TRI->getSubRegIndexName(Index); 526440f69c9SFrancis Visoiu Mistrih else 527440f69c9SFrancis Visoiu Mistrih OS << Index; 528440f69c9SFrancis Visoiu Mistrih } 529440f69c9SFrancis Visoiu Mistrih 5305df3bbf3SFrancis Visoiu Mistrih void MachineOperand::printTargetFlags(raw_ostream &OS, 5315df3bbf3SFrancis Visoiu Mistrih const MachineOperand &Op) { 5325df3bbf3SFrancis Visoiu Mistrih if (!Op.getTargetFlags()) 5335df3bbf3SFrancis Visoiu Mistrih return; 5345df3bbf3SFrancis Visoiu Mistrih const MachineFunction *MF = getMFIfAvailable(Op); 5355df3bbf3SFrancis Visoiu Mistrih if (!MF) 5365df3bbf3SFrancis Visoiu Mistrih return; 5375df3bbf3SFrancis Visoiu Mistrih 5385df3bbf3SFrancis Visoiu Mistrih const auto *TII = MF->getSubtarget().getInstrInfo(); 5395df3bbf3SFrancis Visoiu Mistrih assert(TII && "expected instruction info"); 5405df3bbf3SFrancis Visoiu Mistrih auto Flags = TII->decomposeMachineOperandsTargetFlags(Op.getTargetFlags()); 5415df3bbf3SFrancis Visoiu Mistrih OS << "target-flags("; 5425df3bbf3SFrancis Visoiu Mistrih const bool HasDirectFlags = Flags.first; 5435df3bbf3SFrancis Visoiu Mistrih const bool HasBitmaskFlags = Flags.second; 5445df3bbf3SFrancis Visoiu Mistrih if (!HasDirectFlags && !HasBitmaskFlags) { 5455df3bbf3SFrancis Visoiu Mistrih OS << "<unknown>) "; 5465df3bbf3SFrancis Visoiu Mistrih return; 5475df3bbf3SFrancis Visoiu Mistrih } 5485df3bbf3SFrancis Visoiu Mistrih if (HasDirectFlags) { 5495df3bbf3SFrancis Visoiu Mistrih if (const auto *Name = getTargetFlagName(TII, Flags.first)) 5505df3bbf3SFrancis Visoiu Mistrih OS << Name; 5515df3bbf3SFrancis Visoiu Mistrih else 5525df3bbf3SFrancis Visoiu Mistrih OS << "<unknown target flag>"; 5535df3bbf3SFrancis Visoiu Mistrih } 5545df3bbf3SFrancis Visoiu Mistrih if (!HasBitmaskFlags) { 5555df3bbf3SFrancis Visoiu Mistrih OS << ") "; 5565df3bbf3SFrancis Visoiu Mistrih return; 5575df3bbf3SFrancis Visoiu Mistrih } 5585df3bbf3SFrancis Visoiu Mistrih bool IsCommaNeeded = HasDirectFlags; 5595df3bbf3SFrancis Visoiu Mistrih unsigned BitMask = Flags.second; 5605df3bbf3SFrancis Visoiu Mistrih auto BitMasks = TII->getSerializableBitmaskMachineOperandTargetFlags(); 5615df3bbf3SFrancis Visoiu Mistrih for (const auto &Mask : BitMasks) { 5625df3bbf3SFrancis Visoiu Mistrih // Check if the flag's bitmask has the bits of the current mask set. 5635df3bbf3SFrancis Visoiu Mistrih if ((BitMask & Mask.first) == Mask.first) { 5645df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 5655df3bbf3SFrancis Visoiu Mistrih OS << ", "; 5665df3bbf3SFrancis Visoiu Mistrih IsCommaNeeded = true; 5675df3bbf3SFrancis Visoiu Mistrih OS << Mask.second; 5685df3bbf3SFrancis Visoiu Mistrih // Clear the bits which were serialized from the flag's bitmask. 5695df3bbf3SFrancis Visoiu Mistrih BitMask &= ~(Mask.first); 5705df3bbf3SFrancis Visoiu Mistrih } 5715df3bbf3SFrancis Visoiu Mistrih } 5725df3bbf3SFrancis Visoiu Mistrih if (BitMask) { 5735df3bbf3SFrancis Visoiu Mistrih // When the resulting flag's bitmask isn't zero, we know that we didn't 5745df3bbf3SFrancis Visoiu Mistrih // serialize all of the bit flags. 5755df3bbf3SFrancis Visoiu Mistrih if (IsCommaNeeded) 5765df3bbf3SFrancis Visoiu Mistrih OS << ", "; 5775df3bbf3SFrancis Visoiu Mistrih OS << "<unknown bitmask target flag>"; 5785df3bbf3SFrancis Visoiu Mistrih } 5795df3bbf3SFrancis Visoiu Mistrih OS << ") "; 5805df3bbf3SFrancis Visoiu Mistrih } 5815df3bbf3SFrancis Visoiu Mistrih 5825de20e03SFrancis Visoiu Mistrih void MachineOperand::printSymbol(raw_ostream &OS, MCSymbol &Sym) { 5835de20e03SFrancis Visoiu Mistrih OS << "<mcsymbol " << Sym << ">"; 5845de20e03SFrancis Visoiu Mistrih } 5855de20e03SFrancis Visoiu Mistrih 5860b5bdceaSFrancis Visoiu Mistrih void MachineOperand::printStackObjectReference(raw_ostream &OS, 5870b5bdceaSFrancis Visoiu Mistrih unsigned FrameIndex, 5880b5bdceaSFrancis Visoiu Mistrih bool IsFixed, StringRef Name) { 5890b5bdceaSFrancis Visoiu Mistrih if (IsFixed) { 5900b5bdceaSFrancis Visoiu Mistrih OS << "%fixed-stack." << FrameIndex; 5910b5bdceaSFrancis Visoiu Mistrih return; 5920b5bdceaSFrancis Visoiu Mistrih } 5930b5bdceaSFrancis Visoiu Mistrih 5940b5bdceaSFrancis Visoiu Mistrih OS << "%stack." << FrameIndex; 5950b5bdceaSFrancis Visoiu Mistrih if (!Name.empty()) 5960b5bdceaSFrancis Visoiu Mistrih OS << '.' << Name; 5970b5bdceaSFrancis Visoiu Mistrih } 5980b5bdceaSFrancis Visoiu Mistrih 59981226602SFrancis Visoiu Mistrih void MachineOperand::printOperandOffset(raw_ostream &OS, int64_t Offset) { 60081226602SFrancis Visoiu Mistrih if (Offset == 0) 60181226602SFrancis Visoiu Mistrih return; 60281226602SFrancis Visoiu Mistrih if (Offset < 0) { 60381226602SFrancis Visoiu Mistrih OS << " - " << -Offset; 60481226602SFrancis Visoiu Mistrih return; 60581226602SFrancis Visoiu Mistrih } 60681226602SFrancis Visoiu Mistrih OS << " + " << Offset; 60781226602SFrancis Visoiu Mistrih } 60881226602SFrancis Visoiu Mistrih 609f81727d1SFrancis Visoiu Mistrih void MachineOperand::printIRSlotNumber(raw_ostream &OS, int Slot) { 610f81727d1SFrancis Visoiu Mistrih if (Slot == -1) 611f81727d1SFrancis Visoiu Mistrih OS << "<badref>"; 612f81727d1SFrancis Visoiu Mistrih else 613f81727d1SFrancis Visoiu Mistrih OS << Slot; 614f81727d1SFrancis Visoiu Mistrih } 615f81727d1SFrancis Visoiu Mistrih 616874ae6faSFrancis Visoiu Mistrih static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI, 617874ae6faSFrancis Visoiu Mistrih const TargetRegisterInfo *TRI) { 618874ae6faSFrancis Visoiu Mistrih switch (CFI.getOperation()) { 619874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpSameValue: 620874ae6faSFrancis Visoiu Mistrih OS << "same_value "; 621874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 622874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 623874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 624874ae6faSFrancis Visoiu Mistrih break; 625874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRememberState: 626874ae6faSFrancis Visoiu Mistrih OS << "remember_state "; 627874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 628874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 629874ae6faSFrancis Visoiu Mistrih break; 630874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRestoreState: 631874ae6faSFrancis Visoiu Mistrih OS << "restore_state "; 632874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 633874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 634874ae6faSFrancis Visoiu Mistrih break; 635874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpOffset: 636874ae6faSFrancis Visoiu Mistrih OS << "offset "; 637874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 638874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 639874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 640874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 641874ae6faSFrancis Visoiu Mistrih break; 642874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfaRegister: 643874ae6faSFrancis Visoiu Mistrih OS << "def_cfa_register "; 644874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 645874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 646874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 647874ae6faSFrancis Visoiu Mistrih break; 648874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfaOffset: 649874ae6faSFrancis Visoiu Mistrih OS << "def_cfa_offset "; 650874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 651874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 652874ae6faSFrancis Visoiu Mistrih OS << CFI.getOffset(); 653874ae6faSFrancis Visoiu Mistrih break; 654874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpDefCfa: 655874ae6faSFrancis Visoiu Mistrih OS << "def_cfa "; 656874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 657874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 658874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 659874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 660874ae6faSFrancis Visoiu Mistrih break; 661167e7afcSRamNalamothu case MCCFIInstruction::OpLLVMDefAspaceCfa: 662167e7afcSRamNalamothu OS << "llvm_def_aspace_cfa "; 663167e7afcSRamNalamothu if (MCSymbol *Label = CFI.getLabel()) 664167e7afcSRamNalamothu MachineOperand::printSymbol(OS, *Label); 665167e7afcSRamNalamothu printCFIRegister(CFI.getRegister(), OS, TRI); 666167e7afcSRamNalamothu OS << ", " << CFI.getOffset(); 667167e7afcSRamNalamothu OS << ", " << CFI.getAddressSpace(); 668167e7afcSRamNalamothu break; 669874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRelOffset: 670874ae6faSFrancis Visoiu Mistrih OS << "rel_offset "; 671874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 672874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 673874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 674874ae6faSFrancis Visoiu Mistrih OS << ", " << CFI.getOffset(); 675874ae6faSFrancis Visoiu Mistrih break; 676874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpAdjustCfaOffset: 677874ae6faSFrancis Visoiu Mistrih OS << "adjust_cfa_offset "; 678874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 679874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 680874ae6faSFrancis Visoiu Mistrih OS << CFI.getOffset(); 681874ae6faSFrancis Visoiu Mistrih break; 682874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRestore: 683874ae6faSFrancis Visoiu Mistrih OS << "restore "; 684874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 685874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 686874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 687874ae6faSFrancis Visoiu Mistrih break; 688874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpEscape: { 689874ae6faSFrancis Visoiu Mistrih OS << "escape "; 690874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 691874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 692874ae6faSFrancis Visoiu Mistrih if (!CFI.getValues().empty()) { 693874ae6faSFrancis Visoiu Mistrih size_t e = CFI.getValues().size() - 1; 694874ae6faSFrancis Visoiu Mistrih for (size_t i = 0; i < e; ++i) 695874ae6faSFrancis Visoiu Mistrih OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", "; 6964d81aec4SScott Linder OS << format("0x%02x", uint8_t(CFI.getValues()[e])); 697874ae6faSFrancis Visoiu Mistrih } 698874ae6faSFrancis Visoiu Mistrih break; 699874ae6faSFrancis Visoiu Mistrih } 700874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpUndefined: 701874ae6faSFrancis Visoiu Mistrih OS << "undefined "; 702874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 703874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 704874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 705874ae6faSFrancis Visoiu Mistrih break; 706874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpRegister: 707874ae6faSFrancis Visoiu Mistrih OS << "register "; 708874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 709874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 710874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister(), OS, TRI); 711874ae6faSFrancis Visoiu Mistrih OS << ", "; 712874ae6faSFrancis Visoiu Mistrih printCFIRegister(CFI.getRegister2(), OS, TRI); 713874ae6faSFrancis Visoiu Mistrih break; 714874ae6faSFrancis Visoiu Mistrih case MCCFIInstruction::OpWindowSave: 715874ae6faSFrancis Visoiu Mistrih OS << "window_save "; 716874ae6faSFrancis Visoiu Mistrih if (MCSymbol *Label = CFI.getLabel()) 717874ae6faSFrancis Visoiu Mistrih MachineOperand::printSymbol(OS, *Label); 718874ae6faSFrancis Visoiu Mistrih break; 719f57d7d82SLuke Cheeseman case MCCFIInstruction::OpNegateRAState: 720f57d7d82SLuke Cheeseman OS << "negate_ra_sign_state "; 721f57d7d82SLuke Cheeseman if (MCSymbol *Label = CFI.getLabel()) 722f57d7d82SLuke Cheeseman MachineOperand::printSymbol(OS, *Label); 723f57d7d82SLuke Cheeseman break; 724874ae6faSFrancis Visoiu Mistrih default: 725874ae6faSFrancis Visoiu Mistrih // TODO: Print the other CFI Operations. 726874ae6faSFrancis Visoiu Mistrih OS << "<unserializable cfi directive>"; 727874ae6faSFrancis Visoiu Mistrih break; 728874ae6faSFrancis Visoiu Mistrih } 729874ae6faSFrancis Visoiu Mistrih } 730874ae6faSFrancis Visoiu Mistrih 731aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI, 732aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 733f487edaeSRoman Tereshin print(OS, LLT{}, TRI, IntrinsicInfo); 734f487edaeSRoman Tereshin } 735f487edaeSRoman Tereshin 736f487edaeSRoman Tereshin void MachineOperand::print(raw_ostream &OS, LLT TypeToPrint, 737f487edaeSRoman Tereshin const TargetRegisterInfo *TRI, 738f487edaeSRoman Tereshin const TargetIntrinsicInfo *IntrinsicInfo) const { 739a8a83d15SFrancis Visoiu Mistrih tryToGetTargetInfo(*this, TRI, IntrinsicInfo); 740aa739695SFrancis Visoiu Mistrih ModuleSlotTracker DummyMST(nullptr); 741de3d0ee0SDaniel Sanders print(OS, DummyMST, TypeToPrint, None, /*PrintDef=*/false, 742de3d0ee0SDaniel Sanders /*IsStandalone=*/true, 743a8a83d15SFrancis Visoiu Mistrih /*ShouldPrintRegisterTies=*/true, 744a8a83d15SFrancis Visoiu Mistrih /*TiedOperandIdx=*/0, TRI, IntrinsicInfo); 745aa739695SFrancis Visoiu Mistrih } 746aa739695SFrancis Visoiu Mistrih 747aa739695SFrancis Visoiu Mistrih void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 748de3d0ee0SDaniel Sanders LLT TypeToPrint, Optional<unsigned> OpIdx, bool PrintDef, 749de3d0ee0SDaniel Sanders bool IsStandalone, bool ShouldPrintRegisterTies, 750a8a83d15SFrancis Visoiu Mistrih unsigned TiedOperandIdx, 751aa739695SFrancis Visoiu Mistrih const TargetRegisterInfo *TRI, 752aa739695SFrancis Visoiu Mistrih const TargetIntrinsicInfo *IntrinsicInfo) const { 7535df3bbf3SFrancis Visoiu Mistrih printTargetFlags(OS, *this); 754aa739695SFrancis Visoiu Mistrih switch (getType()) { 755a8a83d15SFrancis Visoiu Mistrih case MachineOperand::MO_Register: { 7560c476111SDaniel Sanders Register Reg = getReg(); 757aa739695SFrancis Visoiu Mistrih if (isImplicit()) 758a8a83d15SFrancis Visoiu Mistrih OS << (isDef() ? "implicit-def " : "implicit "); 759a8a83d15SFrancis Visoiu Mistrih else if (PrintDef && isDef()) 760a8a83d15SFrancis Visoiu Mistrih // Print the 'def' flag only when the operand is defined after '='. 761aa739695SFrancis Visoiu Mistrih OS << "def "; 762a8a83d15SFrancis Visoiu Mistrih if (isInternalRead()) 763aa739695SFrancis Visoiu Mistrih OS << "internal "; 764a8a83d15SFrancis Visoiu Mistrih if (isDead()) 765a8a83d15SFrancis Visoiu Mistrih OS << "dead "; 766a8a83d15SFrancis Visoiu Mistrih if (isKill()) 767a8a83d15SFrancis Visoiu Mistrih OS << "killed "; 768a8a83d15SFrancis Visoiu Mistrih if (isUndef()) 769a8a83d15SFrancis Visoiu Mistrih OS << "undef "; 770a8a83d15SFrancis Visoiu Mistrih if (isEarlyClobber()) 771a8a83d15SFrancis Visoiu Mistrih OS << "early-clobber "; 7722bea69bfSDaniel Sanders if (Register::isPhysicalRegister(getReg()) && isRenamable()) 77360c43102SGeoff Berry OS << "renamable "; 774a8340389SMatthias Braun // isDebug() is exactly true for register operands of a DBG_VALUE. So we 775a8340389SMatthias Braun // simply infer it when parsing and do not need to print it. 776399b46c9SPuyan Lotfi 777399b46c9SPuyan Lotfi const MachineRegisterInfo *MRI = nullptr; 7782bea69bfSDaniel Sanders if (Register::isVirtualRegister(Reg)) { 779399b46c9SPuyan Lotfi if (const MachineFunction *MF = getMFIfAvailable(*this)) { 780399b46c9SPuyan Lotfi MRI = &MF->getRegInfo(); 781399b46c9SPuyan Lotfi } 782399b46c9SPuyan Lotfi } 783399b46c9SPuyan Lotfi 784399b46c9SPuyan Lotfi OS << printReg(Reg, TRI, 0, MRI); 785a8a83d15SFrancis Visoiu Mistrih // Print the sub register. 786a8a83d15SFrancis Visoiu Mistrih if (unsigned SubReg = getSubReg()) { 787a8a83d15SFrancis Visoiu Mistrih if (TRI) 788a8a83d15SFrancis Visoiu Mistrih OS << '.' << TRI->getSubRegIndexName(SubReg); 789a8a83d15SFrancis Visoiu Mistrih else 790a8a83d15SFrancis Visoiu Mistrih OS << ".subreg" << SubReg; 791aa739695SFrancis Visoiu Mistrih } 792a8a83d15SFrancis Visoiu Mistrih // Print the register class / bank. 7932bea69bfSDaniel Sanders if (Register::isVirtualRegister(Reg)) { 794567611efSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) { 795a8a83d15SFrancis Visoiu Mistrih const MachineRegisterInfo &MRI = MF->getRegInfo(); 796eb3f76fcSFrancis Visoiu Mistrih if (IsStandalone || !PrintDef || MRI.def_empty(Reg)) { 797a8a83d15SFrancis Visoiu Mistrih OS << ':'; 798a8a83d15SFrancis Visoiu Mistrih OS << printRegClassOrBank(Reg, MRI, TRI); 799aa739695SFrancis Visoiu Mistrih } 800aa739695SFrancis Visoiu Mistrih } 801a8a83d15SFrancis Visoiu Mistrih } 802a8a83d15SFrancis Visoiu Mistrih // Print ties. 803a8a83d15SFrancis Visoiu Mistrih if (ShouldPrintRegisterTies && isTied() && !isDef()) 804a8a83d15SFrancis Visoiu Mistrih OS << "(tied-def " << TiedOperandIdx << ")"; 805a8a83d15SFrancis Visoiu Mistrih // Print types. 806a8a83d15SFrancis Visoiu Mistrih if (TypeToPrint.isValid()) 807a8a83d15SFrancis Visoiu Mistrih OS << '(' << TypeToPrint << ')'; 808aa739695SFrancis Visoiu Mistrih break; 809a8a83d15SFrancis Visoiu Mistrih } 810de3d0ee0SDaniel Sanders case MachineOperand::MO_Immediate: { 811de3d0ee0SDaniel Sanders const MIRFormatter *Formatter = nullptr; 812cfd84984SPeng Guo if (const MachineFunction *MF = getMFIfAvailable(*this)) { 813cfd84984SPeng Guo const auto *TII = MF->getSubtarget().getInstrInfo(); 814cfd84984SPeng Guo assert(TII && "expected instruction info"); 815cfd84984SPeng Guo Formatter = TII->getMIRFormatter(); 816cfd84984SPeng Guo } 817de3d0ee0SDaniel Sanders if (Formatter) 818de3d0ee0SDaniel Sanders Formatter->printImm(OS, *getParent(), OpIdx, getImm()); 819de3d0ee0SDaniel Sanders else 820aa739695SFrancis Visoiu Mistrih OS << getImm(); 821aa739695SFrancis Visoiu Mistrih break; 822de3d0ee0SDaniel Sanders } 823aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_CImmediate: 8246c4ca713SFrancis Visoiu Mistrih getCImm()->printAsOperand(OS, /*PrintType=*/true, MST); 825aa739695SFrancis Visoiu Mistrih break; 826aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_FPImmediate: 8273b265c8fSFrancis Visoiu Mistrih getFPImm()->printAsOperand(OS, /*PrintType=*/true, MST); 828aa739695SFrancis Visoiu Mistrih break; 829aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MachineBasicBlock: 83025528d6dSFrancis Visoiu Mistrih OS << printMBBReference(*getMBB()); 831aa739695SFrancis Visoiu Mistrih break; 8320b5bdceaSFrancis Visoiu Mistrih case MachineOperand::MO_FrameIndex: { 8330b5bdceaSFrancis Visoiu Mistrih int FrameIndex = getIndex(); 8340b5bdceaSFrancis Visoiu Mistrih bool IsFixed = false; 835e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI = nullptr; 836e85b06d6SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 837e85b06d6SFrancis Visoiu Mistrih MFI = &MF->getFrameInfo(); 838e85b06d6SFrancis Visoiu Mistrih printFrameIndex(OS, FrameIndex, IsFixed, MFI); 839aa739695SFrancis Visoiu Mistrih break; 8400b5bdceaSFrancis Visoiu Mistrih } 841aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_ConstantPoolIndex: 84226ae8a65SFrancis Visoiu Mistrih OS << "%const." << getIndex(); 84381226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 844aa739695SFrancis Visoiu Mistrih break; 845b3a0d513SFrancis Visoiu Mistrih case MachineOperand::MO_TargetIndex: { 846b3a0d513SFrancis Visoiu Mistrih OS << "target-index("; 847b3a0d513SFrancis Visoiu Mistrih const char *Name = "<unknown>"; 848b3a0d513SFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 8497fff1fbdSPuyan Lotfi if (const auto *TargetIndexName = ::getTargetIndexName(*MF, getIndex())) 850b3a0d513SFrancis Visoiu Mistrih Name = TargetIndexName; 851b3a0d513SFrancis Visoiu Mistrih OS << Name << ')'; 85281226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 853aa739695SFrancis Visoiu Mistrih break; 854b3a0d513SFrancis Visoiu Mistrih } 855aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_JumpTableIndex: 856b41dbbe3SFrancis Visoiu Mistrih OS << printJumpTableEntryReference(getIndex()); 857aa739695SFrancis Visoiu Mistrih break; 858aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_GlobalAddress: 859aa739695SFrancis Visoiu Mistrih getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST); 86081226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 861aa739695SFrancis Visoiu Mistrih break; 862e76c5fcdSFrancis Visoiu Mistrih case MachineOperand::MO_ExternalSymbol: { 863e76c5fcdSFrancis Visoiu Mistrih StringRef Name = getSymbolName(); 864fe6c9cbbSPuyan Lotfi OS << '&'; 865e76c5fcdSFrancis Visoiu Mistrih if (Name.empty()) { 866e76c5fcdSFrancis Visoiu Mistrih OS << "\"\""; 867e76c5fcdSFrancis Visoiu Mistrih } else { 868e76c5fcdSFrancis Visoiu Mistrih printLLVMNameWithoutPrefix(OS, Name); 869e76c5fcdSFrancis Visoiu Mistrih } 87081226602SFrancis Visoiu Mistrih printOperandOffset(OS, getOffset()); 871aa739695SFrancis Visoiu Mistrih break; 872e76c5fcdSFrancis Visoiu Mistrih } 873f81727d1SFrancis Visoiu Mistrih case MachineOperand::MO_BlockAddress: { 874f81727d1SFrancis Visoiu Mistrih OS << "blockaddress("; 875f81727d1SFrancis Visoiu Mistrih getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false, 876f81727d1SFrancis Visoiu Mistrih MST); 877f81727d1SFrancis Visoiu Mistrih OS << ", "; 878f81727d1SFrancis Visoiu Mistrih printIRBlockReference(OS, *getBlockAddress()->getBasicBlock(), MST); 879f81727d1SFrancis Visoiu Mistrih OS << ')'; 880f81727d1SFrancis Visoiu Mistrih MachineOperand::printOperandOffset(OS, getOffset()); 881aa739695SFrancis Visoiu Mistrih break; 882f81727d1SFrancis Visoiu Mistrih } 883aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_RegisterMask: { 884a8a83d15SFrancis Visoiu Mistrih OS << "<regmask"; 885a8a83d15SFrancis Visoiu Mistrih if (TRI) { 886aa739695SFrancis Visoiu Mistrih unsigned NumRegsInMask = 0; 887aa739695SFrancis Visoiu Mistrih unsigned NumRegsEmitted = 0; 888aa739695SFrancis Visoiu Mistrih for (unsigned i = 0; i < TRI->getNumRegs(); ++i) { 889aa739695SFrancis Visoiu Mistrih unsigned MaskWord = i / 32; 890aa739695SFrancis Visoiu Mistrih unsigned MaskBit = i % 32; 891aa739695SFrancis Visoiu Mistrih if (getRegMask()[MaskWord] & (1 << MaskBit)) { 892aa739695SFrancis Visoiu Mistrih if (PrintRegMaskNumRegs < 0 || 893aa739695SFrancis Visoiu Mistrih NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) { 894aa739695SFrancis Visoiu Mistrih OS << " " << printReg(i, TRI); 895aa739695SFrancis Visoiu Mistrih NumRegsEmitted++; 896aa739695SFrancis Visoiu Mistrih } 897aa739695SFrancis Visoiu Mistrih NumRegsInMask++; 898aa739695SFrancis Visoiu Mistrih } 899aa739695SFrancis Visoiu Mistrih } 900aa739695SFrancis Visoiu Mistrih if (NumRegsEmitted != NumRegsInMask) 901aa739695SFrancis Visoiu Mistrih OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more..."; 902a8a83d15SFrancis Visoiu Mistrih } else { 903a8a83d15SFrancis Visoiu Mistrih OS << " ..."; 904a8a83d15SFrancis Visoiu Mistrih } 905aa739695SFrancis Visoiu Mistrih OS << ">"; 906aa739695SFrancis Visoiu Mistrih break; 907aa739695SFrancis Visoiu Mistrih } 908bdaf8bfaSFrancis Visoiu Mistrih case MachineOperand::MO_RegisterLiveOut: { 909bdaf8bfaSFrancis Visoiu Mistrih const uint32_t *RegMask = getRegLiveOut(); 910bdaf8bfaSFrancis Visoiu Mistrih OS << "liveout("; 911bdaf8bfaSFrancis Visoiu Mistrih if (!TRI) { 912bdaf8bfaSFrancis Visoiu Mistrih OS << "<unknown>"; 913bdaf8bfaSFrancis Visoiu Mistrih } else { 914bdaf8bfaSFrancis Visoiu Mistrih bool IsCommaNeeded = false; 915bdaf8bfaSFrancis Visoiu Mistrih for (unsigned Reg = 0, E = TRI->getNumRegs(); Reg < E; ++Reg) { 916bdaf8bfaSFrancis Visoiu Mistrih if (RegMask[Reg / 32] & (1U << (Reg % 32))) { 917bdaf8bfaSFrancis Visoiu Mistrih if (IsCommaNeeded) 918bdaf8bfaSFrancis Visoiu Mistrih OS << ", "; 919bdaf8bfaSFrancis Visoiu Mistrih OS << printReg(Reg, TRI); 920bdaf8bfaSFrancis Visoiu Mistrih IsCommaNeeded = true; 921bdaf8bfaSFrancis Visoiu Mistrih } 922bdaf8bfaSFrancis Visoiu Mistrih } 923bdaf8bfaSFrancis Visoiu Mistrih } 924bdaf8bfaSFrancis Visoiu Mistrih OS << ")"; 925aa739695SFrancis Visoiu Mistrih break; 926bdaf8bfaSFrancis Visoiu Mistrih } 927aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Metadata: 928aa739695SFrancis Visoiu Mistrih getMetadata()->printAsOperand(OS, MST); 929aa739695SFrancis Visoiu Mistrih break; 930aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_MCSymbol: 9315de20e03SFrancis Visoiu Mistrih printSymbol(OS, *getMCSymbol()); 932aa739695SFrancis Visoiu Mistrih break; 933874ae6faSFrancis Visoiu Mistrih case MachineOperand::MO_CFIIndex: { 934874ae6faSFrancis Visoiu Mistrih if (const MachineFunction *MF = getMFIfAvailable(*this)) 935874ae6faSFrancis Visoiu Mistrih printCFI(OS, MF->getFrameInstructions()[getCFIIndex()], TRI); 936874ae6faSFrancis Visoiu Mistrih else 937874ae6faSFrancis Visoiu Mistrih OS << "<cfi directive>"; 938aa739695SFrancis Visoiu Mistrih break; 939874ae6faSFrancis Visoiu Mistrih } 940aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_IntrinsicID: { 941aa739695SFrancis Visoiu Mistrih Intrinsic::ID ID = getIntrinsicID(); 942aa739695SFrancis Visoiu Mistrih if (ID < Intrinsic::num_intrinsics) 943bb8ce25eSJeroen Dobbelaere OS << "intrinsic(@" << Intrinsic::getBaseName(ID) << ')'; 944aa739695SFrancis Visoiu Mistrih else if (IntrinsicInfo) 945bbd610aeSFrancis Visoiu Mistrih OS << "intrinsic(@" << IntrinsicInfo->getName(ID) << ')'; 946aa739695SFrancis Visoiu Mistrih else 947bbd610aeSFrancis Visoiu Mistrih OS << "intrinsic(" << ID << ')'; 948aa739695SFrancis Visoiu Mistrih break; 949aa739695SFrancis Visoiu Mistrih } 950aa739695SFrancis Visoiu Mistrih case MachineOperand::MO_Predicate: { 951aa739695SFrancis Visoiu Mistrih auto Pred = static_cast<CmpInst::Predicate>(getPredicate()); 952cb2683d4SFrancis Visoiu Mistrih OS << (CmpInst::isIntPredicate(Pred) ? "int" : "float") << "pred(" 953cb2683d4SFrancis Visoiu Mistrih << CmpInst::getPredicateName(Pred) << ')'; 954aa739695SFrancis Visoiu Mistrih break; 955aa739695SFrancis Visoiu Mistrih } 9565af9cf04SMatt Arsenault case MachineOperand::MO_ShuffleMask: 9575af9cf04SMatt Arsenault OS << "shufflemask("; 958e68e4cbcSEli Friedman ArrayRef<int> Mask = getShuffleMask(); 9595af9cf04SMatt Arsenault StringRef Separator; 960e68e4cbcSEli Friedman for (int Elt : Mask) { 961e68e4cbcSEli Friedman if (Elt == -1) 962e68e4cbcSEli Friedman OS << Separator << "undef"; 963e68e4cbcSEli Friedman else 964e68e4cbcSEli Friedman OS << Separator << Elt; 9655af9cf04SMatt Arsenault Separator = ", "; 9665af9cf04SMatt Arsenault } 9675af9cf04SMatt Arsenault 9685af9cf04SMatt Arsenault OS << ')'; 9695af9cf04SMatt Arsenault break; 970aa739695SFrancis Visoiu Mistrih } 971aa739695SFrancis Visoiu Mistrih } 972aa739695SFrancis Visoiu Mistrih 973aa739695SFrancis Visoiu Mistrih #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 974aa739695SFrancis Visoiu Mistrih LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; } 975aa739695SFrancis Visoiu Mistrih #endif 976aa739695SFrancis Visoiu Mistrih 977aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 978aa739695SFrancis Visoiu Mistrih // MachineMemOperand Implementation 979aa739695SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 980aa739695SFrancis Visoiu Mistrih 981aa739695SFrancis Visoiu Mistrih /// getAddrSpace - Return the LLVM IR address space number that this pointer 982aa739695SFrancis Visoiu Mistrih /// points into. 98349477040SYaxun Liu unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; } 984aa739695SFrancis Visoiu Mistrih 985aa739695SFrancis Visoiu Mistrih /// isDereferenceable - Return true if V is always dereferenceable for 986aa739695SFrancis Visoiu Mistrih /// Offset + Size byte. 987aa739695SFrancis Visoiu Mistrih bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C, 988aa739695SFrancis Visoiu Mistrih const DataLayout &DL) const { 989aa739695SFrancis Visoiu Mistrih if (!V.is<const Value *>()) 990aa739695SFrancis Visoiu Mistrih return false; 991aa739695SFrancis Visoiu Mistrih 992aa739695SFrancis Visoiu Mistrih const Value *BasePtr = V.get<const Value *>(); 993aa739695SFrancis Visoiu Mistrih if (BasePtr == nullptr) 994aa739695SFrancis Visoiu Mistrih return false; 995aa739695SFrancis Visoiu Mistrih 996aa739695SFrancis Visoiu Mistrih return isDereferenceableAndAlignedPointer( 997805c157eSGuillaume Chatelet BasePtr, Align(1), APInt(DL.getPointerSizeInBits(), Offset + Size), DL); 998aa739695SFrancis Visoiu Mistrih } 999aa739695SFrancis Visoiu Mistrih 1000aa739695SFrancis Visoiu Mistrih /// getConstantPool - Return a MachinePointerInfo record that refers to the 1001aa739695SFrancis Visoiu Mistrih /// constant pool. 1002aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) { 1003aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getConstantPool()); 1004aa739695SFrancis Visoiu Mistrih } 1005aa739695SFrancis Visoiu Mistrih 1006aa739695SFrancis Visoiu Mistrih /// getFixedStack - Return a MachinePointerInfo record that refers to the 1007aa739695SFrancis Visoiu Mistrih /// the specified FrameIndex. 1008aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF, 1009aa739695SFrancis Visoiu Mistrih int FI, int64_t Offset) { 1010aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset); 1011aa739695SFrancis Visoiu Mistrih } 1012aa739695SFrancis Visoiu Mistrih 1013aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) { 1014aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getJumpTable()); 1015aa739695SFrancis Visoiu Mistrih } 1016aa739695SFrancis Visoiu Mistrih 1017aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) { 1018aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getGOT()); 1019aa739695SFrancis Visoiu Mistrih } 1020aa739695SFrancis Visoiu Mistrih 1021aa739695SFrancis Visoiu Mistrih MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF, 1022aa739695SFrancis Visoiu Mistrih int64_t Offset, uint8_t ID) { 1023aa739695SFrancis Visoiu Mistrih return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID); 1024aa739695SFrancis Visoiu Mistrih } 1025aa739695SFrancis Visoiu Mistrih 102649477040SYaxun Liu MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) { 102749477040SYaxun Liu return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace()); 102849477040SYaxun Liu } 102949477040SYaxun Liu 1030aa739695SFrancis Visoiu Mistrih MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 1031990278d0SMatt Arsenault LLT type, Align a, const AAMDNodes &AAInfo, 1032aa739695SFrancis Visoiu Mistrih const MDNode *Ranges, SyncScope::ID SSID, 1033aa739695SFrancis Visoiu Mistrih AtomicOrdering Ordering, 1034aa739695SFrancis Visoiu Mistrih AtomicOrdering FailureOrdering) 1035990278d0SMatt Arsenault : PtrInfo(ptrinfo), MemoryType(type), FlagVals(f), BaseAlign(a), 1036990278d0SMatt Arsenault AAInfo(AAInfo), Ranges(Ranges) { 1037aa739695SFrancis Visoiu Mistrih assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() || 1038aa739695SFrancis Visoiu Mistrih isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) && 1039aa739695SFrancis Visoiu Mistrih "invalid pointer value"); 1040aa739695SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && "Not a load/store!"); 1041aa739695SFrancis Visoiu Mistrih 1042aa739695SFrancis Visoiu Mistrih AtomicInfo.SSID = static_cast<unsigned>(SSID); 1043aa739695SFrancis Visoiu Mistrih assert(getSyncScopeID() == SSID && "Value truncated"); 1044aa739695SFrancis Visoiu Mistrih AtomicInfo.Ordering = static_cast<unsigned>(Ordering); 104574909e4bSEli Friedman assert(getSuccessOrdering() == Ordering && "Value truncated"); 1046aa739695SFrancis Visoiu Mistrih AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering); 1047aa739695SFrancis Visoiu Mistrih assert(getFailureOrdering() == FailureOrdering && "Value truncated"); 1048aa739695SFrancis Visoiu Mistrih } 1049aa739695SFrancis Visoiu Mistrih 1050990278d0SMatt Arsenault MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f, 1051990278d0SMatt Arsenault uint64_t s, Align a, 1052990278d0SMatt Arsenault const AAMDNodes &AAInfo, 1053990278d0SMatt Arsenault const MDNode *Ranges, SyncScope::ID SSID, 1054990278d0SMatt Arsenault AtomicOrdering Ordering, 1055990278d0SMatt Arsenault AtomicOrdering FailureOrdering) 1056990278d0SMatt Arsenault : MachineMemOperand(ptrinfo, f, 1057990278d0SMatt Arsenault s == ~UINT64_C(0) ? LLT() : LLT::scalar(8 * s), a, 1058990278d0SMatt Arsenault AAInfo, Ranges, SSID, Ordering, FailureOrdering) {} 1059990278d0SMatt Arsenault 1060aa739695SFrancis Visoiu Mistrih /// Profile - Gather unique data for the object. 1061aa739695SFrancis Visoiu Mistrih /// 1062aa739695SFrancis Visoiu Mistrih void MachineMemOperand::Profile(FoldingSetNodeID &ID) const { 1063aa739695SFrancis Visoiu Mistrih ID.AddInteger(getOffset()); 1064990278d0SMatt Arsenault ID.AddInteger(getMemoryType().getUniqueRAWLLTData()); 1065aa739695SFrancis Visoiu Mistrih ID.AddPointer(getOpaqueValue()); 1066aa739695SFrancis Visoiu Mistrih ID.AddInteger(getFlags()); 106774eac903SGuillaume Chatelet ID.AddInteger(getBaseAlign().value()); 1068aa739695SFrancis Visoiu Mistrih } 1069aa739695SFrancis Visoiu Mistrih 1070aa739695SFrancis Visoiu Mistrih void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) { 1071aa739695SFrancis Visoiu Mistrih // The Value and Offset may differ due to CSE. But the flags and size 1072aa739695SFrancis Visoiu Mistrih // should be the same. 1073aa739695SFrancis Visoiu Mistrih assert(MMO->getFlags() == getFlags() && "Flags mismatch!"); 1074*3a700cabSDavid Green assert((MMO->getSize() == ~UINT64_C(0) || getSize() == ~UINT64_C(0) || 1075*3a700cabSDavid Green MMO->getSize() == getSize()) && 1076*3a700cabSDavid Green "Size mismatch!"); 1077aa739695SFrancis Visoiu Mistrih 107874eac903SGuillaume Chatelet if (MMO->getBaseAlign() >= getBaseAlign()) { 1079aa739695SFrancis Visoiu Mistrih // Update the alignment value. 108074eac903SGuillaume Chatelet BaseAlign = MMO->getBaseAlign(); 1081aa739695SFrancis Visoiu Mistrih // Also update the base and offset, because the new alignment may 1082aa739695SFrancis Visoiu Mistrih // not be applicable with the old ones. 1083aa739695SFrancis Visoiu Mistrih PtrInfo = MMO->PtrInfo; 1084aa739695SFrancis Visoiu Mistrih } 1085aa739695SFrancis Visoiu Mistrih } 1086aa739695SFrancis Visoiu Mistrih 108774eac903SGuillaume Chatelet /// getAlign - Return the minimum known alignment in bytes of the 108874eac903SGuillaume Chatelet /// actual memory reference. 108974eac903SGuillaume Chatelet Align MachineMemOperand::getAlign() const { 109074eac903SGuillaume Chatelet return commonAlignment(getBaseAlign(), getOffset()); 1091aa739695SFrancis Visoiu Mistrih } 1092aa739695SFrancis Visoiu Mistrih 1093e85b06d6SFrancis Visoiu Mistrih void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, 1094e85b06d6SFrancis Visoiu Mistrih SmallVectorImpl<StringRef> &SSNs, 1095e85b06d6SFrancis Visoiu Mistrih const LLVMContext &Context, 1096e85b06d6SFrancis Visoiu Mistrih const MachineFrameInfo *MFI, 1097cfd84984SPeng Guo const TargetInstrInfo *TII) const { 1098e85b06d6SFrancis Visoiu Mistrih OS << '('; 1099aa739695SFrancis Visoiu Mistrih if (isVolatile()) 1100e85b06d6SFrancis Visoiu Mistrih OS << "volatile "; 1101e85b06d6SFrancis Visoiu Mistrih if (isNonTemporal()) 1102e85b06d6SFrancis Visoiu Mistrih OS << "non-temporal "; 1103e85b06d6SFrancis Visoiu Mistrih if (isDereferenceable()) 1104e85b06d6SFrancis Visoiu Mistrih OS << "dereferenceable "; 1105e85b06d6SFrancis Visoiu Mistrih if (isInvariant()) 1106e85b06d6SFrancis Visoiu Mistrih OS << "invariant "; 1107e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag1) 1108e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag1) 1109e85b06d6SFrancis Visoiu Mistrih << "\" "; 1110e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag2) 1111e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag2) 1112e85b06d6SFrancis Visoiu Mistrih << "\" "; 1113e85b06d6SFrancis Visoiu Mistrih if (getFlags() & MachineMemOperand::MOTargetFlag3) 1114e85b06d6SFrancis Visoiu Mistrih OS << '"' << getTargetMMOFlagName(*TII, MachineMemOperand::MOTargetFlag3) 1115e85b06d6SFrancis Visoiu Mistrih << "\" "; 1116aa739695SFrancis Visoiu Mistrih 1117e85b06d6SFrancis Visoiu Mistrih assert((isLoad() || isStore()) && 1118e85b06d6SFrancis Visoiu Mistrih "machine memory operand must be a load or store (or both)"); 1119aa739695SFrancis Visoiu Mistrih if (isLoad()) 1120e85b06d6SFrancis Visoiu Mistrih OS << "load "; 1121aa739695SFrancis Visoiu Mistrih if (isStore()) 1122e85b06d6SFrancis Visoiu Mistrih OS << "store "; 1123e85b06d6SFrancis Visoiu Mistrih 1124e85b06d6SFrancis Visoiu Mistrih printSyncScope(OS, Context, getSyncScopeID(), SSNs); 1125e85b06d6SFrancis Visoiu Mistrih 112674909e4bSEli Friedman if (getSuccessOrdering() != AtomicOrdering::NotAtomic) 112774909e4bSEli Friedman OS << toIRString(getSuccessOrdering()) << ' '; 1128e85b06d6SFrancis Visoiu Mistrih if (getFailureOrdering() != AtomicOrdering::NotAtomic) 1129e85b06d6SFrancis Visoiu Mistrih OS << toIRString(getFailureOrdering()) << ' '; 1130e85b06d6SFrancis Visoiu Mistrih 1131fae05692SMatt Arsenault if (getMemoryType().isValid()) 1132fae05692SMatt Arsenault OS << '(' << getMemoryType() << ')'; 1133cc3f6302SKrzysztof Parzyszek else 1134fae05692SMatt Arsenault OS << "unknown-size"; 1135cc3f6302SKrzysztof Parzyszek 1136e85b06d6SFrancis Visoiu Mistrih if (const Value *Val = getValue()) { 1137e85b06d6SFrancis Visoiu Mistrih OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1138de3d0ee0SDaniel Sanders MIRFormatter::printIRValue(OS, *Val, MST); 1139e85b06d6SFrancis Visoiu Mistrih } else if (const PseudoSourceValue *PVal = getPseudoValue()) { 1140e85b06d6SFrancis Visoiu Mistrih OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); 1141e85b06d6SFrancis Visoiu Mistrih assert(PVal && "Expected a pseudo source value"); 1142e85b06d6SFrancis Visoiu Mistrih switch (PVal->kind()) { 1143e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::Stack: 1144e85b06d6SFrancis Visoiu Mistrih OS << "stack"; 1145e85b06d6SFrancis Visoiu Mistrih break; 1146e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::GOT: 1147e85b06d6SFrancis Visoiu Mistrih OS << "got"; 1148e85b06d6SFrancis Visoiu Mistrih break; 1149e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::JumpTable: 1150e85b06d6SFrancis Visoiu Mistrih OS << "jump-table"; 1151e85b06d6SFrancis Visoiu Mistrih break; 1152e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::ConstantPool: 1153e85b06d6SFrancis Visoiu Mistrih OS << "constant-pool"; 1154e85b06d6SFrancis Visoiu Mistrih break; 1155e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::FixedStack: { 1156e85b06d6SFrancis Visoiu Mistrih int FrameIndex = cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex(); 1157e85b06d6SFrancis Visoiu Mistrih bool IsFixed = true; 1158e85b06d6SFrancis Visoiu Mistrih printFrameIndex(OS, FrameIndex, IsFixed, MFI); 1159e85b06d6SFrancis Visoiu Mistrih break; 1160aa739695SFrancis Visoiu Mistrih } 1161e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::GlobalValueCallEntry: 1162e85b06d6SFrancis Visoiu Mistrih OS << "call-entry "; 1163e85b06d6SFrancis Visoiu Mistrih cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( 1164e85b06d6SFrancis Visoiu Mistrih OS, /*PrintType=*/false, MST); 1165e85b06d6SFrancis Visoiu Mistrih break; 1166e85b06d6SFrancis Visoiu Mistrih case PseudoSourceValue::ExternalSymbolCallEntry: 1167e85b06d6SFrancis Visoiu Mistrih OS << "call-entry &"; 1168e85b06d6SFrancis Visoiu Mistrih printLLVMNameWithoutPrefix( 1169e85b06d6SFrancis Visoiu Mistrih OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); 1170e85b06d6SFrancis Visoiu Mistrih break; 1171de3d0ee0SDaniel Sanders default: { 1172cfd84984SPeng Guo const MIRFormatter *Formatter = TII->getMIRFormatter(); 11734db09604STim Renouf // FIXME: This is not necessarily the correct MIR serialization format for 11744db09604STim Renouf // a custom pseudo source value, but at least it allows 1175589c646aSYuanfang Chen // MIR printing to work on a target with custom pseudo source 11764db09604STim Renouf // values. 1177de3d0ee0SDaniel Sanders OS << "custom \""; 1178cfd84984SPeng Guo Formatter->printCustomPseudoSourceValue(OS, MST, *PVal); 1179de3d0ee0SDaniel Sanders OS << '\"'; 1180e85b06d6SFrancis Visoiu Mistrih break; 1181aa739695SFrancis Visoiu Mistrih } 1182aa739695SFrancis Visoiu Mistrih } 11839fc2be6fSDaniel Sanders } else if (getOpaqueValue() == nullptr && getOffset() != 0) { 11849fc2be6fSDaniel Sanders OS << ((isLoad() && isStore()) ? " on " 11859fc2be6fSDaniel Sanders : isLoad() ? " from " 11869fc2be6fSDaniel Sanders : " into ") 1187134a179dSDaniel Sanders << "unknown-address"; 1188de3d0ee0SDaniel Sanders } 1189e85b06d6SFrancis Visoiu Mistrih MachineOperand::printOperandOffset(OS, getOffset()); 119046667a10SPaulo Matos if (getSize() > 0 && getAlign() != getSize()) 1191b1c304c4SCraig Topper OS << ", align " << getAlign().value(); 1192b1c304c4SCraig Topper if (getAlign() != getBaseAlign()) 1193b1c304c4SCraig Topper OS << ", basealign " << getBaseAlign().value(); 1194e85b06d6SFrancis Visoiu Mistrih auto AAInfo = getAAInfo(); 1195e85b06d6SFrancis Visoiu Mistrih if (AAInfo.TBAA) { 1196e85b06d6SFrancis Visoiu Mistrih OS << ", !tbaa "; 1197e85b06d6SFrancis Visoiu Mistrih AAInfo.TBAA->printAsOperand(OS, MST); 1198aa739695SFrancis Visoiu Mistrih } 1199e85b06d6SFrancis Visoiu Mistrih if (AAInfo.Scope) { 1200e85b06d6SFrancis Visoiu Mistrih OS << ", !alias.scope "; 1201e85b06d6SFrancis Visoiu Mistrih AAInfo.Scope->printAsOperand(OS, MST); 1202aa739695SFrancis Visoiu Mistrih } 1203e85b06d6SFrancis Visoiu Mistrih if (AAInfo.NoAlias) { 1204e85b06d6SFrancis Visoiu Mistrih OS << ", !noalias "; 1205e85b06d6SFrancis Visoiu Mistrih AAInfo.NoAlias->printAsOperand(OS, MST); 1206aa739695SFrancis Visoiu Mistrih } 1207e85b06d6SFrancis Visoiu Mistrih if (getRanges()) { 1208e85b06d6SFrancis Visoiu Mistrih OS << ", !range "; 1209e85b06d6SFrancis Visoiu Mistrih getRanges()->printAsOperand(OS, MST); 1210e85b06d6SFrancis Visoiu Mistrih } 1211e85b06d6SFrancis Visoiu Mistrih // FIXME: Implement addrspace printing/parsing in MIR. 1212e85b06d6SFrancis Visoiu Mistrih // For now, print this even though parsing it is not available in MIR. 1213e85b06d6SFrancis Visoiu Mistrih if (unsigned AS = getAddrSpace()) 1214e85b06d6SFrancis Visoiu Mistrih OS << ", addrspace " << AS; 1215aa739695SFrancis Visoiu Mistrih 1216aa739695SFrancis Visoiu Mistrih OS << ')'; 1217aa739695SFrancis Visoiu Mistrih } 1218