diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 | 
| commit | dd58ef019b700900793a1eb48b52123db01b654e (patch) | |
| tree | fcfbb4df56a744f4ddc6122c50521dd3f1c5e196 /lib/CodeGen/MachineInstr.cpp | |
| parent | 2fe5752e3a7c345cdb59e869278d36af33c13fa4 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
| -rw-r--r-- | lib/CodeGen/MachineInstr.cpp | 89 | 
1 files changed, 61 insertions, 28 deletions
| diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index fdc4226ad926..1eb2edcd7cec 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -33,6 +33,7 @@  #include "llvm/IR/Value.h"  #include "llvm/MC/MCInstrDesc.h"  #include "llvm/MC/MCSymbol.h" +#include "llvm/Support/CommandLine.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/MathExtras.h" @@ -43,6 +44,11 @@  #include "llvm/Target/TargetSubtargetInfo.h"  using namespace llvm; +static cl::opt<bool> PrintWholeRegMask( +    "print-whole-regmask", +    cl::desc("Print the full contents of regmask operands in IR dumps"), +    cl::init(true), cl::Hidden); +  //===----------------------------------------------------------------------===//  // MachineOperand Implementation  //===----------------------------------------------------------------------===// @@ -407,9 +413,26 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,      if (getOffset()) OS << "+" << getOffset();      OS << '>';      break; -  case MachineOperand::MO_RegisterMask: -    OS << "<regmask>"; +  case MachineOperand::MO_RegisterMask: { +    unsigned NumRegsInMask = 0; +    unsigned NumRegsEmitted = 0; +    OS << "<regmask"; +    for (unsigned i = 0; i < TRI->getNumRegs(); ++i) { +      unsigned MaskWord = i / 32; +      unsigned MaskBit = i % 32; +      if (getRegMask()[MaskWord] & (1 << MaskBit)) { +        if (PrintWholeRegMask || NumRegsEmitted <= 10) { +          OS << " " << PrintReg(i, TRI); +          NumRegsEmitted++; +        } +        NumRegsInMask++; +      } +    } +    if (NumRegsEmitted != NumRegsInMask) +      OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more..."; +    OS << ">";      break; +  }    case MachineOperand::MO_RegisterLiveOut:      OS << "<regliveout>";      break; @@ -443,26 +466,28 @@ unsigned MachinePointerInfo::getAddrSpace() const {  /// getConstantPool - Return a MachinePointerInfo record that refers to the  /// constant pool. -MachinePointerInfo MachinePointerInfo::getConstantPool() { -  return MachinePointerInfo(PseudoSourceValue::getConstantPool()); +MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) { +  return MachinePointerInfo(MF.getPSVManager().getConstantPool());  }  /// getFixedStack - Return a MachinePointerInfo record that refers to the  /// the specified FrameIndex. -MachinePointerInfo MachinePointerInfo::getFixedStack(int FI, int64_t offset) { -  return MachinePointerInfo(PseudoSourceValue::getFixedStack(FI), offset); +MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF, +                                                     int FI, int64_t Offset) { +  return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset);  } -MachinePointerInfo MachinePointerInfo::getJumpTable() { -  return MachinePointerInfo(PseudoSourceValue::getJumpTable()); +MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) { +  return MachinePointerInfo(MF.getPSVManager().getJumpTable());  } -MachinePointerInfo MachinePointerInfo::getGOT() { -  return MachinePointerInfo(PseudoSourceValue::getGOT()); +MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) { +  return MachinePointerInfo(MF.getPSVManager().getGOT());  } -MachinePointerInfo MachinePointerInfo::getStack(int64_t Offset) { -  return MachinePointerInfo(PseudoSourceValue::getStack(), Offset); +MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF, +                                                int64_t Offset) { +  return MachinePointerInfo(MF.getPSVManager().getStack(), Offset);  }  MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, unsigned f, @@ -606,10 +631,12 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {  void MachineInstr::addImplicitDefUseOperands(MachineFunction &MF) {    if (MCID->ImplicitDefs) -    for (const uint16_t *ImpDefs = MCID->getImplicitDefs(); *ImpDefs; ++ImpDefs) +    for (const MCPhysReg *ImpDefs = MCID->getImplicitDefs(); *ImpDefs; +           ++ImpDefs)        addOperand(MF, MachineOperand::CreateReg(*ImpDefs, true, true));    if (MCID->ImplicitUses) -    for (const uint16_t *ImpUses = MCID->getImplicitUses(); *ImpUses; ++ImpUses) +    for (const MCPhysReg *ImpUses = MCID->getImplicitUses(); *ImpUses; +           ++ImpUses)        addOperand(MF, MachineOperand::CreateReg(*ImpUses, false, true));  } @@ -841,7 +868,7 @@ void MachineInstr::addMemOperand(MachineFunction &MF,  bool MachineInstr::hasPropertyInBundle(unsigned Mask, QueryType Type) const {    assert(!isBundledWithPred() && "Must be called on bundle header"); -  for (MachineBasicBlock::const_instr_iterator MII = this;; ++MII) { +  for (MachineBasicBlock::const_instr_iterator MII = getIterator();; ++MII) {      if (MII->getDesc().getFlags() & Mask) {        if (Type == AnyInBundle)          return true; @@ -865,13 +892,13 @@ bool MachineInstr::isIdenticalTo(const MachineInstr *Other,    if (isBundle()) {      // Both instructions are bundles, compare MIs inside the bundle. -    MachineBasicBlock::const_instr_iterator I1 = *this; +    MachineBasicBlock::const_instr_iterator I1 = getIterator();      MachineBasicBlock::const_instr_iterator E1 = getParent()->instr_end(); -    MachineBasicBlock::const_instr_iterator I2 = *Other; +    MachineBasicBlock::const_instr_iterator I2 = Other->getIterator();      MachineBasicBlock::const_instr_iterator E2= Other->getParent()->instr_end();      while (++I1 != E1 && I1->isInsideBundle()) {        ++I2; -      if (I2 == E2 || !I2->isInsideBundle() || !I1->isIdenticalTo(I2, Check)) +      if (I2 == E2 || !I2->isInsideBundle() || !I1->isIdenticalTo(&*I2, Check))          return false;      }    } @@ -976,7 +1003,7 @@ unsigned MachineInstr::getNumExplicitOperands() const {  void MachineInstr::bundleWithPred() {    assert(!isBundledWithPred() && "MI is already bundled with its predecessor");    setFlag(BundledPred); -  MachineBasicBlock::instr_iterator Pred = this; +  MachineBasicBlock::instr_iterator Pred = getIterator();    --Pred;    assert(!Pred->isBundledWithSucc() && "Inconsistent bundle flags");    Pred->setFlag(BundledSucc); @@ -985,7 +1012,7 @@ void MachineInstr::bundleWithPred() {  void MachineInstr::bundleWithSucc() {    assert(!isBundledWithSucc() && "MI is already bundled with its successor");    setFlag(BundledSucc); -  MachineBasicBlock::instr_iterator Succ = this; +  MachineBasicBlock::instr_iterator Succ = getIterator();    ++Succ;    assert(!Succ->isBundledWithPred() && "Inconsistent bundle flags");    Succ->setFlag(BundledPred); @@ -994,7 +1021,7 @@ void MachineInstr::bundleWithSucc() {  void MachineInstr::unbundleFromPred() {    assert(isBundledWithPred() && "MI isn't bundled with its predecessor");    clearFlag(BundledPred); -  MachineBasicBlock::instr_iterator Pred = this; +  MachineBasicBlock::instr_iterator Pred = getIterator();    --Pred;    assert(Pred->isBundledWithSucc() && "Inconsistent bundle flags");    Pred->clearFlag(BundledSucc); @@ -1003,7 +1030,7 @@ void MachineInstr::unbundleFromPred() {  void MachineInstr::unbundleFromSucc() {    assert(isBundledWithSucc() && "MI isn't bundled with its successor");    clearFlag(BundledSucc); -  MachineBasicBlock::instr_iterator Succ = this; +  MachineBasicBlock::instr_iterator Succ = getIterator();    ++Succ;    assert(Succ->isBundledWithPred() && "Inconsistent bundle flags");    Succ->clearFlag(BundledPred); @@ -1139,7 +1166,7 @@ const TargetRegisterClass *MachineInstr::getRegClassConstraintEffect(  /// Return the number of instructions inside the MI bundle, not counting the  /// header instruction.  unsigned MachineInstr::getBundleSize() const { -  MachineBasicBlock::const_instr_iterator I = this; +  MachineBasicBlock::const_instr_iterator I = getIterator();    unsigned Size = 0;    while (I->isBundledWithSucc())      ++Size, ++I; @@ -1501,6 +1528,10 @@ bool MachineInstr::hasUnmodeledSideEffects() const {    return false;  } +bool MachineInstr::isLoadFoldBarrier() const { +  return mayStore() || isCall() || hasUnmodeledSideEffects(); +} +  /// allDefsAreDead - Return true if all the defs of this instruction are dead.  ///  bool MachineInstr::allDefsAreDead() const { @@ -1615,7 +1646,6 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,      FirstOp = false;    } -    for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {      const MachineOperand &MO = getOperand(i); @@ -1706,13 +1736,16 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,    }    bool HaveSemi = false; -  const unsigned PrintableFlags = FrameSetup; +  const unsigned PrintableFlags = FrameSetup | FrameDestroy;    if (Flags & PrintableFlags) {      if (!HaveSemi) OS << ";"; HaveSemi = true;      OS << " flags: ";      if (Flags & FrameSetup)        OS << "FrameSetup"; + +    if (Flags & FrameDestroy) +      OS << "FrameDestroy";    }    if (!memoperands_empty()) { @@ -1755,7 +1788,7 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,        DebugLoc InlinedAtDL(InlinedAt);        if (InlinedAtDL && MF) {          OS << " inlined @[ "; -	InlinedAtDL.print(OS); +        InlinedAtDL.print(OS);          OS << " ]";        }      } @@ -1902,11 +1935,11 @@ void MachineInstr::clearRegisterDeads(unsigned Reg) {    }  } -void MachineInstr::addRegisterDefReadUndef(unsigned Reg) { +void MachineInstr::setRegisterDefReadUndef(unsigned Reg, bool IsUndef) {    for (MachineOperand &MO : operands()) {      if (!MO.isReg() || !MO.isDef() || MO.getReg() != Reg || MO.getSubReg() == 0)        continue; -    MO.setIsUndef(); +    MO.setIsUndef(IsUndef);    }  } | 
