diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp | 125 | 
1 files changed, 62 insertions, 63 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp index 4fa4ea7f6cf5..7b8f01100929 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/MachineOperand.cpp @@ -14,6 +14,7 @@  #include "llvm/ADT/StringExtras.h"  #include "llvm/Analysis/Loads.h"  #include "llvm/Analysis/MemoryLocation.h" +#include "llvm/CodeGen/MIRFormatter.h"  #include "llvm/CodeGen/MIRPrinter.h"  #include "llvm/CodeGen/MachineFrameInfo.h"  #include "llvm/CodeGen/MachineJumpTableInfo.h" @@ -49,7 +50,7 @@ static MachineFunction *getMFIfAvailable(MachineOperand &MO) {        getMFIfAvailable(const_cast<const MachineOperand &>(MO)));  } -void MachineOperand::setReg(unsigned Reg) { +void MachineOperand::setReg(Register Reg) {    if (getReg() == Reg)      return; // No change. @@ -71,9 +72,9 @@ void MachineOperand::setReg(unsigned Reg) {    SmallContents.RegNo = Reg;  } -void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx, +void MachineOperand::substVirtReg(Register Reg, unsigned SubIdx,                                    const TargetRegisterInfo &TRI) { -  assert(TargetRegisterInfo::isVirtualRegister(Reg)); +  assert(Reg.isVirtual());    if (SubIdx && getSubReg())      SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg());    setReg(Reg); @@ -81,8 +82,8 @@ void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx,      setSubReg(SubIdx);  } -void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) { -  assert(TargetRegisterInfo::isPhysicalRegister(Reg)); +void MachineOperand::substPhysReg(MCRegister Reg, const TargetRegisterInfo &TRI) { +  assert(Reg.isPhysical());    if (getSubReg()) {      Reg = TRI.getSubReg(Reg, getSubReg());      // Note that getSubReg() may return 0 if the sub-register doesn't exist. @@ -114,7 +115,7 @@ void MachineOperand::setIsDef(bool Val) {  bool MachineOperand::isRenamable() const {    assert(isReg() && "Wrong MachineOperand accessor"); -  assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && +  assert(Register::isPhysicalRegister(getReg()) &&           "isRenamable should only be checked on physical registers");    if (!IsRenamable)      return false; @@ -132,7 +133,7 @@ bool MachineOperand::isRenamable() const {  void MachineOperand::setIsRenamable(bool Val) {    assert(isReg() && "Wrong MachineOperand accessor"); -  assert(TargetRegisterInfo::isPhysicalRegister(getReg()) && +  assert(Register::isPhysicalRegister(getReg()) &&           "setIsRenamable should only be called on physical registers");    IsRenamable = Val;  } @@ -169,7 +170,7 @@ void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) {  }  void MachineOperand::ChangeToES(const char *SymName, -                                unsigned char TargetFlags) { +                                unsigned TargetFlags) {    assert((!isReg() || !isTied()) &&           "Cannot change a tied operand into an external symbol"); @@ -182,7 +183,7 @@ void MachineOperand::ChangeToES(const char *SymName,  }  void MachineOperand::ChangeToGA(const GlobalValue *GV, int64_t Offset, -                                unsigned char TargetFlags) { +                                unsigned TargetFlags) {    assert((!isReg() || !isTied()) &&           "Cannot change a tied operand into a global address"); @@ -215,7 +216,7 @@ void MachineOperand::ChangeToFrameIndex(int Idx) {  }  void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset, -                                         unsigned char TargetFlags) { +                                         unsigned TargetFlags) {    assert((!isReg() || !isTied()) &&           "Cannot change a tied operand into a FrameIndex"); @@ -230,7 +231,7 @@ void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset,  /// ChangeToRegister - Replace this operand with a new register operand of  /// the specified value.  If an operand is known to be an register already,  /// the setReg method should be used. -void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp, +void MachineOperand::ChangeToRegister(Register Reg, bool isDef, bool isImp,                                        bool isKill, bool isDead, bool isUndef,                                        bool isDebug) {    MachineRegisterInfo *RegInfo = nullptr; @@ -333,6 +334,8 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {      return getIntrinsicID() == Other.getIntrinsicID();    case MachineOperand::MO_Predicate:      return getPredicate() == Other.getPredicate(); +  case MachineOperand::MO_ShuffleMask: +    return getShuffleMask() == Other.getShuffleMask();    }    llvm_unreachable("Invalid machine operand type");  } @@ -381,6 +384,8 @@ hash_code llvm::hash_value(const MachineOperand &MO) {      return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());    case MachineOperand::MO_Predicate:      return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate()); +  case MachineOperand::MO_ShuffleMask: +    return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getShuffleMask());    }    llvm_unreachable("Invalid machine operand type");  } @@ -425,12 +430,10 @@ static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,      return;    } -  int Reg = TRI->getLLVMRegNum(DwarfReg, true); -  if (Reg == -1) { +  if (Optional<unsigned> Reg = TRI->getLLVMRegNum(DwarfReg, true)) +    OS << printReg(*Reg, TRI); +  else      OS << "<badreg>"; -    return; -  } -  OS << printReg(Reg, TRI);  }  static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB, @@ -456,28 +459,6 @@ static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB,      OS << "<unknown>";  } -static void printIRValueReference(raw_ostream &OS, const Value &V, -                                  ModuleSlotTracker &MST) { -  if (isa<GlobalValue>(V)) { -    V.printAsOperand(OS, /*PrintType=*/false, MST); -    return; -  } -  if (isa<Constant>(V)) { -    // Machine memory operands can load/store to/from constant value pointers. -    OS << '`'; -    V.printAsOperand(OS, /*PrintType=*/true, MST); -    OS << '`'; -    return; -  } -  OS << "%ir."; -  if (V.hasName()) { -    printLLVMNameWithoutPrefix(OS, V.getName()); -    return; -  } -  int Slot = MST.getCurrentFunction() ? MST.getLocalSlot(&V) : -1; -  MachineOperand::printIRSlotNumber(OS, Slot); -} -  static void printSyncScope(raw_ostream &OS, const LLVMContext &Context,                             SyncScope::ID SSID,                             SmallVectorImpl<StringRef> &SSNs) { @@ -732,21 +713,22 @@ void MachineOperand::print(raw_ostream &OS, LLT TypeToPrint,                             const TargetIntrinsicInfo *IntrinsicInfo) const {    tryToGetTargetInfo(*this, TRI, IntrinsicInfo);    ModuleSlotTracker DummyMST(nullptr); -  print(OS, DummyMST, TypeToPrint, /*PrintDef=*/false, /*IsStandalone=*/true, +  print(OS, DummyMST, TypeToPrint, None, /*PrintDef=*/false, +        /*IsStandalone=*/true,          /*ShouldPrintRegisterTies=*/true,          /*TiedOperandIdx=*/0, TRI, IntrinsicInfo);  }  void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST, -                           LLT TypeToPrint, bool PrintDef, bool IsStandalone, -                           bool ShouldPrintRegisterTies, +                           LLT TypeToPrint, Optional<unsigned> OpIdx, bool PrintDef, +                           bool IsStandalone, bool ShouldPrintRegisterTies,                             unsigned TiedOperandIdx,                             const TargetRegisterInfo *TRI,                             const TargetIntrinsicInfo *IntrinsicInfo) const {    printTargetFlags(OS, *this);    switch (getType()) {    case MachineOperand::MO_Register: { -    unsigned Reg = getReg(); +    Register Reg = getReg();      if (isImplicit())        OS << (isDef() ? "implicit-def " : "implicit ");      else if (PrintDef && isDef()) @@ -762,13 +744,13 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,        OS << "undef ";      if (isEarlyClobber())        OS << "early-clobber "; -    if (TargetRegisterInfo::isPhysicalRegister(getReg()) && isRenamable()) +    if (Register::isPhysicalRegister(getReg()) && isRenamable())        OS << "renamable ";      // isDebug() is exactly true for register operands of a DBG_VALUE. So we      // simply infer it when parsing and do not need to print it.      const MachineRegisterInfo *MRI = nullptr; -    if (TargetRegisterInfo::isVirtualRegister(Reg)) { +    if (Register::isVirtualRegister(Reg)) {        if (const MachineFunction *MF = getMFIfAvailable(*this)) {          MRI = &MF->getRegInfo();        } @@ -783,7 +765,7 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,          OS << ".subreg" << SubReg;      }      // Print the register class / bank. -    if (TargetRegisterInfo::isVirtualRegister(Reg)) { +    if (Register::isVirtualRegister(Reg)) {        if (const MachineFunction *MF = getMFIfAvailable(*this)) {          const MachineRegisterInfo &MRI = MF->getRegInfo();          if (IsStandalone || !PrintDef || MRI.def_empty(Reg)) { @@ -800,9 +782,19 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,        OS << '(' << TypeToPrint << ')';      break;    } -  case MachineOperand::MO_Immediate: -    OS << getImm(); +  case MachineOperand::MO_Immediate: { +    const MIRFormatter *Formatter = nullptr; +    if (const MachineFunction *MF = getMFIfAvailable(*this)) { +      const auto *TII = MF->getSubtarget().getInstrInfo(); +      assert(TII && "expected instruction info"); +      Formatter = TII->getMIRFormatter(); +    } +    if (Formatter) +      Formatter->printImm(OS, *getParent(), OpIdx, getImm()); +    else +      OS << getImm();      break; +  }    case MachineOperand::MO_CImmediate:      getCImm()->printAsOperand(OS, /*PrintType=*/true, MST);      break; @@ -936,6 +928,20 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,         << CmpInst::getPredicateName(Pred) << ')';      break;    } +  case MachineOperand::MO_ShuffleMask: +    OS << "shufflemask("; +    ArrayRef<int> Mask = getShuffleMask(); +    StringRef Separator; +    for (int Elt : Mask) { +      if (Elt == -1) +        OS << Separator << "undef"; +      else +        OS << Separator << Elt; +      Separator = ", "; +    } + +    OS << ')'; +    break;    }  } @@ -963,7 +969,8 @@ bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C,      return false;    return isDereferenceableAndAlignedPointer( -      BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL); +      BasePtr, Align::None(), APInt(DL.getPointerSizeInBits(), Offset + Size), +      DL);  }  /// getConstantPool - Return a MachinePointerInfo record that refers to the @@ -1049,17 +1056,6 @@ uint64_t MachineMemOperand::getAlignment() const {    return MinAlign(getBaseAlignment(), getOffset());  } -void MachineMemOperand::print(raw_ostream &OS) const { -  ModuleSlotTracker DummyMST(nullptr); -  print(OS, DummyMST); -} - -void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const { -  SmallVector<StringRef, 0> SSNs; -  LLVMContext Ctx; -  print(OS, MST, SSNs, Ctx, nullptr, nullptr); -} -  void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,                                SmallVectorImpl<StringRef> &SSNs,                                const LLVMContext &Context, @@ -1105,7 +1101,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,    if (const Value *Val = getValue()) {      OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into "); -    printIRValueReference(OS, *Val, MST); +    MIRFormatter::printIRValue(OS, *Val, MST);    } else if (const PseudoSourceValue *PVal = getPseudoValue()) {      OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into ");      assert(PVal && "Expected a pseudo source value"); @@ -1138,15 +1134,18 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,        printLLVMNameWithoutPrefix(            OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol());        break; -    default: +    default: { +      const MIRFormatter *Formatter = TII->getMIRFormatter();        // FIXME: This is not necessarily the correct MIR serialization format for        // a custom pseudo source value, but at least it allows        // -print-machineinstrs to work on a target with custom pseudo source        // values. -      OS << "custom "; -      PVal->printCustom(OS); +      OS << "custom \""; +      Formatter->printCustomPseudoSourceValue(OS, MST, *PVal); +      OS << '\"';        break;      } +    }    }    MachineOperand::printOperandOffset(OS, getOffset());    if (getBaseAlignment() != getSize())  | 
