brintos

brintos / llvm-project-archived public Read only

0
0
Text · 96.5 KiB · 1811115 Raw
2788 lines · cpp
1//===- lib/CodeGen/MachineInstr.cpp ---------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Methods common to all machine instructions.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/CodeGen/MachineInstr.h"14#include "llvm/ADT/ArrayRef.h"15#include "llvm/ADT/Hashing.h"16#include "llvm/ADT/STLExtras.h"17#include "llvm/ADT/SmallBitVector.h"18#include "llvm/ADT/SmallVector.h"19#include "llvm/Analysis/AliasAnalysis.h"20#include "llvm/Analysis/MemoryLocation.h"21#include "llvm/CodeGen/LiveRegUnits.h"22#include "llvm/CodeGen/MachineBasicBlock.h"23#include "llvm/CodeGen/MachineFrameInfo.h"24#include "llvm/CodeGen/MachineFunction.h"25#include "llvm/CodeGen/MachineInstrBuilder.h"26#include "llvm/CodeGen/MachineInstrBundle.h"27#include "llvm/CodeGen/MachineMemOperand.h"28#include "llvm/CodeGen/MachineModuleInfo.h"29#include "llvm/CodeGen/MachineOperand.h"30#include "llvm/CodeGen/MachineRegisterInfo.h"31#include "llvm/CodeGen/PseudoSourceValue.h"32#include "llvm/CodeGen/Register.h"33#include "llvm/CodeGen/StackMaps.h"34#include "llvm/CodeGen/TargetInstrInfo.h"35#include "llvm/CodeGen/TargetRegisterInfo.h"36#include "llvm/CodeGen/TargetSubtargetInfo.h"37#include "llvm/CodeGenTypes/LowLevelType.h"38#include "llvm/IR/Constants.h"39#include "llvm/IR/DebugInfoMetadata.h"40#include "llvm/IR/DebugLoc.h"41#include "llvm/IR/Function.h"42#include "llvm/IR/InlineAsm.h"43#include "llvm/IR/Instructions.h"44#include "llvm/IR/LLVMContext.h"45#include "llvm/IR/Metadata.h"46#include "llvm/IR/Module.h"47#include "llvm/IR/ModuleSlotTracker.h"48#include "llvm/IR/Operator.h"49#include "llvm/MC/MCInstrDesc.h"50#include "llvm/MC/MCRegisterInfo.h"51#include "llvm/Support/Casting.h"52#include "llvm/Support/Compiler.h"53#include "llvm/Support/Debug.h"54#include "llvm/Support/ErrorHandling.h"55#include "llvm/Support/FormattedStream.h"56#include "llvm/Support/raw_ostream.h"57#include "llvm/Target/TargetMachine.h"58#include <algorithm>59#include <cassert>60#include <cstdint>61#include <cstring>62#include <utility>63 64using namespace llvm;65 66static cl::opt<bool>67    PrintMIAddrs("print-mi-addrs", cl::Hidden,68                 cl::desc("Print addresses of MachineInstrs when dumping"));69 70static const MachineFunction *getMFIfAvailable(const MachineInstr &MI) {71  if (const MachineBasicBlock *MBB = MI.getParent())72    if (const MachineFunction *MF = MBB->getParent())73      return MF;74  return nullptr;75}76 77// Try to crawl up to the machine function and get TRI/MRI/TII from it.78static void tryToGetTargetInfo(const MachineInstr &MI,79                               const TargetRegisterInfo *&TRI,80                               const MachineRegisterInfo *&MRI,81                               const TargetInstrInfo *&TII) {82 83  if (const MachineFunction *MF = getMFIfAvailable(MI)) {84    TRI = MF->getSubtarget().getRegisterInfo();85    MRI = &MF->getRegInfo();86    TII = MF->getSubtarget().getInstrInfo();87  }88}89 90void MachineInstr::addImplicitDefUseOperands(MachineFunction &MF) {91  for (MCPhysReg ImpDef : MCID->implicit_defs())92    addOperand(MF, MachineOperand::CreateReg(ImpDef, true, true));93  for (MCPhysReg ImpUse : MCID->implicit_uses())94    addOperand(MF, MachineOperand::CreateReg(ImpUse, false, true));95}96 97/// MachineInstr ctor - This constructor creates a MachineInstr and adds the98/// implicit operands. It reserves space for the number of operands specified by99/// the MCInstrDesc.100MachineInstr::MachineInstr(MachineFunction &MF, const MCInstrDesc &TID,101                           DebugLoc DL, bool NoImp)102    : MCID(&TID), NumOperands(0), Flags(0), AsmPrinterFlags(0),103      DbgLoc(std::move(DL)), DebugInstrNum(0), Opcode(TID.Opcode) {104  assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");105 106  // Reserve space for the expected number of operands.107  if (unsigned NumOps = MCID->getNumOperands() + MCID->implicit_defs().size() +108                        MCID->implicit_uses().size()) {109    CapOperands = OperandCapacity::get(NumOps);110    Operands = MF.allocateOperandArray(CapOperands);111  }112 113  if (!NoImp)114    addImplicitDefUseOperands(MF);115}116 117/// MachineInstr ctor - Copies MachineInstr arg exactly.118/// Does not copy the number from debug instruction numbering, to preserve119/// uniqueness.120MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)121    : MCID(&MI.getDesc()), NumOperands(0), Flags(0), AsmPrinterFlags(0),122      Info(MI.Info), DbgLoc(MI.getDebugLoc()), DebugInstrNum(0),123      Opcode(MI.getOpcode()) {124  assert(DbgLoc.hasTrivialDestructor() && "Expected trivial destructor");125 126  CapOperands = OperandCapacity::get(MI.getNumOperands());127  Operands = MF.allocateOperandArray(CapOperands);128 129  // Copy operands.130  for (const MachineOperand &MO : MI.operands())131    addOperand(MF, MO);132 133  // Replicate ties between the operands, which addOperand was not134  // able to do reliably.135  for (unsigned i = 0, e = getNumOperands(); i < e; ++i) {136    MachineOperand &NewMO = getOperand(i);137    const MachineOperand &OrigMO = MI.getOperand(i);138    NewMO.TiedTo = OrigMO.TiedTo;139  }140 141  // Copy all the sensible flags.142  setFlags(MI.Flags);143}144 145void MachineInstr::setDesc(const MCInstrDesc &TID) {146  if (getParent())147    getMF()->handleChangeDesc(*this, TID);148  MCID = &TID;149  Opcode = TID.Opcode;150}151 152void MachineInstr::moveBefore(MachineInstr *MovePos) {153  MovePos->getParent()->splice(MovePos, getParent(), getIterator());154}155 156/// getRegInfo - If this instruction is embedded into a MachineFunction,157/// return the MachineRegisterInfo object for the current function, otherwise158/// return null.159MachineRegisterInfo *MachineInstr::getRegInfo() {160  if (MachineBasicBlock *MBB = getParent())161    return &MBB->getParent()->getRegInfo();162  return nullptr;163}164 165const MachineRegisterInfo *MachineInstr::getRegInfo() const {166  if (const MachineBasicBlock *MBB = getParent())167    return &MBB->getParent()->getRegInfo();168  return nullptr;169}170 171void MachineInstr::removeRegOperandsFromUseLists(MachineRegisterInfo &MRI) {172  for (MachineOperand &MO : operands())173    if (MO.isReg())174      MRI.removeRegOperandFromUseList(&MO);175}176 177void MachineInstr::addRegOperandsToUseLists(MachineRegisterInfo &MRI) {178  for (MachineOperand &MO : operands())179    if (MO.isReg())180      MRI.addRegOperandToUseList(&MO);181}182 183void MachineInstr::addOperand(const MachineOperand &Op) {184  MachineBasicBlock *MBB = getParent();185  assert(MBB && "Use MachineInstrBuilder to add operands to dangling instrs");186  MachineFunction *MF = MBB->getParent();187  assert(MF && "Use MachineInstrBuilder to add operands to dangling instrs");188  addOperand(*MF, Op);189}190 191/// Move NumOps MachineOperands from Src to Dst, with support for overlapping192/// ranges. If MRI is non-null also update use-def chains.193static void moveOperands(MachineOperand *Dst, MachineOperand *Src,194                         unsigned NumOps, MachineRegisterInfo *MRI) {195  if (MRI)196    return MRI->moveOperands(Dst, Src, NumOps);197  // MachineOperand is a trivially copyable type so we can just use memmove.198  assert(Dst && Src && "Unknown operands");199  std::memmove(Dst, Src, NumOps * sizeof(MachineOperand));200}201 202/// addOperand - Add the specified operand to the instruction.  If it is an203/// implicit operand, it is added to the end of the operand list.  If it is204/// an explicit operand it is added at the end of the explicit operand list205/// (before the first implicit operand).206void MachineInstr::addOperand(MachineFunction &MF, const MachineOperand &Op) {207  assert(isUInt<LLVM_MI_NUMOPERANDS_BITS>(NumOperands + 1) &&208         "Cannot add more operands.");209  assert(MCID && "Cannot add operands before providing an instr descriptor");210 211  // Check if we're adding one of our existing operands.212  if (&Op >= Operands && &Op < Operands + NumOperands) {213    // This is unusual: MI->addOperand(MI->getOperand(i)).214    // If adding Op requires reallocating or moving existing operands around,215    // the Op reference could go stale. Support it by copying Op.216    MachineOperand CopyOp(Op);217    return addOperand(MF, CopyOp);218  }219 220  // Find the insert location for the new operand.  Implicit registers go at221  // the end, everything else goes before the implicit regs.222  //223  // FIXME: Allow mixed explicit and implicit operands on inline asm.224  // InstrEmitter::EmitSpecialNode() is marking inline asm clobbers as225  // implicit-defs, but they must not be moved around.  See the FIXME in226  // InstrEmitter.cpp.227  unsigned OpNo = getNumOperands();228  bool isImpReg = Op.isReg() && Op.isImplicit();229  if (!isImpReg && !isInlineAsm()) {230    while (OpNo && Operands[OpNo-1].isReg() && Operands[OpNo-1].isImplicit()) {231      --OpNo;232      assert(!Operands[OpNo].isTied() && "Cannot move tied operands");233    }234  }235 236  // OpNo now points as the desired insertion point.  Unless this is a variadic237  // instruction, only implicit regs are allowed beyond MCID->getNumOperands().238  // RegMask operands go between the explicit and implicit operands.239  MachineRegisterInfo *MRI = getRegInfo();240 241  // Determine if the Operands array needs to be reallocated.242  // Save the old capacity and operand array.243  OperandCapacity OldCap = CapOperands;244  MachineOperand *OldOperands = Operands;245  if (!OldOperands || OldCap.getSize() == getNumOperands()) {246    CapOperands = OldOperands ? OldCap.getNext() : OldCap.get(1);247    Operands = MF.allocateOperandArray(CapOperands);248    // Move the operands before the insertion point.249    if (OpNo)250      moveOperands(Operands, OldOperands, OpNo, MRI);251  }252 253  // Move the operands following the insertion point.254  if (OpNo != NumOperands)255    moveOperands(Operands + OpNo + 1, OldOperands + OpNo, NumOperands - OpNo,256                 MRI);257  ++NumOperands;258 259  // Deallocate the old operand array.260  if (OldOperands != Operands && OldOperands)261    MF.deallocateOperandArray(OldCap, OldOperands);262 263  // Copy Op into place. It still needs to be inserted into the MRI use lists.264  MachineOperand *NewMO = new (Operands + OpNo) MachineOperand(Op);265  NewMO->ParentMI = this;266 267  // When adding a register operand, tell MRI about it.268  if (NewMO->isReg()) {269    // Ensure isOnRegUseList() returns false, regardless of Op's status.270    NewMO->Contents.Reg.Prev = nullptr;271    // Ignore existing ties. This is not a property that can be copied.272    NewMO->TiedTo = 0;273    // Add the new operand to MRI, but only for instructions in an MBB.274    if (MRI)275      MRI->addRegOperandToUseList(NewMO);276    // The MCID operand information isn't accurate until we start adding277    // explicit operands. The implicit operands are added first, then the278    // explicits are inserted before them.279    if (!isImpReg) {280      // Tie uses to defs as indicated in MCInstrDesc.281      if (NewMO->isUse()) {282        int DefIdx = MCID->getOperandConstraint(OpNo, MCOI::TIED_TO);283        if (DefIdx != -1)284          tieOperands(DefIdx, OpNo);285      }286      // If the register operand is flagged as early, mark the operand as such.287      if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1)288        NewMO->setIsEarlyClobber(true);289    }290    // Ensure debug instructions set debug flag on register uses.291    if (NewMO->isUse() && isDebugInstr())292      NewMO->setIsDebug();293  }294}295 296void MachineInstr::removeOperand(unsigned OpNo) {297  assert(OpNo < getNumOperands() && "Invalid operand number");298  untieRegOperand(OpNo);299 300#ifndef NDEBUG301  // Moving tied operands would break the ties.302  for (unsigned i = OpNo + 1, e = getNumOperands(); i != e; ++i)303    if (Operands[i].isReg())304      assert(!Operands[i].isTied() && "Cannot move tied operands");305#endif306 307  MachineRegisterInfo *MRI = getRegInfo();308  if (MRI && Operands[OpNo].isReg())309    MRI->removeRegOperandFromUseList(Operands + OpNo);310 311  // Don't call the MachineOperand destructor. A lot of this code depends on312  // MachineOperand having a trivial destructor anyway, and adding a call here313  // wouldn't make it 'destructor-correct'.314 315  if (unsigned N = NumOperands - 1 - OpNo)316    moveOperands(Operands + OpNo, Operands + OpNo + 1, N, MRI);317  --NumOperands;318}319 320void MachineInstr::setExtraInfo(MachineFunction &MF,321                                ArrayRef<MachineMemOperand *> MMOs,322                                MCSymbol *PreInstrSymbol,323                                MCSymbol *PostInstrSymbol,324                                MDNode *HeapAllocMarker, MDNode *PCSections,325                                uint32_t CFIType, MDNode *MMRAs, Value *DS) {326  bool HasPreInstrSymbol = PreInstrSymbol != nullptr;327  bool HasPostInstrSymbol = PostInstrSymbol != nullptr;328  bool HasHeapAllocMarker = HeapAllocMarker != nullptr;329  bool HasPCSections = PCSections != nullptr;330  bool HasCFIType = CFIType != 0;331  bool HasMMRAs = MMRAs != nullptr;332  bool HasDS = DS != nullptr;333  int NumPointers = MMOs.size() + HasPreInstrSymbol + HasPostInstrSymbol +334                    HasHeapAllocMarker + HasPCSections + HasCFIType + HasMMRAs +335                    HasDS;336 337  // Drop all extra info if there is none.338  if (NumPointers <= 0) {339    Info.clear();340    return;341  }342 343  // If more than one pointer, then store out of line. Store heap alloc markers344  // out of line because PointerSumType cannot hold more than 4 tag types with345  // 32-bit pointers.346  // FIXME: Maybe we should make the symbols in the extra info mutable?347  else if (NumPointers > 1 || HasMMRAs || HasHeapAllocMarker || HasPCSections ||348           HasCFIType || HasDS) {349    Info.set<EIIK_OutOfLine>(350        MF.createMIExtraInfo(MMOs, PreInstrSymbol, PostInstrSymbol,351                             HeapAllocMarker, PCSections, CFIType, MMRAs, DS));352    return;353  }354 355  // Otherwise store the single pointer inline.356  if (HasPreInstrSymbol)357    Info.set<EIIK_PreInstrSymbol>(PreInstrSymbol);358  else if (HasPostInstrSymbol)359    Info.set<EIIK_PostInstrSymbol>(PostInstrSymbol);360  else361    Info.set<EIIK_MMO>(MMOs[0]);362}363 364void MachineInstr::dropMemRefs(MachineFunction &MF) {365  if (memoperands_empty())366    return;367 368  setExtraInfo(MF, {}, getPreInstrSymbol(), getPostInstrSymbol(),369               getHeapAllocMarker(), getPCSections(), getCFIType(),370               getMMRAMetadata(), getDeactivationSymbol());371}372 373void MachineInstr::setMemRefs(MachineFunction &MF,374                              ArrayRef<MachineMemOperand *> MMOs) {375  if (MMOs.empty()) {376    dropMemRefs(MF);377    return;378  }379 380  setExtraInfo(MF, MMOs, getPreInstrSymbol(), getPostInstrSymbol(),381               getHeapAllocMarker(), getPCSections(), getCFIType(),382               getMMRAMetadata(), getDeactivationSymbol());383}384 385void MachineInstr::addMemOperand(MachineFunction &MF,386                                 MachineMemOperand *MO) {387  SmallVector<MachineMemOperand *, 2> MMOs;388  MMOs.append(memoperands_begin(), memoperands_end());389  MMOs.push_back(MO);390  setMemRefs(MF, MMOs);391}392 393void MachineInstr::cloneMemRefs(MachineFunction &MF, const MachineInstr &MI) {394  if (this == &MI)395    // Nothing to do for a self-clone!396    return;397 398  assert(&MF == MI.getMF() &&399         "Invalid machine functions when cloning memory refrences!");400  // See if we can just steal the extra info already allocated for the401  // instruction. We can do this whenever the pre- and post-instruction symbols402  // are the same (including null).403  if (getPreInstrSymbol() == MI.getPreInstrSymbol() &&404      getPostInstrSymbol() == MI.getPostInstrSymbol() &&405      getHeapAllocMarker() == MI.getHeapAllocMarker() &&406      getPCSections() == MI.getPCSections() && getMMRAMetadata() &&407      MI.getMMRAMetadata()) {408    Info = MI.Info;409    return;410  }411 412  // Otherwise, fall back on a copy-based clone.413  setMemRefs(MF, MI.memoperands());414}415 416/// Check to see if the MMOs pointed to by the two MemRefs arrays are417/// identical.418static bool hasIdenticalMMOs(ArrayRef<MachineMemOperand *> LHS,419                             ArrayRef<MachineMemOperand *> RHS) {420  if (LHS.size() != RHS.size())421    return false;422 423  auto LHSPointees = make_pointee_range(LHS);424  auto RHSPointees = make_pointee_range(RHS);425  return std::equal(LHSPointees.begin(), LHSPointees.end(),426                    RHSPointees.begin());427}428 429void MachineInstr::cloneMergedMemRefs(MachineFunction &MF,430                                      ArrayRef<const MachineInstr *> MIs) {431  // Try handling easy numbers of MIs with simpler mechanisms.432  if (MIs.empty()) {433    dropMemRefs(MF);434    return;435  }436  if (MIs.size() == 1) {437    cloneMemRefs(MF, *MIs[0]);438    return;439  }440  // Because an empty memoperands list provides *no* information and must be441  // handled conservatively (assuming the instruction can do anything), the only442  // way to merge with it is to drop all other memoperands.443  if (MIs[0]->memoperands_empty()) {444    dropMemRefs(MF);445    return;446  }447 448  // Handle the general case.449  SmallVector<MachineMemOperand *, 2> MergedMMOs;450  // Start with the first instruction.451  assert(&MF == MIs[0]->getMF() &&452         "Invalid machine functions when cloning memory references!");453  MergedMMOs.append(MIs[0]->memoperands_begin(), MIs[0]->memoperands_end());454  // Now walk all the other instructions and accumulate any different MMOs.455  for (const MachineInstr &MI : make_pointee_range(MIs.slice(1))) {456    assert(&MF == MI.getMF() &&457           "Invalid machine functions when cloning memory references!");458 459    // Skip MIs with identical operands to the first. This is a somewhat460    // arbitrary hack but will catch common cases without being quadratic.461    // TODO: We could fully implement merge semantics here if needed.462    if (hasIdenticalMMOs(MIs[0]->memoperands(), MI.memoperands()))463      continue;464 465    // Because an empty memoperands list provides *no* information and must be466    // handled conservatively (assuming the instruction can do anything), the467    // only way to merge with it is to drop all other memoperands.468    if (MI.memoperands_empty()) {469      dropMemRefs(MF);470      return;471    }472 473    // Otherwise accumulate these into our temporary buffer of the merged state.474    MergedMMOs.append(MI.memoperands_begin(), MI.memoperands_end());475  }476 477  setMemRefs(MF, MergedMMOs);478}479 480void MachineInstr::setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol) {481  // Do nothing if old and new symbols are the same.482  if (Symbol == getPreInstrSymbol())483    return;484 485  // If there was only one symbol and we're removing it, just clear info.486  if (!Symbol && Info.is<EIIK_PreInstrSymbol>()) {487    Info.clear();488    return;489  }490 491  setExtraInfo(MF, memoperands(), Symbol, getPostInstrSymbol(),492               getHeapAllocMarker(), getPCSections(), getCFIType(),493               getMMRAMetadata(), getDeactivationSymbol());494}495 496void MachineInstr::setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol) {497  // Do nothing if old and new symbols are the same.498  if (Symbol == getPostInstrSymbol())499    return;500 501  // If there was only one symbol and we're removing it, just clear info.502  if (!Symbol && Info.is<EIIK_PostInstrSymbol>()) {503    Info.clear();504    return;505  }506 507  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), Symbol,508               getHeapAllocMarker(), getPCSections(), getCFIType(),509               getMMRAMetadata(), getDeactivationSymbol());510}511 512void MachineInstr::setHeapAllocMarker(MachineFunction &MF, MDNode *Marker) {513  // Do nothing if old and new symbols are the same.514  if (Marker == getHeapAllocMarker())515    return;516 517  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),518               Marker, getPCSections(), getCFIType(), getMMRAMetadata(),519               getDeactivationSymbol());520}521 522void MachineInstr::setPCSections(MachineFunction &MF, MDNode *PCSections) {523  // Do nothing if old and new symbols are the same.524  if (PCSections == getPCSections())525    return;526 527  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),528               getHeapAllocMarker(), PCSections, getCFIType(),529               getMMRAMetadata(), getDeactivationSymbol());530}531 532void MachineInstr::setCFIType(MachineFunction &MF, uint32_t Type) {533  // Do nothing if old and new types are the same.534  if (Type == getCFIType())535    return;536 537  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),538               getHeapAllocMarker(), getPCSections(), Type, getMMRAMetadata(),539               getDeactivationSymbol());540}541 542void MachineInstr::setMMRAMetadata(MachineFunction &MF, MDNode *MMRAs) {543  // Do nothing if old and new symbols are the same.544  if (MMRAs == getMMRAMetadata())545    return;546 547  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),548               getHeapAllocMarker(), getPCSections(), getCFIType(), MMRAs,549               getDeactivationSymbol());550}551 552void MachineInstr::setDeactivationSymbol(MachineFunction &MF, Value *DS) {553  // Do nothing if old and new symbols are the same.554  if (DS == getDeactivationSymbol())555    return;556 557  setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),558               getHeapAllocMarker(), getPCSections(), getCFIType(),559               getMMRAMetadata(), DS);560}561 562void MachineInstr::cloneInstrSymbols(MachineFunction &MF,563                                     const MachineInstr &MI) {564  if (this == &MI)565    // Nothing to do for a self-clone!566    return;567 568  assert(&MF == MI.getMF() &&569         "Invalid machine functions when cloning instruction symbols!");570 571  setPreInstrSymbol(MF, MI.getPreInstrSymbol());572  setPostInstrSymbol(MF, MI.getPostInstrSymbol());573  setHeapAllocMarker(MF, MI.getHeapAllocMarker());574  setPCSections(MF, MI.getPCSections());575  setMMRAMetadata(MF, MI.getMMRAMetadata());576}577 578uint32_t MachineInstr::mergeFlagsWith(const MachineInstr &Other) const {579  // For now, the just return the union of the flags. If the flags get more580  // complicated over time, we might need more logic here.581  return getFlags() | Other.getFlags();582}583 584uint32_t MachineInstr::copyFlagsFromInstruction(const Instruction &I) {585  uint32_t MIFlags = 0;586  // Copy the wrapping flags.587  if (const OverflowingBinaryOperator *OB =588          dyn_cast<OverflowingBinaryOperator>(&I)) {589    if (OB->hasNoSignedWrap())590      MIFlags |= MachineInstr::MIFlag::NoSWrap;591    if (OB->hasNoUnsignedWrap())592      MIFlags |= MachineInstr::MIFlag::NoUWrap;593  } else if (const TruncInst *TI = dyn_cast<TruncInst>(&I)) {594    if (TI->hasNoSignedWrap())595      MIFlags |= MachineInstr::MIFlag::NoSWrap;596    if (TI->hasNoUnsignedWrap())597      MIFlags |= MachineInstr::MIFlag::NoUWrap;598  } else if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(&I)) {599    if (GEP->hasNoUnsignedSignedWrap())600      MIFlags |= MachineInstr::MIFlag::NoUSWrap;601    if (GEP->hasNoUnsignedWrap())602      MIFlags |= MachineInstr::MIFlag::NoUWrap;603    if (GEP->isInBounds())604      MIFlags |= MachineInstr::MIFlag::InBounds;605  }606 607  // Copy the nonneg flag.608  if (const PossiblyNonNegInst *PNI = dyn_cast<PossiblyNonNegInst>(&I)) {609    if (PNI->hasNonNeg())610      MIFlags |= MachineInstr::MIFlag::NonNeg;611    // Copy the disjoint flag.612  } else if (const PossiblyDisjointInst *PD =613                 dyn_cast<PossiblyDisjointInst>(&I)) {614    if (PD->isDisjoint())615      MIFlags |= MachineInstr::MIFlag::Disjoint;616  }617 618  // Copy the samesign flag.619  if (const ICmpInst *ICmp = dyn_cast<ICmpInst>(&I))620    if (ICmp->hasSameSign())621      MIFlags |= MachineInstr::MIFlag::SameSign;622 623  // Copy the exact flag.624  if (const PossiblyExactOperator *PE = dyn_cast<PossiblyExactOperator>(&I))625    if (PE->isExact())626      MIFlags |= MachineInstr::MIFlag::IsExact;627 628  // Copy the fast-math flags.629  if (const FPMathOperator *FP = dyn_cast<FPMathOperator>(&I)) {630    const FastMathFlags Flags = FP->getFastMathFlags();631    if (Flags.noNaNs())632      MIFlags |= MachineInstr::MIFlag::FmNoNans;633    if (Flags.noInfs())634      MIFlags |= MachineInstr::MIFlag::FmNoInfs;635    if (Flags.noSignedZeros())636      MIFlags |= MachineInstr::MIFlag::FmNsz;637    if (Flags.allowReciprocal())638      MIFlags |= MachineInstr::MIFlag::FmArcp;639    if (Flags.allowContract())640      MIFlags |= MachineInstr::MIFlag::FmContract;641    if (Flags.approxFunc())642      MIFlags |= MachineInstr::MIFlag::FmAfn;643    if (Flags.allowReassoc())644      MIFlags |= MachineInstr::MIFlag::FmReassoc;645  }646 647  if (I.getMetadata(LLVMContext::MD_unpredictable))648    MIFlags |= MachineInstr::MIFlag::Unpredictable;649 650  return MIFlags;651}652 653void MachineInstr::copyIRFlags(const Instruction &I) {654  Flags = copyFlagsFromInstruction(I);655}656 657bool MachineInstr::hasPropertyInBundle(uint64_t Mask, QueryType Type) const {658  assert(!isBundledWithPred() && "Must be called on bundle header");659  for (MachineBasicBlock::const_instr_iterator MII = getIterator();; ++MII) {660    if (MII->getDesc().getFlags() & Mask) {661      if (Type == AnyInBundle)662        return true;663    } else {664      if (Type == AllInBundle && !MII->isBundle())665        return false;666    }667    // This was the last instruction in the bundle.668    if (!MII->isBundledWithSucc())669      return Type == AllInBundle;670  }671}672 673bool MachineInstr::isIdenticalTo(const MachineInstr &Other,674                                 MICheckType Check) const {675  // If opcodes or number of operands are not the same then the two676  // instructions are obviously not identical.677  if (Other.getOpcode() != getOpcode() ||678      Other.getNumOperands() != getNumOperands())679    return false;680 681  if (isBundle()) {682    // We have passed the test above that both instructions have the same683    // opcode, so we know that both instructions are bundles here. Let's compare684    // MIs inside the bundle.685    assert(Other.isBundle() && "Expected that both instructions are bundles.");686    MachineBasicBlock::const_instr_iterator I1 = getIterator();687    MachineBasicBlock::const_instr_iterator I2 = Other.getIterator();688    // Loop until we analysed the last intruction inside at least one of the689    // bundles.690    while (I1->isBundledWithSucc() && I2->isBundledWithSucc()) {691      ++I1;692      ++I2;693      if (!I1->isIdenticalTo(*I2, Check))694        return false;695    }696    // If we've reached the end of just one of the two bundles, but not both,697    // the instructions are not identical.698    if (I1->isBundledWithSucc() || I2->isBundledWithSucc())699      return false;700  }701 702  // Check operands to make sure they match.703  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {704    const MachineOperand &MO = getOperand(i);705    const MachineOperand &OMO = Other.getOperand(i);706    if (!MO.isReg()) {707      if (!MO.isIdenticalTo(OMO))708        return false;709      continue;710    }711 712    // Clients may or may not want to ignore defs when testing for equality.713    // For example, machine CSE pass only cares about finding common714    // subexpressions, so it's safe to ignore virtual register defs.715    if (MO.isDef()) {716      if (Check == IgnoreDefs)717        continue;718      else if (Check == IgnoreVRegDefs) {719        if (!MO.getReg().isVirtual() || !OMO.getReg().isVirtual())720          if (!MO.isIdenticalTo(OMO))721            return false;722      } else {723        if (!MO.isIdenticalTo(OMO))724          return false;725        if (Check == CheckKillDead && MO.isDead() != OMO.isDead())726          return false;727      }728    } else {729      if (!MO.isIdenticalTo(OMO))730        return false;731      if (Check == CheckKillDead && MO.isKill() != OMO.isKill())732        return false;733    }734  }735  // If DebugLoc does not match then two debug instructions are not identical.736  if (isDebugInstr())737    if (getDebugLoc() && Other.getDebugLoc() &&738        getDebugLoc() != Other.getDebugLoc())739      return false;740  // If pre- or post-instruction symbols do not match then the two instructions741  // are not identical.742  if (getPreInstrSymbol() != Other.getPreInstrSymbol() ||743      getPostInstrSymbol() != Other.getPostInstrSymbol())744    return false;745  // Call instructions with different CFI types are not identical.746  if (isCall() && getCFIType() != Other.getCFIType())747    return false;748  if (getDeactivationSymbol() != Other.getDeactivationSymbol())749    return false;750 751  return true;752}753 754bool MachineInstr::isEquivalentDbgInstr(const MachineInstr &Other) const {755  if (!isDebugValueLike() || !Other.isDebugValueLike())756    return false;757  if (getDebugLoc() != Other.getDebugLoc())758    return false;759  if (getDebugVariable() != Other.getDebugVariable())760    return false;761  if (getNumDebugOperands() != Other.getNumDebugOperands())762    return false;763  for (unsigned OpIdx = 0; OpIdx < getNumDebugOperands(); ++OpIdx)764    if (!getDebugOperand(OpIdx).isIdenticalTo(Other.getDebugOperand(OpIdx)))765      return false;766  if (!DIExpression::isEqualExpression(767          getDebugExpression(), isIndirectDebugValue(),768          Other.getDebugExpression(), Other.isIndirectDebugValue()))769    return false;770  return true;771}772 773const MachineFunction *MachineInstr::getMF() const {774  return getParent()->getParent();775}776 777MachineInstr *MachineInstr::removeFromParent() {778  assert(getParent() && "Not embedded in a basic block!");779  return getParent()->remove(this);780}781 782MachineInstr *MachineInstr::removeFromBundle() {783  assert(getParent() && "Not embedded in a basic block!");784  return getParent()->remove_instr(this);785}786 787void MachineInstr::eraseFromParent() {788  assert(getParent() && "Not embedded in a basic block!");789  getParent()->erase(this);790}791 792void MachineInstr::eraseFromBundle() {793  assert(getParent() && "Not embedded in a basic block!");794  getParent()->erase_instr(this);795}796 797bool MachineInstr::isCandidateForAdditionalCallInfo(QueryType Type) const {798  if (!isCall(Type))799    return false;800  switch (getOpcode()) {801  case TargetOpcode::PATCHPOINT:802  case TargetOpcode::STACKMAP:803  case TargetOpcode::STATEPOINT:804  case TargetOpcode::FENTRY_CALL:805    return false;806  }807  return true;808}809 810bool MachineInstr::shouldUpdateAdditionalCallInfo() const {811  if (isBundle())812    return isCandidateForAdditionalCallInfo(MachineInstr::AnyInBundle);813  return isCandidateForAdditionalCallInfo();814}815 816template <typename Operand, typename Instruction>817static iterator_range<818    filter_iterator<Operand *, std::function<bool(Operand &Op)>>>819getDebugOperandsForRegHelper(Instruction *MI, Register Reg) {820  std::function<bool(Operand & Op)> OpUsesReg(821      [Reg](Operand &Op) { return Op.isReg() && Op.getReg() == Reg; });822  return make_filter_range(MI->debug_operands(), OpUsesReg);823}824 825iterator_range<filter_iterator<const MachineOperand *,826                               std::function<bool(const MachineOperand &Op)>>>827MachineInstr::getDebugOperandsForReg(Register Reg) const {828  return getDebugOperandsForRegHelper<const MachineOperand, const MachineInstr>(829      this, Reg);830}831 832iterator_range<833    filter_iterator<MachineOperand *, std::function<bool(MachineOperand &Op)>>>834MachineInstr::getDebugOperandsForReg(Register Reg) {835  return getDebugOperandsForRegHelper<MachineOperand, MachineInstr>(this, Reg);836}837 838unsigned MachineInstr::getNumExplicitOperands() const {839  unsigned NumOperands = MCID->getNumOperands();840  if (!MCID->isVariadic())841    return NumOperands;842 843  for (const MachineOperand &MO : operands_impl().drop_front(NumOperands)) {844    // The operands must always be in the following order:845    // - explicit reg defs,846    // - other explicit operands (reg uses, immediates, etc.),847    // - implicit reg defs848    // - implicit reg uses849    if (MO.isReg() && MO.isImplicit())850      break;851    ++NumOperands;852  }853  return NumOperands;854}855 856unsigned MachineInstr::getNumExplicitDefs() const {857  unsigned NumDefs = MCID->getNumDefs();858  if (!MCID->isVariadic())859    return NumDefs;860 861  for (const MachineOperand &MO : operands_impl().drop_front(NumDefs)) {862    if (!MO.isReg() || !MO.isDef() || MO.isImplicit())863      break;864    ++NumDefs;865  }866  return NumDefs;867}868 869void MachineInstr::bundleWithPred() {870  assert(!isBundledWithPred() && "MI is already bundled with its predecessor");871  setFlag(BundledPred);872  MachineBasicBlock::instr_iterator Pred = getIterator();873  --Pred;874  assert(!Pred->isBundledWithSucc() && "Inconsistent bundle flags");875  Pred->setFlag(BundledSucc);876}877 878void MachineInstr::bundleWithSucc() {879  assert(!isBundledWithSucc() && "MI is already bundled with its successor");880  setFlag(BundledSucc);881  MachineBasicBlock::instr_iterator Succ = getIterator();882  ++Succ;883  assert(!Succ->isBundledWithPred() && "Inconsistent bundle flags");884  Succ->setFlag(BundledPred);885}886 887void MachineInstr::unbundleFromPred() {888  assert(isBundledWithPred() && "MI isn't bundled with its predecessor");889  clearFlag(BundledPred);890  MachineBasicBlock::instr_iterator Pred = getIterator();891  --Pred;892  assert(Pred->isBundledWithSucc() && "Inconsistent bundle flags");893  Pred->clearFlag(BundledSucc);894}895 896void MachineInstr::unbundleFromSucc() {897  assert(isBundledWithSucc() && "MI isn't bundled with its successor");898  clearFlag(BundledSucc);899  MachineBasicBlock::instr_iterator Succ = getIterator();900  ++Succ;901  assert(Succ->isBundledWithPred() && "Inconsistent bundle flags");902  Succ->clearFlag(BundledPred);903}904 905bool MachineInstr::isStackAligningInlineAsm() const {906  if (isInlineAsm()) {907    unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();908    if (ExtraInfo & InlineAsm::Extra_IsAlignStack)909      return true;910  }911  return false;912}913 914InlineAsm::AsmDialect MachineInstr::getInlineAsmDialect() const {915  assert(isInlineAsm() && "getInlineAsmDialect() only works for inline asms!");916  unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();917  return InlineAsm::AsmDialect((ExtraInfo & InlineAsm::Extra_AsmDialect) != 0);918}919 920int MachineInstr::findInlineAsmFlagIdx(unsigned OpIdx,921                                       unsigned *GroupNo) const {922  assert(isInlineAsm() && "Expected an inline asm instruction");923  assert(OpIdx < getNumOperands() && "OpIdx out of range");924 925  // Ignore queries about the initial operands.926  if (OpIdx < InlineAsm::MIOp_FirstOperand)927    return -1;928 929  unsigned Group = 0;930  unsigned NumOps;931  for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;932       i += NumOps) {933    const MachineOperand &FlagMO = getOperand(i);934    // If we reach the implicit register operands, stop looking.935    if (!FlagMO.isImm())936      return -1;937    const InlineAsm::Flag F(FlagMO.getImm());938    NumOps = 1 + F.getNumOperandRegisters();939    if (i + NumOps > OpIdx) {940      if (GroupNo)941        *GroupNo = Group;942      return i;943    }944    ++Group;945  }946  return -1;947}948 949const DILabel *MachineInstr::getDebugLabel() const {950  assert(isDebugLabel() && "not a DBG_LABEL");951  return cast<DILabel>(getOperand(0).getMetadata());952}953 954const MachineOperand &MachineInstr::getDebugVariableOp() const {955  assert((isDebugValueLike()) && "not a DBG_VALUE*");956  unsigned VariableOp = isNonListDebugValue() ? 2 : 0;957  return getOperand(VariableOp);958}959 960MachineOperand &MachineInstr::getDebugVariableOp() {961  assert((isDebugValueLike()) && "not a DBG_VALUE*");962  unsigned VariableOp = isNonListDebugValue() ? 2 : 0;963  return getOperand(VariableOp);964}965 966const DILocalVariable *MachineInstr::getDebugVariable() const {967  return cast<DILocalVariable>(getDebugVariableOp().getMetadata());968}969 970const MachineOperand &MachineInstr::getDebugExpressionOp() const {971  assert((isDebugValueLike()) && "not a DBG_VALUE*");972  unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;973  return getOperand(ExpressionOp);974}975 976MachineOperand &MachineInstr::getDebugExpressionOp() {977  assert((isDebugValueLike()) && "not a DBG_VALUE*");978  unsigned ExpressionOp = isNonListDebugValue() ? 3 : 1;979  return getOperand(ExpressionOp);980}981 982const DIExpression *MachineInstr::getDebugExpression() const {983  return cast<DIExpression>(getDebugExpressionOp().getMetadata());984}985 986bool MachineInstr::isDebugEntryValue() const {987  return isDebugValue() && getDebugExpression()->isEntryValue();988}989 990const TargetRegisterClass*991MachineInstr::getRegClassConstraint(unsigned OpIdx,992                                    const TargetInstrInfo *TII,993                                    const TargetRegisterInfo *TRI) const {994  assert(getParent() && "Can't have an MBB reference here!");995  assert(getMF() && "Can't have an MF reference here!");996  // Most opcodes have fixed constraints in their MCInstrDesc.997  if (!isInlineAsm())998    return TII->getRegClass(getDesc(), OpIdx);999 1000  if (!getOperand(OpIdx).isReg())1001    return nullptr;1002 1003  // For tied uses on inline asm, get the constraint from the def.1004  unsigned DefIdx;1005  if (getOperand(OpIdx).isUse() && isRegTiedToDefOperand(OpIdx, &DefIdx))1006    OpIdx = DefIdx;1007 1008  // Inline asm stores register class constraints in the flag word.1009  int FlagIdx = findInlineAsmFlagIdx(OpIdx);1010  if (FlagIdx < 0)1011    return nullptr;1012 1013  const InlineAsm::Flag F(getOperand(FlagIdx).getImm());1014  unsigned RCID;1015  if ((F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind()) &&1016      F.hasRegClassConstraint(RCID))1017    return TRI->getRegClass(RCID);1018 1019  // Assume that all registers in a memory operand are pointers.1020  if (F.isMemKind())1021    return TRI->getPointerRegClass();1022 1023  return nullptr;1024}1025 1026const TargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVReg(1027    Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII,1028    const TargetRegisterInfo *TRI, bool ExploreBundle) const {1029  // Check every operands inside the bundle if we have1030  // been asked to.1031  if (ExploreBundle)1032    for (ConstMIBundleOperands OpndIt(*this); OpndIt.isValid() && CurRC;1033         ++OpndIt)1034      CurRC = OpndIt->getParent()->getRegClassConstraintEffectForVRegImpl(1035          OpndIt.getOperandNo(), Reg, CurRC, TII, TRI);1036  else1037    // Otherwise, just check the current operands.1038    for (unsigned i = 0, e = NumOperands; i < e && CurRC; ++i)1039      CurRC = getRegClassConstraintEffectForVRegImpl(i, Reg, CurRC, TII, TRI);1040  return CurRC;1041}1042 1043const TargetRegisterClass *MachineInstr::getRegClassConstraintEffectForVRegImpl(1044    unsigned OpIdx, Register Reg, const TargetRegisterClass *CurRC,1045    const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {1046  assert(CurRC && "Invalid initial register class");1047  // Check if Reg is constrained by some of its use/def from MI.1048  const MachineOperand &MO = getOperand(OpIdx);1049  if (!MO.isReg() || MO.getReg() != Reg)1050    return CurRC;1051  // If yes, accumulate the constraints through the operand.1052  return getRegClassConstraintEffect(OpIdx, CurRC, TII, TRI);1053}1054 1055const TargetRegisterClass *MachineInstr::getRegClassConstraintEffect(1056    unsigned OpIdx, const TargetRegisterClass *CurRC,1057    const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const {1058  const TargetRegisterClass *OpRC = getRegClassConstraint(OpIdx, TII, TRI);1059  const MachineOperand &MO = getOperand(OpIdx);1060  assert(MO.isReg() &&1061         "Cannot get register constraints for non-register operand");1062  assert(CurRC && "Invalid initial register class");1063  if (unsigned SubIdx = MO.getSubReg()) {1064    if (OpRC)1065      CurRC = TRI->getMatchingSuperRegClass(CurRC, OpRC, SubIdx);1066    else1067      CurRC = TRI->getSubClassWithSubReg(CurRC, SubIdx);1068  } else if (OpRC)1069    CurRC = TRI->getCommonSubClass(CurRC, OpRC);1070  return CurRC;1071}1072 1073/// Return the number of instructions inside the MI bundle, not counting the1074/// header instruction.1075unsigned MachineInstr::getBundleSize() const {1076  MachineBasicBlock::const_instr_iterator I = getIterator();1077  unsigned Size = 0;1078  while (I->isBundledWithSucc()) {1079    ++Size;1080    ++I;1081  }1082  return Size;1083}1084 1085/// Returns true if the MachineInstr has an implicit-use operand of exactly1086/// the given register (not considering sub/super-registers).1087bool MachineInstr::hasRegisterImplicitUseOperand(Register Reg) const {1088  for (const MachineOperand &MO : implicit_operands()) {1089    if (MO.isReg() && MO.isUse() && MO.getReg() == Reg)1090      return true;1091  }1092  return false;1093}1094 1095/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of1096/// the specific register or -1 if it is not found. It further tightens1097/// the search criteria to a use that kills the register if isKill is true.1098int MachineInstr::findRegisterUseOperandIdx(Register Reg,1099                                            const TargetRegisterInfo *TRI,1100                                            bool isKill) const {1101  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {1102    const MachineOperand &MO = getOperand(i);1103    if (!MO.isReg() || !MO.isUse())1104      continue;1105    Register MOReg = MO.getReg();1106    if (!MOReg)1107      continue;1108    if (MOReg == Reg || (TRI && Reg && MOReg && TRI->regsOverlap(MOReg, Reg)))1109      if (!isKill || MO.isKill())1110        return i;1111  }1112  return -1;1113}1114 1115/// readsWritesVirtualRegister - Return a pair of bools (reads, writes)1116/// indicating if this instruction reads or writes Reg. This also considers1117/// partial defines.1118std::pair<bool,bool>1119MachineInstr::readsWritesVirtualRegister(Register Reg,1120                                         SmallVectorImpl<unsigned> *Ops) const {1121  bool PartDef = false; // Partial redefine.1122  bool FullDef = false; // Full define.1123  bool Use = false;1124 1125  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {1126    const MachineOperand &MO = getOperand(i);1127    if (!MO.isReg() || MO.getReg() != Reg)1128      continue;1129    if (Ops)1130      Ops->push_back(i);1131    if (MO.isUse())1132      Use |= !MO.isUndef();1133    else if (MO.getSubReg() && !MO.isUndef())1134      // A partial def undef doesn't count as reading the register.1135      PartDef = true;1136    else1137      FullDef = true;1138  }1139  // A partial redefine uses Reg unless there is also a full define.1140  return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef);1141}1142 1143/// findRegisterDefOperandIdx() - Returns the operand index that is a def of1144/// the specified register or -1 if it is not found. If isDead is true, defs1145/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it1146/// also checks if there is a def of a super-register.1147int MachineInstr::findRegisterDefOperandIdx(Register Reg,1148                                            const TargetRegisterInfo *TRI,1149                                            bool isDead, bool Overlap) const {1150  bool isPhys = Reg.isPhysical();1151  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {1152    const MachineOperand &MO = getOperand(i);1153    // Accept regmask operands when Overlap is set.1154    // Ignore them when looking for a specific def operand (Overlap == false).1155    if (isPhys && Overlap && MO.isRegMask() && MO.clobbersPhysReg(Reg))1156      return i;1157    if (!MO.isReg() || !MO.isDef())1158      continue;1159    Register MOReg = MO.getReg();1160    bool Found = (MOReg == Reg);1161    if (!Found && TRI && isPhys && MOReg.isPhysical()) {1162      if (Overlap)1163        Found = TRI->regsOverlap(MOReg, Reg);1164      else1165        Found = TRI->isSubRegister(MOReg, Reg);1166    }1167    if (Found && (!isDead || MO.isDead()))1168      return i;1169  }1170  return -1;1171}1172 1173/// findFirstPredOperandIdx() - Find the index of the first operand in the1174/// operand list that is used to represent the predicate. It returns -1 if1175/// none is found.1176int MachineInstr::findFirstPredOperandIdx() const {1177  // Don't call MCID.findFirstPredOperandIdx() because this variant1178  // is sometimes called on an instruction that's not yet complete, and1179  // so the number of operands is less than the MCID indicates. In1180  // particular, the PTX target does this.1181  const MCInstrDesc &MCID = getDesc();1182  if (MCID.isPredicable()) {1183    for (unsigned i = 0, e = getNumOperands(); i != e; ++i)1184      if (MCID.operands()[i].isPredicate())1185        return i;1186  }1187 1188  return -1;1189}1190 1191// MachineOperand::TiedTo is 4 bits wide.1192const unsigned TiedMax = 15;1193 1194/// tieOperands - Mark operands at DefIdx and UseIdx as tied to each other.1195///1196/// Use and def operands can be tied together, indicated by a non-zero TiedTo1197/// field. TiedTo can have these values:1198///1199/// 0:              Operand is not tied to anything.1200/// 1 to TiedMax-1: Tied to getOperand(TiedTo-1).1201/// TiedMax:        Tied to an operand >= TiedMax-1.1202///1203/// The tied def must be one of the first TiedMax operands on a normal1204/// instruction. INLINEASM instructions allow more tied defs.1205///1206void MachineInstr::tieOperands(unsigned DefIdx, unsigned UseIdx) {1207  MachineOperand &DefMO = getOperand(DefIdx);1208  MachineOperand &UseMO = getOperand(UseIdx);1209  assert(DefMO.isDef() && "DefIdx must be a def operand");1210  assert(UseMO.isUse() && "UseIdx must be a use operand");1211  assert(!DefMO.isTied() && "Def is already tied to another use");1212  assert(!UseMO.isTied() && "Use is already tied to another def");1213 1214  if (DefIdx < TiedMax) {1215    UseMO.TiedTo = DefIdx + 1;1216  } else {1217    // Inline asm can use the group descriptors to find tied operands,1218    // statepoint tied operands are trivial to match (1-1 reg def with reg use),1219    // but on normal instruction, the tied def must be within the first TiedMax1220    // operands.1221    assert((isInlineAsm() || getOpcode() == TargetOpcode::STATEPOINT) &&1222           "DefIdx out of range");1223    UseMO.TiedTo = TiedMax;1224  }1225 1226  // UseIdx can be out of range, we'll search for it in findTiedOperandIdx().1227  DefMO.TiedTo = std::min(UseIdx + 1, TiedMax);1228}1229 1230/// Given the index of a tied register operand, find the operand it is tied to.1231/// Defs are tied to uses and vice versa. Returns the index of the tied operand1232/// which must exist.1233unsigned MachineInstr::findTiedOperandIdx(unsigned OpIdx) const {1234  const MachineOperand &MO = getOperand(OpIdx);1235  assert(MO.isTied() && "Operand isn't tied");1236 1237  // Normally TiedTo is in range.1238  if (MO.TiedTo < TiedMax)1239    return MO.TiedTo - 1;1240 1241  // Uses on normal instructions can be out of range.1242  if (!isInlineAsm() && getOpcode() != TargetOpcode::STATEPOINT) {1243    // Normal tied defs must be in the 0..TiedMax-1 range.1244    if (MO.isUse())1245      return TiedMax - 1;1246    // MO is a def. Search for the tied use.1247    for (unsigned i = TiedMax - 1, e = getNumOperands(); i != e; ++i) {1248      const MachineOperand &UseMO = getOperand(i);1249      if (UseMO.isReg() && UseMO.isUse() && UseMO.TiedTo == OpIdx + 1)1250        return i;1251    }1252    llvm_unreachable("Can't find tied use");1253  }1254 1255  if (getOpcode() == TargetOpcode::STATEPOINT) {1256    // In STATEPOINT defs correspond 1-1 to GC pointer operands passed1257    // on registers.1258    StatepointOpers SO(this);1259    unsigned CurUseIdx = SO.getFirstGCPtrIdx();1260    assert(CurUseIdx != -1U && "only gc pointer statepoint operands can be tied");1261    unsigned NumDefs = getNumDefs();1262    for (unsigned CurDefIdx = 0; CurDefIdx < NumDefs; ++CurDefIdx) {1263      while (!getOperand(CurUseIdx).isReg())1264        CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);1265      if (OpIdx == CurDefIdx)1266        return CurUseIdx;1267      if (OpIdx == CurUseIdx)1268        return CurDefIdx;1269      CurUseIdx = StackMaps::getNextMetaArgIdx(this, CurUseIdx);1270    }1271    llvm_unreachable("Can't find tied use");1272  }1273 1274  // Now deal with inline asm by parsing the operand group descriptor flags.1275  // Find the beginning of each operand group.1276  SmallVector<unsigned, 8> GroupIdx;1277  unsigned OpIdxGroup = ~0u;1278  unsigned NumOps;1279  for (unsigned i = InlineAsm::MIOp_FirstOperand, e = getNumOperands(); i < e;1280       i += NumOps) {1281    const MachineOperand &FlagMO = getOperand(i);1282    assert(FlagMO.isImm() && "Invalid tied operand on inline asm");1283    unsigned CurGroup = GroupIdx.size();1284    GroupIdx.push_back(i);1285    const InlineAsm::Flag F(FlagMO.getImm());1286    NumOps = 1 + F.getNumOperandRegisters();1287    // OpIdx belongs to this operand group.1288    if (OpIdx > i && OpIdx < i + NumOps)1289      OpIdxGroup = CurGroup;1290    unsigned TiedGroup;1291    if (!F.isUseOperandTiedToDef(TiedGroup))1292      continue;1293    // Operands in this group are tied to operands in TiedGroup which must be1294    // earlier. Find the number of operands between the two groups.1295    unsigned Delta = i - GroupIdx[TiedGroup];1296 1297    // OpIdx is a use tied to TiedGroup.1298    if (OpIdxGroup == CurGroup)1299      return OpIdx - Delta;1300 1301    // OpIdx is a def tied to this use group.1302    if (OpIdxGroup == TiedGroup)1303      return OpIdx + Delta;1304  }1305  llvm_unreachable("Invalid tied operand on inline asm");1306}1307 1308/// clearKillInfo - Clears kill flags on all operands.1309///1310void MachineInstr::clearKillInfo() {1311  for (MachineOperand &MO : operands()) {1312    if (MO.isReg() && MO.isUse())1313      MO.setIsKill(false);1314  }1315}1316 1317void MachineInstr::substituteRegister(Register FromReg, Register ToReg,1318                                      unsigned SubIdx,1319                                      const TargetRegisterInfo &RegInfo) {1320  if (ToReg.isPhysical()) {1321    if (SubIdx)1322      ToReg = RegInfo.getSubReg(ToReg, SubIdx);1323    for (MachineOperand &MO : operands()) {1324      if (!MO.isReg() || MO.getReg() != FromReg)1325        continue;1326      MO.substPhysReg(ToReg, RegInfo);1327    }1328  } else {1329    for (MachineOperand &MO : operands()) {1330      if (!MO.isReg() || MO.getReg() != FromReg)1331        continue;1332      MO.substVirtReg(ToReg, SubIdx, RegInfo);1333    }1334  }1335}1336 1337/// isSafeToMove - Return true if it is safe to move this instruction. If1338/// SawStore is set to true, it means that there is a store (or call) between1339/// the instruction's location and its intended destination.1340bool MachineInstr::isSafeToMove(bool &SawStore) const {1341  // Ignore stuff that we obviously can't move.1342  //1343  // Treat volatile loads as stores. This is not strictly necessary for1344  // volatiles, but it is required for atomic loads. It is not allowed to move1345  // a load across an atomic load with Ordering > Monotonic.1346  if (mayStore() || isCall() || isPHI() ||1347      (mayLoad() && hasOrderedMemoryRef())) {1348    SawStore = true;1349    return false;1350  }1351 1352  // Don't touch instructions that have non-trivial invariants.  For example,1353  // terminators have to be at the end of a basic block.1354  if (isPosition() || isDebugInstr() || isTerminator() ||1355      isJumpTableDebugInfo())1356    return false;1357 1358  // Don't touch instructions which can have non-load/store effects.1359  //1360  // Inline asm has a "sideeffect" marker to indicate whether the asm has1361  // intentional side-effects. Even if an inline asm is not "sideeffect",1362  // though, it still can't be speculatively executed: the operation might1363  // not be valid on the current target, or for some combinations of operands.1364  // (Some transforms that move an instruction don't speculatively execute it;1365  // we currently don't try to handle that distinction here.)1366  //1367  // Other instructions handled here include those that can raise FP1368  // exceptions, x86 "DIV" instructions which trap on divide by zero, and1369  // stack adjustments.1370  if (mayRaiseFPException() || hasProperty(MCID::UnmodeledSideEffects) ||1371      isInlineAsm())1372    return false;1373 1374  // See if this instruction does a load.  If so, we have to guarantee that the1375  // loaded value doesn't change between the load and the its intended1376  // destination. The check for isInvariantLoad gives the target the chance to1377  // classify the load as always returning a constant, e.g. a constant pool1378  // load.1379  if (mayLoad() && !isDereferenceableInvariantLoad())1380    // Otherwise, this is a real load.  If there is a store between the load and1381    // end of block, we can't move it.1382    return !SawStore;1383 1384  return true;1385}1386 1387bool MachineInstr::wouldBeTriviallyDead() const {1388  // Don't delete frame allocation labels.1389  // FIXME: Why is LOCAL_ESCAPE not considered in MachineInstr::isLabel?1390  if (getOpcode() == TargetOpcode::LOCAL_ESCAPE)1391    return false;1392 1393  // Don't delete FAKE_USE.1394  // FIXME: Why is FAKE_USE not considered in MachineInstr::isPosition?1395  if (isFakeUse())1396    return false;1397 1398  // LIFETIME markers should be preserved.1399  // FIXME: Why are LIFETIME markers not considered in MachineInstr::isPosition?1400  if (isLifetimeMarker())1401    return false;1402 1403  // If we can move an instruction, we can remove it.  Otherwise, it has1404  // a side-effect of some sort.1405  bool SawStore = false;1406  return isPHI() || isSafeToMove(SawStore);1407}1408 1409bool MachineInstr::isDead(const MachineRegisterInfo &MRI,1410                          LiveRegUnits *LivePhysRegs) const {1411  // Instructions without side-effects are dead iff they only define dead regs.1412  // This function is hot and this loop returns early in the common case,1413  // so only perform additional checks before this if absolutely necessary.1414  for (const MachineOperand &MO : all_defs()) {1415    Register Reg = MO.getReg();1416    if (Reg.isPhysical()) {1417      // Don't delete live physreg defs, or any reserved register defs.1418      if (!LivePhysRegs || !LivePhysRegs->available(Reg) || MRI.isReserved(Reg))1419        return false;1420    } else {1421      if (MO.isDead())1422        continue;1423      for (const MachineInstr &Use : MRI.use_nodbg_instructions(Reg)) {1424        if (&Use != this)1425          // This def has a non-debug use. Don't delete the instruction!1426          return false;1427      }1428    }1429  }1430 1431  // Technically speaking inline asm without side effects and no defs can still1432  // be deleted. But there is so much bad inline asm code out there, we should1433  // let them be.1434  if (isInlineAsm())1435    return false;1436 1437  // FIXME: See issue #105950 for why LIFETIME markers are considered dead here.1438  if (isLifetimeMarker())1439    return true;1440 1441  // If there are no defs with uses, then we call the instruction dead so long1442  // as we do not suspect it may have sideeffects.1443  return wouldBeTriviallyDead();1444}1445 1446static bool MemOperandsHaveAlias(const MachineFrameInfo &MFI,1447                                 BatchAAResults *AA, bool UseTBAA,1448                                 const MachineMemOperand *MMOa,1449                                 const MachineMemOperand *MMOb) {1450  // The following interface to AA is fashioned after DAGCombiner::isAlias and1451  // operates with MachineMemOperand offset with some important assumptions:1452  //   - LLVM fundamentally assumes flat address spaces.1453  //   - MachineOperand offset can *only* result from legalization and cannot1454  //     affect queries other than the trivial case of overlap checking.1455  //   - These offsets never wrap and never step outside of allocated objects.1456  //   - There should never be any negative offsets here.1457  //1458  // FIXME: Modify API to hide this math from "user"1459  // Even before we go to AA we can reason locally about some memory objects. It1460  // can save compile time, and possibly catch some corner cases not currently1461  // covered.1462 1463  int64_t OffsetA = MMOa->getOffset();1464  int64_t OffsetB = MMOb->getOffset();1465  int64_t MinOffset = std::min(OffsetA, OffsetB);1466 1467  LocationSize WidthA = MMOa->getSize();1468  LocationSize WidthB = MMOb->getSize();1469  bool KnownWidthA = WidthA.hasValue();1470  bool KnownWidthB = WidthB.hasValue();1471  bool BothMMONonScalable = !WidthA.isScalable() && !WidthB.isScalable();1472 1473  const Value *ValA = MMOa->getValue();1474  const Value *ValB = MMOb->getValue();1475  bool SameVal = (ValA && ValB && (ValA == ValB));1476  if (!SameVal) {1477    const PseudoSourceValue *PSVa = MMOa->getPseudoValue();1478    const PseudoSourceValue *PSVb = MMOb->getPseudoValue();1479    if (PSVa && ValB && !PSVa->mayAlias(&MFI))1480      return false;1481    if (PSVb && ValA && !PSVb->mayAlias(&MFI))1482      return false;1483    if (PSVa && PSVb && (PSVa == PSVb))1484      SameVal = true;1485  }1486 1487  if (SameVal && BothMMONonScalable) {1488    if (!KnownWidthA || !KnownWidthB)1489      return true;1490    int64_t MaxOffset = std::max(OffsetA, OffsetB);1491    int64_t LowWidth = (MinOffset == OffsetA)1492                           ? WidthA.getValue().getKnownMinValue()1493                           : WidthB.getValue().getKnownMinValue();1494    return (MinOffset + LowWidth > MaxOffset);1495  }1496 1497  if (!AA)1498    return true;1499 1500  if (!ValA || !ValB)1501    return true;1502 1503  assert((OffsetA >= 0) && "Negative MachineMemOperand offset");1504  assert((OffsetB >= 0) && "Negative MachineMemOperand offset");1505 1506  // If Scalable Location Size has non-zero offset, Width + Offset does not work1507  // at the moment1508  if ((WidthA.isScalable() && OffsetA > 0) ||1509      (WidthB.isScalable() && OffsetB > 0))1510    return true;1511 1512  int64_t OverlapA =1513      KnownWidthA ? WidthA.getValue().getKnownMinValue() + OffsetA - MinOffset1514                  : MemoryLocation::UnknownSize;1515  int64_t OverlapB =1516      KnownWidthB ? WidthB.getValue().getKnownMinValue() + OffsetB - MinOffset1517                  : MemoryLocation::UnknownSize;1518 1519  LocationSize LocA = (WidthA.isScalable() || !KnownWidthA)1520                          ? WidthA1521                          : LocationSize::precise(OverlapA);1522  LocationSize LocB = (WidthB.isScalable() || !KnownWidthB)1523                          ? WidthB1524                          : LocationSize::precise(OverlapB);1525 1526  return !AA->isNoAlias(1527      MemoryLocation(ValA, LocA, UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),1528      MemoryLocation(ValB, LocB, UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));1529}1530 1531bool MachineInstr::mayAlias(BatchAAResults *AA, const MachineInstr &Other,1532                            bool UseTBAA) const {1533  const MachineFunction *MF = getMF();1534  const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();1535  const MachineFrameInfo &MFI = MF->getFrameInfo();1536 1537  // Exclude call instruction which may alter the memory but can not be handled1538  // by this function.1539  if (isCall() || Other.isCall())1540    return true;1541 1542  // If neither instruction stores to memory, they can't alias in any1543  // meaningful way, even if they read from the same address.1544  if (!mayStore() && !Other.mayStore())1545    return false;1546 1547  // Both instructions must be memory operations to be able to alias.1548  if (!mayLoadOrStore() || !Other.mayLoadOrStore())1549    return false;1550 1551  // Let the target decide if memory accesses cannot possibly overlap.1552  if (TII->areMemAccessesTriviallyDisjoint(*this, Other))1553    return false;1554 1555  // Memory operations without memory operands may access anything. Be1556  // conservative and assume `MayAlias`.1557  if (memoperands_empty() || Other.memoperands_empty())1558    return true;1559 1560  // Skip if there are too many memory operands.1561  auto NumChecks = getNumMemOperands() * Other.getNumMemOperands();1562  if (NumChecks > TII->getMemOperandAACheckLimit())1563    return true;1564 1565  // Check each pair of memory operands from both instructions, which can't1566  // alias only if all pairs won't alias.1567  for (auto *MMOa : memoperands()) {1568    for (auto *MMOb : Other.memoperands()) {1569      if (!MMOa->isStore() && !MMOb->isStore())1570        continue;1571      if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb))1572        return true;1573    }1574  }1575 1576  return false;1577}1578 1579bool MachineInstr::mayAlias(AAResults *AA, const MachineInstr &Other,1580                            bool UseTBAA) const {1581  if (AA) {1582    BatchAAResults BAA(*AA);1583    return mayAlias(&BAA, Other, UseTBAA);1584  }1585  return mayAlias(static_cast<BatchAAResults *>(nullptr), Other, UseTBAA);1586}1587 1588/// hasOrderedMemoryRef - Return true if this instruction may have an ordered1589/// or volatile memory reference, or if the information describing the memory1590/// reference is not available. Return false if it is known to have no ordered1591/// memory references.1592bool MachineInstr::hasOrderedMemoryRef() const {1593  // An instruction known never to access memory won't have a volatile access.1594  if (!mayStore() &&1595      !mayLoad() &&1596      !isCall() &&1597      !hasUnmodeledSideEffects())1598    return false;1599 1600  // Otherwise, if the instruction has no memory reference information,1601  // conservatively assume it wasn't preserved.1602  if (memoperands_empty())1603    return true;1604 1605  // Check if any of our memory operands are ordered.1606  return llvm::any_of(memoperands(), [](const MachineMemOperand *MMO) {1607    return !MMO->isUnordered();1608  });1609}1610 1611/// isDereferenceableInvariantLoad - Return true if this instruction will never1612/// trap and is loading from a location whose value is invariant across a run of1613/// this function.1614bool MachineInstr::isDereferenceableInvariantLoad() const {1615  // If the instruction doesn't load at all, it isn't an invariant load.1616  if (!mayLoad())1617    return false;1618 1619  // If the instruction has lost its memoperands, conservatively assume that1620  // it may not be an invariant load.1621  if (memoperands_empty())1622    return false;1623 1624  const MachineFrameInfo &MFI = getParent()->getParent()->getFrameInfo();1625 1626  for (MachineMemOperand *MMO : memoperands()) {1627    if (!MMO->isUnordered())1628      // If the memory operand has ordering side effects, we can't move the1629      // instruction.  Such an instruction is technically an invariant load,1630      // but the caller code would need updated to expect that.1631      return false;1632    if (MMO->isStore()) return false;1633    if (MMO->isInvariant() && MMO->isDereferenceable())1634      continue;1635 1636    // A load from a constant PseudoSourceValue is invariant.1637    if (const PseudoSourceValue *PSV = MMO->getPseudoValue()) {1638      if (PSV->isConstant(&MFI))1639        continue;1640    }1641 1642    // Otherwise assume conservatively.1643    return false;1644  }1645 1646  // Everything checks out.1647  return true;1648}1649 1650Register MachineInstr::isConstantValuePHI() const {1651  if (!isPHI())1652    return {};1653  assert(getNumOperands() >= 3 &&1654         "It's illegal to have a PHI without source operands");1655 1656  Register Reg = getOperand(1).getReg();1657  for (unsigned i = 3, e = getNumOperands(); i < e; i += 2)1658    if (getOperand(i).getReg() != Reg)1659      return {};1660  return Reg;1661}1662 1663bool MachineInstr::hasUnmodeledSideEffects() const {1664  if (hasProperty(MCID::UnmodeledSideEffects))1665    return true;1666  if (isInlineAsm()) {1667    unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();1668    if (ExtraInfo & InlineAsm::Extra_HasSideEffects)1669      return true;1670  }1671 1672  return false;1673}1674 1675bool MachineInstr::isLoadFoldBarrier() const {1676  return mayStore() || isCall() ||1677         (hasUnmodeledSideEffects() && !isPseudoProbe());1678}1679 1680/// allDefsAreDead - Return true if all the defs of this instruction are dead.1681///1682bool MachineInstr::allDefsAreDead() const {1683  for (const MachineOperand &MO : operands()) {1684    if (!MO.isReg() || MO.isUse())1685      continue;1686    if (!MO.isDead())1687      return false;1688  }1689  return true;1690}1691 1692bool MachineInstr::allImplicitDefsAreDead() const {1693  for (const MachineOperand &MO : implicit_operands()) {1694    if (!MO.isReg() || MO.isUse())1695      continue;1696    if (!MO.isDead())1697      return false;1698  }1699  return true;1700}1701 1702/// copyImplicitOps - Copy implicit register operands from specified1703/// instruction to this instruction.1704void MachineInstr::copyImplicitOps(MachineFunction &MF,1705                                   const MachineInstr &MI) {1706  for (const MachineOperand &MO :1707       llvm::drop_begin(MI.operands(), MI.getDesc().getNumOperands()))1708    if ((MO.isReg() && MO.isImplicit()) || MO.isRegMask())1709      addOperand(MF, MO);1710}1711 1712bool MachineInstr::hasComplexRegisterTies() const {1713  const MCInstrDesc &MCID = getDesc();1714  if (MCID.Opcode == TargetOpcode::STATEPOINT)1715    return true;1716  for (unsigned I = 0, E = getNumOperands(); I < E; ++I) {1717    const auto &Operand = getOperand(I);1718    if (!Operand.isReg() || Operand.isDef())1719      // Ignore the defined registers as MCID marks only the uses as tied.1720      continue;1721    int ExpectedTiedIdx = MCID.getOperandConstraint(I, MCOI::TIED_TO);1722    int TiedIdx = Operand.isTied() ? int(findTiedOperandIdx(I)) : -1;1723    if (ExpectedTiedIdx != TiedIdx)1724      return true;1725  }1726  return false;1727}1728 1729LLT MachineInstr::getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes,1730                                 const MachineRegisterInfo &MRI) const {1731  const MachineOperand &Op = getOperand(OpIdx);1732  if (!Op.isReg())1733    return LLT{};1734 1735  if (isVariadic() || OpIdx >= getNumExplicitOperands())1736    return MRI.getType(Op.getReg());1737 1738  auto &OpInfo = getDesc().operands()[OpIdx];1739  if (!OpInfo.isGenericType())1740    return MRI.getType(Op.getReg());1741 1742  if (PrintedTypes[OpInfo.getGenericTypeIndex()])1743    return LLT{};1744 1745  LLT TypeToPrint = MRI.getType(Op.getReg());1746  // Don't mark the type index printed if it wasn't actually printed: maybe1747  // another operand with the same type index has an actual type attached:1748  if (TypeToPrint.isValid())1749    PrintedTypes.set(OpInfo.getGenericTypeIndex());1750  return TypeToPrint;1751}1752 1753#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)1754LLVM_DUMP_METHOD void MachineInstr::dump() const {1755  dbgs() << "  ";1756  print(dbgs());1757}1758 1759LLVM_DUMP_METHOD void MachineInstr::dumprImpl(1760    const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,1761    SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const {1762  if (Depth >= MaxDepth)1763    return;1764  if (!AlreadySeenInstrs.insert(this).second)1765    return;1766  // PadToColumn always inserts at least one space.1767  // Don't mess up the alignment if we don't want any space.1768  if (Depth)1769    fdbgs().PadToColumn(Depth * 2);1770  print(fdbgs());1771  for (const MachineOperand &MO : operands()) {1772    if (!MO.isReg() || MO.isDef())1773      continue;1774    Register Reg = MO.getReg();1775    if (Reg.isPhysical())1776      continue;1777    const MachineInstr *NewMI = MRI.getUniqueVRegDef(Reg);1778    if (NewMI == nullptr)1779      continue;1780    NewMI->dumprImpl(MRI, Depth + 1, MaxDepth, AlreadySeenInstrs);1781  }1782}1783 1784LLVM_DUMP_METHOD void MachineInstr::dumpr(const MachineRegisterInfo &MRI,1785                                          unsigned MaxDepth) const {1786  SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;1787  dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);1788}1789#endif1790 1791void MachineInstr::print(raw_ostream &OS, bool IsStandalone, bool SkipOpers,1792                         bool SkipDebugLoc, bool AddNewLine,1793                         const TargetInstrInfo *TII) const {1794  const Module *M = nullptr;1795  const Function *F = nullptr;1796  if (const MachineFunction *MF = getMFIfAvailable(*this)) {1797    F = &MF->getFunction();1798    M = F->getParent();1799    if (!TII)1800      TII = MF->getSubtarget().getInstrInfo();1801  }1802 1803  ModuleSlotTracker MST(M);1804  if (F)1805    MST.incorporateFunction(*F);1806  print(OS, MST, IsStandalone, SkipOpers, SkipDebugLoc, AddNewLine, TII);1807}1808 1809void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,1810                         bool IsStandalone, bool SkipOpers, bool SkipDebugLoc,1811                         bool AddNewLine, const TargetInstrInfo *TII) const {1812  // We can be a bit tidier if we know the MachineFunction.1813  const TargetRegisterInfo *TRI = nullptr;1814  const MachineRegisterInfo *MRI = nullptr;1815  tryToGetTargetInfo(*this, TRI, MRI, TII);1816 1817  if (isCFIInstruction())1818    assert(getNumOperands() == 1 && "Expected 1 operand in CFI instruction");1819 1820  SmallBitVector PrintedTypes(8);1821  bool ShouldPrintRegisterTies = IsStandalone || hasComplexRegisterTies();1822  auto getTiedOperandIdx = [&](unsigned OpIdx) {1823    if (!ShouldPrintRegisterTies)1824      return 0U;1825    const MachineOperand &MO = getOperand(OpIdx);1826    if (MO.isReg() && MO.isTied() && !MO.isDef())1827      return findTiedOperandIdx(OpIdx);1828    return 0U;1829  };1830  unsigned StartOp = 0;1831  unsigned e = getNumOperands();1832 1833  // Print explicitly defined operands on the left of an assignment syntax.1834  while (StartOp < e) {1835    const MachineOperand &MO = getOperand(StartOp);1836    if (!MO.isReg() || !MO.isDef() || MO.isImplicit())1837      break;1838 1839    if (StartOp != 0)1840      OS << ", ";1841 1842    LLT TypeToPrint = MRI ? getTypeToPrint(StartOp, PrintedTypes, *MRI) : LLT{};1843    unsigned TiedOperandIdx = getTiedOperandIdx(StartOp);1844    MO.print(OS, MST, TypeToPrint, StartOp, /*PrintDef=*/false, IsStandalone,1845             ShouldPrintRegisterTies, TiedOperandIdx, TRI);1846    ++StartOp;1847  }1848 1849  if (StartOp != 0)1850    OS << " = ";1851 1852  if (getFlag(MachineInstr::FrameSetup))1853    OS << "frame-setup ";1854  if (getFlag(MachineInstr::FrameDestroy))1855    OS << "frame-destroy ";1856  if (getFlag(MachineInstr::FmNoNans))1857    OS << "nnan ";1858  if (getFlag(MachineInstr::FmNoInfs))1859    OS << "ninf ";1860  if (getFlag(MachineInstr::FmNsz))1861    OS << "nsz ";1862  if (getFlag(MachineInstr::FmArcp))1863    OS << "arcp ";1864  if (getFlag(MachineInstr::FmContract))1865    OS << "contract ";1866  if (getFlag(MachineInstr::FmAfn))1867    OS << "afn ";1868  if (getFlag(MachineInstr::FmReassoc))1869    OS << "reassoc ";1870  if (getFlag(MachineInstr::NoUWrap))1871    OS << "nuw ";1872  if (getFlag(MachineInstr::NoSWrap))1873    OS << "nsw ";1874  if (getFlag(MachineInstr::IsExact))1875    OS << "exact ";1876  if (getFlag(MachineInstr::NoFPExcept))1877    OS << "nofpexcept ";1878  if (getFlag(MachineInstr::NoMerge))1879    OS << "nomerge ";1880  if (getFlag(MachineInstr::NonNeg))1881    OS << "nneg ";1882  if (getFlag(MachineInstr::Disjoint))1883    OS << "disjoint ";1884  if (getFlag(MachineInstr::NoUSWrap))1885    OS << "nusw ";1886  if (getFlag(MachineInstr::SameSign))1887    OS << "samesign ";1888  if (getFlag(MachineInstr::InBounds))1889    OS << "inbounds ";1890 1891  // Print the opcode name.1892  if (TII)1893    OS << TII->getName(getOpcode());1894  else1895    OS << "UNKNOWN";1896 1897  if (SkipOpers)1898    return;1899 1900  // Print the rest of the operands.1901  bool FirstOp = true;1902  unsigned AsmDescOp = ~0u;1903  unsigned AsmOpCount = 0;1904 1905  if (isInlineAsm() && e >= InlineAsm::MIOp_FirstOperand) {1906    // Print asm string.1907    OS << " ";1908    const unsigned OpIdx = InlineAsm::MIOp_AsmString;1909    LLT TypeToPrint = MRI ? getTypeToPrint(OpIdx, PrintedTypes, *MRI) : LLT{};1910    unsigned TiedOperandIdx = getTiedOperandIdx(OpIdx);1911    getOperand(OpIdx).print(OS, MST, TypeToPrint, OpIdx, /*PrintDef=*/true,1912                            IsStandalone, ShouldPrintRegisterTies,1913                            TiedOperandIdx, TRI);1914 1915    // Print HasSideEffects, MayLoad, MayStore, IsAlignStack1916    unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();1917    if (ExtraInfo & InlineAsm::Extra_HasSideEffects)1918      OS << " [sideeffect]";1919    if (ExtraInfo & InlineAsm::Extra_MayLoad)1920      OS << " [mayload]";1921    if (ExtraInfo & InlineAsm::Extra_MayStore)1922      OS << " [maystore]";1923    if (ExtraInfo & InlineAsm::Extra_IsConvergent)1924      OS << " [isconvergent]";1925    if (ExtraInfo & InlineAsm::Extra_IsAlignStack)1926      OS << " [alignstack]";1927    if (getInlineAsmDialect() == InlineAsm::AD_ATT)1928      OS << " [attdialect]";1929    if (getInlineAsmDialect() == InlineAsm::AD_Intel)1930      OS << " [inteldialect]";1931 1932    StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;1933    FirstOp = false;1934  }1935 1936  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {1937    const MachineOperand &MO = getOperand(i);1938 1939    if (FirstOp) FirstOp = false; else OS << ",";1940    OS << " ";1941 1942    if (isDebugValueLike() && MO.isMetadata()) {1943      // Pretty print DBG_VALUE* instructions.1944      auto *DIV = dyn_cast<DILocalVariable>(MO.getMetadata());1945      if (DIV && !DIV->getName().empty())1946        OS << "!\"" << DIV->getName() << '\"';1947      else {1948        LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};1949        unsigned TiedOperandIdx = getTiedOperandIdx(i);1950        MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,1951                 ShouldPrintRegisterTies, TiedOperandIdx, TRI);1952      }1953    } else if (isDebugLabel() && MO.isMetadata()) {1954      // Pretty print DBG_LABEL instructions.1955      auto *DIL = dyn_cast<DILabel>(MO.getMetadata());1956      if (DIL && !DIL->getName().empty())1957        OS << "\"" << DIL->getName() << '\"';1958      else {1959        LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};1960        unsigned TiedOperandIdx = getTiedOperandIdx(i);1961        MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,1962                 ShouldPrintRegisterTies, TiedOperandIdx, TRI);1963      }1964    } else if (i == AsmDescOp && MO.isImm()) {1965      // Pretty print the inline asm operand descriptor.1966      OS << '$' << AsmOpCount++;1967      unsigned Flag = MO.getImm();1968      const InlineAsm::Flag F(Flag);1969      OS << ":[";1970      OS << F.getKindName();1971 1972      unsigned RCID;1973      if (!F.isImmKind() && !F.isMemKind() && F.hasRegClassConstraint(RCID)) {1974        if (TRI) {1975          OS << ':' << TRI->getRegClassName(TRI->getRegClass(RCID));1976        } else1977          OS << ":RC" << RCID;1978      }1979 1980      if (F.isMemKind()) {1981        const InlineAsm::ConstraintCode MCID = F.getMemoryConstraintID();1982        OS << ":" << InlineAsm::getMemConstraintName(MCID);1983      }1984 1985      unsigned TiedTo;1986      if (F.isUseOperandTiedToDef(TiedTo))1987        OS << " tiedto:$" << TiedTo;1988 1989      if ((F.isRegDefKind() || F.isRegDefEarlyClobberKind() ||1990           F.isRegUseKind()) &&1991          F.getRegMayBeFolded()) {1992        OS << " foldable";1993      }1994 1995      OS << ']';1996 1997      // Compute the index of the next operand descriptor.1998      AsmDescOp += 1 + F.getNumOperandRegisters();1999    } else {2000      LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};2001      unsigned TiedOperandIdx = getTiedOperandIdx(i);2002      if (MO.isImm() && isOperandSubregIdx(i))2003        MachineOperand::printSubRegIdx(OS, MO.getImm(), TRI);2004      else2005        MO.print(OS, MST, TypeToPrint, i, /*PrintDef=*/true, IsStandalone,2006                 ShouldPrintRegisterTies, TiedOperandIdx, TRI);2007    }2008  }2009 2010  // Print any optional symbols attached to this instruction as-if they were2011  // operands.2012  if (MCSymbol *PreInstrSymbol = getPreInstrSymbol()) {2013    if (!FirstOp) {2014      FirstOp = false;2015      OS << ',';2016    }2017    OS << " pre-instr-symbol ";2018    MachineOperand::printSymbol(OS, *PreInstrSymbol);2019  }2020  if (MCSymbol *PostInstrSymbol = getPostInstrSymbol()) {2021    if (!FirstOp) {2022      FirstOp = false;2023      OS << ',';2024    }2025    OS << " post-instr-symbol ";2026    MachineOperand::printSymbol(OS, *PostInstrSymbol);2027  }2028  if (MDNode *HeapAllocMarker = getHeapAllocMarker()) {2029    if (!FirstOp) {2030      FirstOp = false;2031      OS << ',';2032    }2033    OS << " heap-alloc-marker ";2034    HeapAllocMarker->printAsOperand(OS, MST);2035  }2036  if (MDNode *PCSections = getPCSections()) {2037    if (!FirstOp) {2038      FirstOp = false;2039      OS << ',';2040    }2041    OS << " pcsections ";2042    PCSections->printAsOperand(OS, MST);2043  }2044  if (MDNode *MMRA = getMMRAMetadata()) {2045    if (!FirstOp) {2046      FirstOp = false;2047      OS << ',';2048    }2049    OS << " mmra ";2050    MMRA->printAsOperand(OS, MST);2051  }2052  if (uint32_t CFIType = getCFIType()) {2053    if (!FirstOp)2054      OS << ',';2055    OS << " cfi-type " << CFIType;2056  }2057  if (getDeactivationSymbol())2058    OS << ", deactivation-symbol " << getDeactivationSymbol()->getName();2059 2060  if (DebugInstrNum) {2061    if (!FirstOp)2062      OS << ",";2063    OS << " debug-instr-number " << DebugInstrNum;2064  }2065 2066  if (!SkipDebugLoc) {2067    if (const DebugLoc &DL = getDebugLoc()) {2068      if (!FirstOp)2069        OS << ',';2070      OS << " debug-location ";2071      DL->printAsOperand(OS, MST);2072    }2073  }2074 2075  if (!memoperands_empty()) {2076    SmallVector<StringRef, 0> SSNs;2077    const LLVMContext *Context = nullptr;2078    std::unique_ptr<LLVMContext> CtxPtr;2079    const MachineFrameInfo *MFI = nullptr;2080    if (const MachineFunction *MF = getMFIfAvailable(*this)) {2081      MFI = &MF->getFrameInfo();2082      Context = &MF->getFunction().getContext();2083    } else {2084      CtxPtr = std::make_unique<LLVMContext>();2085      Context = CtxPtr.get();2086    }2087 2088    OS << " :: ";2089    bool NeedComma = false;2090    for (const MachineMemOperand *Op : memoperands()) {2091      if (NeedComma)2092        OS << ", ";2093      Op->print(OS, MST, SSNs, *Context, MFI, TII);2094      NeedComma = true;2095    }2096  }2097 2098  if (SkipDebugLoc)2099    return;2100 2101  bool HaveSemi = false;2102 2103  // Print debug location information.2104  if (const DebugLoc &DL = getDebugLoc()) {2105    if (!HaveSemi) {2106      OS << ';';2107      HaveSemi = true;2108    }2109    OS << ' ';2110    DL.print(OS);2111  }2112 2113  // Print extra comments for DEBUG_VALUE and friends if they are well-formed.2114  if ((isNonListDebugValue() && getNumOperands() >= 4) ||2115      (isDebugValueList() && getNumOperands() >= 2) ||2116      (isDebugRef() && getNumOperands() >= 3)) {2117    if (getDebugVariableOp().isMetadata()) {2118      if (!HaveSemi) {2119        OS << ";";2120        HaveSemi = true;2121      }2122      auto *DV = getDebugVariable();2123      OS << " line no:" << DV->getLine();2124      if (isIndirectDebugValue())2125        OS << " indirect";2126    }2127  }2128  // TODO: DBG_LABEL2129 2130  if (PrintMIAddrs)2131    OS << " ; " << this;2132 2133  if (AddNewLine)2134    OS << '\n';2135}2136 2137bool MachineInstr::addRegisterKilled(Register IncomingReg,2138                                     const TargetRegisterInfo *RegInfo,2139                                     bool AddIfNotFound) {2140  bool isPhysReg = IncomingReg.isPhysical();2141  bool hasAliases = isPhysReg &&2142    MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();2143  bool Found = false;2144  SmallVector<unsigned,4> DeadOps;2145  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {2146    MachineOperand &MO = getOperand(i);2147    if (!MO.isReg() || !MO.isUse() || MO.isUndef())2148      continue;2149 2150    // DEBUG_VALUE nodes do not contribute to code generation and should2151    // always be ignored. Failure to do so may result in trying to modify2152    // KILL flags on DEBUG_VALUE nodes.2153    if (MO.isDebug())2154      continue;2155 2156    Register Reg = MO.getReg();2157    if (!Reg)2158      continue;2159 2160    if (Reg == IncomingReg) {2161      if (!Found) {2162        if (MO.isKill())2163          // The register is already marked kill.2164          return true;2165        if (isPhysReg && isRegTiedToDefOperand(i))2166          // Two-address uses of physregs must not be marked kill.2167          return true;2168        MO.setIsKill();2169        Found = true;2170      }2171    } else if (hasAliases && MO.isKill() && Reg.isPhysical()) {2172      // A super-register kill already exists.2173      if (RegInfo->isSuperRegister(IncomingReg, Reg))2174        return true;2175      if (RegInfo->isSubRegister(IncomingReg, Reg))2176        DeadOps.push_back(i);2177    }2178  }2179 2180  // Trim unneeded kill operands.2181  while (!DeadOps.empty()) {2182    unsigned OpIdx = DeadOps.back();2183    if (getOperand(OpIdx).isImplicit() &&2184        (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))2185      removeOperand(OpIdx);2186    else2187      getOperand(OpIdx).setIsKill(false);2188    DeadOps.pop_back();2189  }2190 2191  // If not found, this means an alias of one of the operands is killed. Add a2192  // new implicit operand if required.2193  if (!Found && AddIfNotFound) {2194    addOperand(MachineOperand::CreateReg(IncomingReg,2195                                         false /*IsDef*/,2196                                         true  /*IsImp*/,2197                                         true  /*IsKill*/));2198    return true;2199  }2200  return Found;2201}2202 2203void MachineInstr::clearRegisterKills(Register Reg,2204                                      const TargetRegisterInfo *RegInfo) {2205  if (!Reg.isPhysical())2206    RegInfo = nullptr;2207  for (MachineOperand &MO : operands()) {2208    if (!MO.isReg() || !MO.isUse() || !MO.isKill())2209      continue;2210    Register OpReg = MO.getReg();2211    if ((RegInfo && RegInfo->regsOverlap(Reg, OpReg)) || Reg == OpReg)2212      MO.setIsKill(false);2213  }2214}2215 2216bool MachineInstr::addRegisterDead(Register Reg,2217                                   const TargetRegisterInfo *RegInfo,2218                                   bool AddIfNotFound) {2219  bool isPhysReg = Reg.isPhysical();2220  bool hasAliases = isPhysReg &&2221    MCRegAliasIterator(Reg, RegInfo, false).isValid();2222  bool Found = false;2223  SmallVector<unsigned,4> DeadOps;2224  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {2225    MachineOperand &MO = getOperand(i);2226    if (!MO.isReg() || !MO.isDef())2227      continue;2228    Register MOReg = MO.getReg();2229    if (!MOReg)2230      continue;2231 2232    if (MOReg == Reg) {2233      MO.setIsDead();2234      Found = true;2235    } else if (hasAliases && MO.isDead() && MOReg.isPhysical()) {2236      // There exists a super-register that's marked dead.2237      if (RegInfo->isSuperRegister(Reg, MOReg))2238        return true;2239      if (RegInfo->isSubRegister(Reg, MOReg))2240        DeadOps.push_back(i);2241    }2242  }2243 2244  // Trim unneeded dead operands.2245  while (!DeadOps.empty()) {2246    unsigned OpIdx = DeadOps.back();2247    if (getOperand(OpIdx).isImplicit() &&2248        (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0))2249      removeOperand(OpIdx);2250    else2251      getOperand(OpIdx).setIsDead(false);2252    DeadOps.pop_back();2253  }2254 2255  // If not found, this means an alias of one of the operands is dead. Add a2256  // new implicit operand if required.2257  if (Found || !AddIfNotFound)2258    return Found;2259 2260  addOperand(MachineOperand::CreateReg(Reg,2261                                       true  /*IsDef*/,2262                                       true  /*IsImp*/,2263                                       false /*IsKill*/,2264                                       true  /*IsDead*/));2265  return true;2266}2267 2268void MachineInstr::clearRegisterDeads(Register Reg) {2269  for (MachineOperand &MO : all_defs())2270    if (MO.getReg() == Reg)2271      MO.setIsDead(false);2272}2273 2274void MachineInstr::setRegisterDefReadUndef(Register Reg, bool IsUndef) {2275  for (MachineOperand &MO : all_defs())2276    if (MO.getReg() == Reg && MO.getSubReg() != 0)2277      MO.setIsUndef(IsUndef);2278}2279 2280void MachineInstr::addRegisterDefined(Register Reg,2281                                      const TargetRegisterInfo *RegInfo) {2282  if (Reg.isPhysical()) {2283    MachineOperand *MO = findRegisterDefOperand(Reg, RegInfo, false, false);2284    if (MO)2285      return;2286  } else {2287    for (const MachineOperand &MO : all_defs()) {2288      if (MO.getReg() == Reg && MO.getSubReg() == 0)2289        return;2290    }2291  }2292  addOperand(MachineOperand::CreateReg(Reg,2293                                       true  /*IsDef*/,2294                                       true  /*IsImp*/));2295}2296 2297void MachineInstr::setPhysRegsDeadExcept(ArrayRef<Register> UsedRegs,2298                                         const TargetRegisterInfo &TRI) {2299  bool HasRegMask = false;2300  for (MachineOperand &MO : operands()) {2301    if (MO.isRegMask()) {2302      HasRegMask = true;2303      continue;2304    }2305    if (!MO.isReg() || !MO.isDef()) continue;2306    Register Reg = MO.getReg();2307    if (!Reg.isPhysical())2308      continue;2309    // If there are no uses, including partial uses, the def is dead.2310    if (llvm::none_of(UsedRegs,2311                      [&](MCRegister Use) { return TRI.regsOverlap(Use, Reg); }))2312      MO.setIsDead();2313  }2314 2315  // This is a call with a register mask operand.2316  // Mask clobbers are always dead, so add defs for the non-dead defines.2317  if (HasRegMask)2318    for (const Register &UsedReg : UsedRegs)2319      addRegisterDefined(UsedReg, &TRI);2320}2321 2322unsigned2323MachineInstrExpressionTrait::getHashValue(const MachineInstr* const &MI) {2324  // Build up a buffer of hash code components.2325  SmallVector<size_t, 16> HashComponents;2326  HashComponents.reserve(MI->getNumOperands() + 1);2327  HashComponents.push_back(MI->getOpcode());2328  for (const MachineOperand &MO : MI->operands()) {2329    if (MO.isReg() && MO.isDef() && MO.getReg().isVirtual())2330      continue;  // Skip virtual register defs.2331 2332    HashComponents.push_back(hash_value(MO));2333  }2334  return hash_combine_range(HashComponents);2335}2336 2337const MDNode *MachineInstr::getLocCookieMD() const {2338  // Find the source location cookie.2339  const MDNode *LocMD = nullptr;2340  for (unsigned i = getNumOperands(); i != 0; --i) {2341    if (getOperand(i-1).isMetadata() &&2342        (LocMD = getOperand(i-1).getMetadata()) &&2343        LocMD->getNumOperands() != 0) {2344      if (mdconst::hasa<ConstantInt>(LocMD->getOperand(0)))2345        return LocMD;2346    }2347  }2348 2349  return nullptr;2350}2351 2352void MachineInstr::emitInlineAsmError(const Twine &Msg) const {2353  assert(isInlineAsm());2354  const MDNode *LocMD = getLocCookieMD();2355  uint64_t LocCookie =2356      LocMD2357          ? mdconst::extract<ConstantInt>(LocMD->getOperand(0))->getZExtValue()2358          : 0;2359  LLVMContext &Ctx = getMF()->getFunction().getContext();2360  Ctx.diagnose(DiagnosticInfoInlineAsm(LocCookie, Msg));2361}2362 2363void MachineInstr::emitGenericError(const Twine &Msg) const {2364  const Function &Fn = getMF()->getFunction();2365  Fn.getContext().diagnose(2366      DiagnosticInfoGenericWithLoc(Msg, Fn, getDebugLoc()));2367}2368 2369MachineInstrBuilder llvm::BuildMI(MachineFunction &MF, const DebugLoc &DL,2370                                  const MCInstrDesc &MCID, bool IsIndirect,2371                                  Register Reg, const MDNode *Variable,2372                                  const MDNode *Expr) {2373  assert(isa<DILocalVariable>(Variable) && "not a variable");2374  assert(cast<DIExpression>(Expr)->isValid() && "not an expression");2375  assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&2376         "Expected inlined-at fields to agree");2377  auto MIB = BuildMI(MF, DL, MCID).addReg(Reg);2378  if (IsIndirect)2379    MIB.addImm(0U);2380  else2381    MIB.addReg(0U);2382  return MIB.addMetadata(Variable).addMetadata(Expr);2383}2384 2385MachineInstrBuilder llvm::BuildMI(MachineFunction &MF, const DebugLoc &DL,2386                                  const MCInstrDesc &MCID, bool IsIndirect,2387                                  ArrayRef<MachineOperand> DebugOps,2388                                  const MDNode *Variable, const MDNode *Expr) {2389  assert(isa<DILocalVariable>(Variable) && "not a variable");2390  assert(cast<DIExpression>(Expr)->isValid() && "not an expression");2391  assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&2392         "Expected inlined-at fields to agree");2393  if (MCID.Opcode == TargetOpcode::DBG_VALUE) {2394    assert(DebugOps.size() == 1 &&2395           "DBG_VALUE must contain exactly one debug operand");2396    MachineOperand DebugOp = DebugOps[0];2397    if (DebugOp.isReg())2398      return BuildMI(MF, DL, MCID, IsIndirect, DebugOp.getReg(), Variable,2399                     Expr);2400 2401    auto MIB = BuildMI(MF, DL, MCID).add(DebugOp);2402    if (IsIndirect)2403      MIB.addImm(0U);2404    else2405      MIB.addReg(0U);2406    return MIB.addMetadata(Variable).addMetadata(Expr);2407  }2408 2409  auto MIB = BuildMI(MF, DL, MCID);2410  MIB.addMetadata(Variable).addMetadata(Expr);2411  for (const MachineOperand &DebugOp : DebugOps)2412    if (DebugOp.isReg())2413      MIB.addReg(DebugOp.getReg());2414    else2415      MIB.add(DebugOp);2416  return MIB;2417}2418 2419MachineInstrBuilder llvm::BuildMI(MachineBasicBlock &BB,2420                                  MachineBasicBlock::iterator I,2421                                  const DebugLoc &DL, const MCInstrDesc &MCID,2422                                  bool IsIndirect, Register Reg,2423                                  const MDNode *Variable, const MDNode *Expr) {2424  MachineFunction &MF = *BB.getParent();2425  MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Variable, Expr);2426  BB.insert(I, MI);2427  return MachineInstrBuilder(MF, MI);2428}2429 2430MachineInstrBuilder llvm::BuildMI(MachineBasicBlock &BB,2431                                  MachineBasicBlock::iterator I,2432                                  const DebugLoc &DL, const MCInstrDesc &MCID,2433                                  bool IsIndirect,2434                                  ArrayRef<MachineOperand> DebugOps,2435                                  const MDNode *Variable, const MDNode *Expr) {2436  MachineFunction &MF = *BB.getParent();2437  MachineInstr *MI =2438      BuildMI(MF, DL, MCID, IsIndirect, DebugOps, Variable, Expr);2439  BB.insert(I, MI);2440  return MachineInstrBuilder(MF, *MI);2441}2442 2443/// Compute the new DIExpression to use with a DBG_VALUE for a spill slot.2444/// This prepends DW_OP_deref when spilling an indirect DBG_VALUE.2445static const DIExpression *computeExprForSpill(2446    const MachineInstr &MI,2447    const SmallVectorImpl<const MachineOperand *> &SpilledOperands) {2448  assert(MI.getDebugVariable()->isValidLocationForIntrinsic(MI.getDebugLoc()) &&2449         "Expected inlined-at fields to agree");2450 2451  const DIExpression *Expr = MI.getDebugExpression();2452  if (MI.isIndirectDebugValue()) {2453    assert(MI.getDebugOffset().getImm() == 0 &&2454           "DBG_VALUE with nonzero offset");2455    Expr = DIExpression::prepend(Expr, DIExpression::DerefBefore);2456  } else if (MI.isDebugValueList()) {2457    // We will replace the spilled register with a frame index, so2458    // immediately deref all references to the spilled register.2459    std::array<uint64_t, 1> Ops{{dwarf::DW_OP_deref}};2460    for (const MachineOperand *Op : SpilledOperands) {2461      unsigned OpIdx = MI.getDebugOperandIndex(Op);2462      Expr = DIExpression::appendOpsToArg(Expr, Ops, OpIdx);2463    }2464  }2465  return Expr;2466}2467static const DIExpression *computeExprForSpill(const MachineInstr &MI,2468                                               Register SpillReg) {2469  assert(MI.hasDebugOperandForReg(SpillReg) && "Spill Reg is not used in MI.");2470  SmallVector<const MachineOperand *> SpillOperands(2471      llvm::make_pointer_range(MI.getDebugOperandsForReg(SpillReg)));2472  return computeExprForSpill(MI, SpillOperands);2473}2474 2475MachineInstr *llvm::buildDbgValueForSpill(MachineBasicBlock &BB,2476                                          MachineBasicBlock::iterator I,2477                                          const MachineInstr &Orig,2478                                          int FrameIndex, Register SpillReg) {2479  assert(!Orig.isDebugRef() &&2480         "DBG_INSTR_REF should not reference a virtual register.");2481  const DIExpression *Expr = computeExprForSpill(Orig, SpillReg);2482  MachineInstrBuilder NewMI =2483      BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());2484  // Non-Variadic Operands: Location, Offset, Variable, Expression2485  // Variadic Operands:     Variable, Expression, Locations...2486  if (Orig.isNonListDebugValue())2487    NewMI.addFrameIndex(FrameIndex).addImm(0U);2488  NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);2489  if (Orig.isDebugValueList()) {2490    for (const MachineOperand &Op : Orig.debug_operands())2491      if (Op.isReg() && Op.getReg() == SpillReg)2492        NewMI.addFrameIndex(FrameIndex);2493      else2494        NewMI.add(MachineOperand(Op));2495  }2496  return NewMI;2497}2498MachineInstr *llvm::buildDbgValueForSpill(2499    MachineBasicBlock &BB, MachineBasicBlock::iterator I,2500    const MachineInstr &Orig, int FrameIndex,2501    const SmallVectorImpl<const MachineOperand *> &SpilledOperands) {2502  const DIExpression *Expr = computeExprForSpill(Orig, SpilledOperands);2503  MachineInstrBuilder NewMI =2504      BuildMI(BB, I, Orig.getDebugLoc(), Orig.getDesc());2505  // Non-Variadic Operands: Location, Offset, Variable, Expression2506  // Variadic Operands:     Variable, Expression, Locations...2507  if (Orig.isNonListDebugValue())2508    NewMI.addFrameIndex(FrameIndex).addImm(0U);2509  NewMI.addMetadata(Orig.getDebugVariable()).addMetadata(Expr);2510  if (Orig.isDebugValueList()) {2511    for (const MachineOperand &Op : Orig.debug_operands())2512      if (is_contained(SpilledOperands, &Op))2513        NewMI.addFrameIndex(FrameIndex);2514      else2515        NewMI.add(MachineOperand(Op));2516  }2517  return NewMI;2518}2519 2520void llvm::updateDbgValueForSpill(MachineInstr &Orig, int FrameIndex,2521                                  Register Reg) {2522  const DIExpression *Expr = computeExprForSpill(Orig, Reg);2523  if (Orig.isNonListDebugValue())2524    Orig.getDebugOffset().ChangeToImmediate(0U);2525  for (MachineOperand &Op : Orig.getDebugOperandsForReg(Reg))2526    Op.ChangeToFrameIndex(FrameIndex);2527  Orig.getDebugExpressionOp().setMetadata(Expr);2528}2529 2530void MachineInstr::collectDebugValues(2531                                SmallVectorImpl<MachineInstr *> &DbgValues) {2532  MachineInstr &MI = *this;2533  if (!MI.getOperand(0).isReg())2534    return;2535 2536  MachineBasicBlock::iterator DI = MI; ++DI;2537  for (MachineBasicBlock::iterator DE = MI.getParent()->end();2538       DI != DE; ++DI) {2539    if (!DI->isDebugValue())2540      return;2541    if (DI->hasDebugOperandForReg(MI.getOperand(0).getReg()))2542      DbgValues.push_back(&*DI);2543  }2544}2545 2546void MachineInstr::changeDebugValuesDefReg(Register Reg) {2547  // Collect matching debug values.2548  SmallVector<MachineInstr *, 2> DbgValues;2549 2550  if (!getOperand(0).isReg())2551    return;2552 2553  Register DefReg = getOperand(0).getReg();2554  auto *MRI = getRegInfo();2555  for (auto &MO : MRI->use_operands(DefReg)) {2556    auto *DI = MO.getParent();2557    if (!DI->isDebugValue())2558      continue;2559    if (DI->hasDebugOperandForReg(DefReg)) {2560      DbgValues.push_back(DI);2561    }2562  }2563 2564  // Propagate Reg to debug value instructions.2565  for (auto *DBI : DbgValues)2566    for (MachineOperand &Op : DBI->getDebugOperandsForReg(DefReg))2567      Op.setReg(Reg);2568}2569 2570using MMOList = SmallVector<const MachineMemOperand *, 2>;2571 2572static LocationSize getSpillSlotSize(const MMOList &Accesses,2573                                     const MachineFrameInfo &MFI) {2574  std::optional<TypeSize> Size;2575  for (const auto *A : Accesses) {2576    if (MFI.isSpillSlotObjectIndex(2577            cast<FixedStackPseudoSourceValue>(A->getPseudoValue())2578                ->getFrameIndex())) {2579      LocationSize S = A->getSize();2580      if (!S.hasValue())2581        return LocationSize::beforeOrAfterPointer();2582      if (!Size)2583        Size = S.getValue();2584      else2585        Size = *Size + S.getValue();2586    }2587  }2588  if (!Size)2589    return LocationSize::precise(0);2590  return LocationSize::precise(*Size);2591}2592 2593std::optional<LocationSize>2594MachineInstr::getSpillSize(const TargetInstrInfo *TII) const {2595  int FI;2596  if (TII->isStoreToStackSlotPostFE(*this, FI)) {2597    const MachineFrameInfo &MFI = getMF()->getFrameInfo();2598    if (MFI.isSpillSlotObjectIndex(FI))2599      return (*memoperands_begin())->getSize();2600  }2601  return std::nullopt;2602}2603 2604std::optional<LocationSize>2605MachineInstr::getFoldedSpillSize(const TargetInstrInfo *TII) const {2606  MMOList Accesses;2607  if (TII->hasStoreToStackSlot(*this, Accesses))2608    return getSpillSlotSize(Accesses, getMF()->getFrameInfo());2609  return std::nullopt;2610}2611 2612std::optional<LocationSize>2613MachineInstr::getRestoreSize(const TargetInstrInfo *TII) const {2614  int FI;2615  if (TII->isLoadFromStackSlotPostFE(*this, FI)) {2616    const MachineFrameInfo &MFI = getMF()->getFrameInfo();2617    if (MFI.isSpillSlotObjectIndex(FI))2618      return (*memoperands_begin())->getSize();2619  }2620  return std::nullopt;2621}2622 2623std::optional<LocationSize>2624MachineInstr::getFoldedRestoreSize(const TargetInstrInfo *TII) const {2625  MMOList Accesses;2626  if (TII->hasLoadFromStackSlot(*this, Accesses))2627    return getSpillSlotSize(Accesses, getMF()->getFrameInfo());2628  return std::nullopt;2629}2630 2631unsigned MachineInstr::getDebugInstrNum() {2632  if (DebugInstrNum == 0)2633    DebugInstrNum = getParent()->getParent()->getNewDebugInstrNum();2634  return DebugInstrNum;2635}2636 2637unsigned MachineInstr::getDebugInstrNum(MachineFunction &MF) {2638  if (DebugInstrNum == 0)2639    DebugInstrNum = MF.getNewDebugInstrNum();2640  return DebugInstrNum;2641}2642 2643std::tuple<LLT, LLT> MachineInstr::getFirst2LLTs() const {2644  return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),2645                    getRegInfo()->getType(getOperand(1).getReg()));2646}2647 2648std::tuple<LLT, LLT, LLT> MachineInstr::getFirst3LLTs() const {2649  return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),2650                    getRegInfo()->getType(getOperand(1).getReg()),2651                    getRegInfo()->getType(getOperand(2).getReg()));2652}2653 2654std::tuple<LLT, LLT, LLT, LLT> MachineInstr::getFirst4LLTs() const {2655  return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),2656                    getRegInfo()->getType(getOperand(1).getReg()),2657                    getRegInfo()->getType(getOperand(2).getReg()),2658                    getRegInfo()->getType(getOperand(3).getReg()));2659}2660 2661std::tuple<LLT, LLT, LLT, LLT, LLT> MachineInstr::getFirst5LLTs() const {2662  return std::tuple(getRegInfo()->getType(getOperand(0).getReg()),2663                    getRegInfo()->getType(getOperand(1).getReg()),2664                    getRegInfo()->getType(getOperand(2).getReg()),2665                    getRegInfo()->getType(getOperand(3).getReg()),2666                    getRegInfo()->getType(getOperand(4).getReg()));2667}2668 2669std::tuple<Register, LLT, Register, LLT>2670MachineInstr::getFirst2RegLLTs() const {2671  Register Reg0 = getOperand(0).getReg();2672  Register Reg1 = getOperand(1).getReg();2673  return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,2674                    getRegInfo()->getType(Reg1));2675}2676 2677std::tuple<Register, LLT, Register, LLT, Register, LLT>2678MachineInstr::getFirst3RegLLTs() const {2679  Register Reg0 = getOperand(0).getReg();2680  Register Reg1 = getOperand(1).getReg();2681  Register Reg2 = getOperand(2).getReg();2682  return std::tuple(Reg0, getRegInfo()->getType(Reg0), Reg1,2683                    getRegInfo()->getType(Reg1), Reg2,2684                    getRegInfo()->getType(Reg2));2685}2686 2687std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT>2688MachineInstr::getFirst4RegLLTs() const {2689  Register Reg0 = getOperand(0).getReg();2690  Register Reg1 = getOperand(1).getReg();2691  Register Reg2 = getOperand(2).getReg();2692  Register Reg3 = getOperand(3).getReg();2693  return std::tuple(2694      Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),2695      Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3));2696}2697 2698std::tuple<Register, LLT, Register, LLT, Register, LLT, Register, LLT, Register,2699           LLT>2700MachineInstr::getFirst5RegLLTs() const {2701  Register Reg0 = getOperand(0).getReg();2702  Register Reg1 = getOperand(1).getReg();2703  Register Reg2 = getOperand(2).getReg();2704  Register Reg3 = getOperand(3).getReg();2705  Register Reg4 = getOperand(4).getReg();2706  return std::tuple(2707      Reg0, getRegInfo()->getType(Reg0), Reg1, getRegInfo()->getType(Reg1),2708      Reg2, getRegInfo()->getType(Reg2), Reg3, getRegInfo()->getType(Reg3),2709      Reg4, getRegInfo()->getType(Reg4));2710}2711 2712void MachineInstr::insert(mop_iterator InsertBefore,2713                          ArrayRef<MachineOperand> Ops) {2714  assert(InsertBefore != nullptr && "invalid iterator");2715  assert(InsertBefore->getParent() == this &&2716         "iterator points to operand of other inst");2717  if (Ops.empty())2718    return;2719 2720  // Do one pass to untie operands.2721  SmallDenseMap<unsigned, unsigned> TiedOpIndices;2722  for (const MachineOperand &MO : operands()) {2723    if (MO.isReg() && MO.isTied()) {2724      unsigned OpNo = getOperandNo(&MO);2725      unsigned TiedTo = findTiedOperandIdx(OpNo);2726      TiedOpIndices[OpNo] = TiedTo;2727      untieRegOperand(OpNo);2728    }2729  }2730 2731  unsigned OpIdx = getOperandNo(InsertBefore);2732  unsigned NumOperands = getNumOperands();2733  unsigned OpsToMove = NumOperands - OpIdx;2734 2735  SmallVector<MachineOperand> MovingOps;2736  MovingOps.reserve(OpsToMove);2737 2738  for (unsigned I = 0; I < OpsToMove; ++I) {2739    MovingOps.emplace_back(getOperand(OpIdx));2740    removeOperand(OpIdx);2741  }2742  for (const MachineOperand &MO : Ops)2743    addOperand(MO);2744  for (const MachineOperand &OpMoved : MovingOps)2745    addOperand(OpMoved);2746 2747  // Re-tie operands.2748  for (auto [Tie1, Tie2] : TiedOpIndices) {2749    if (Tie1 >= OpIdx)2750      Tie1 += Ops.size();2751    if (Tie2 >= OpIdx)2752      Tie2 += Ops.size();2753    tieOperands(Tie1, Tie2);2754  }2755}2756 2757bool MachineInstr::mayFoldInlineAsmRegOp(unsigned OpId) const {2758  assert(OpId && "expected non-zero operand id");2759  assert(isInlineAsm() && "should only be used on inline asm");2760 2761  if (!getOperand(OpId).isReg())2762    return false;2763 2764  const MachineOperand &MD = getOperand(OpId - 1);2765  if (!MD.isImm())2766    return false;2767 2768  InlineAsm::Flag F(MD.getImm());2769  if (F.isRegUseKind() || F.isRegDefKind() || F.isRegDefEarlyClobberKind())2770    return F.getRegMayBeFolded();2771  return false;2772}2773 2774unsigned MachineInstr::removePHIIncomingValueFor(const MachineBasicBlock &MBB) {2775  assert(isPHI());2776 2777  // Phi might have multiple entries for MBB. Need to remove them all.2778  unsigned RemovedCount = 0;2779  for (unsigned N = getNumOperands(); N > 2; N -= 2) {2780    if (getOperand(N - 1).getMBB() == &MBB) {2781      removeOperand(N - 1);2782      removeOperand(N - 2);2783      RemovedCount += 2;2784    }2785  }2786  return RemovedCount;2787}2788