diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/MIRPrinter.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/MIRPrinter.cpp | 124 | 
1 files changed, 109 insertions, 15 deletions
diff --git a/contrib/llvm/lib/CodeGen/MIRPrinter.cpp b/contrib/llvm/lib/CodeGen/MIRPrinter.cpp index db87092177ca..293fc7358b8e 100644 --- a/contrib/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/contrib/llvm/lib/CodeGen/MIRPrinter.cpp @@ -12,7 +12,8 @@  //  //===----------------------------------------------------------------------===// -#include "MIRPrinter.h" +#include "llvm/CodeGen/MIRPrinter.h" +  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallBitVector.h"  #include "llvm/CodeGen/GlobalISel/RegisterBank.h" @@ -34,6 +35,7 @@  #include "llvm/MC/MCSymbol.h"  #include "llvm/Support/Format.h"  #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Options.h"  #include "llvm/Support/YAMLTraits.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetInstrInfo.h" @@ -42,6 +44,9 @@  using namespace llvm; +static cl::opt<bool> SimplifyMIR("simplify-mir", +    cl::desc("Leave out unnecessary information when printing MIR")); +  namespace {  /// This structure describes how to print out stack object references. @@ -105,6 +110,9 @@ class MIPrinter {    const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds;    const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping; +  bool canPredictBranchProbabilities(const MachineBasicBlock &MBB) const; +  bool canPredictSuccessors(const MachineBasicBlock &MBB) const; +  public:    MIPrinter(raw_ostream &OS, ModuleSlotTracker &MST,              const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds, @@ -205,6 +213,25 @@ void MIRPrinter::print(const MachineFunction &MF) {    Out << YamlMF;  } +static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, +                               const TargetRegisterInfo *TRI) { +  assert(RegMask && "Can't print an empty register mask"); +  OS << StringRef("CustomRegMask("); + +  bool IsRegInRegMaskFound = false; +  for (int I = 0, E = TRI->getNumRegs(); I < E; I++) { +    // Check whether the register is asserted in regmask. +    if (RegMask[I / 32] & (1u << (I % 32))) { +      if (IsRegInRegMaskFound) +        OS << ','; +      printReg(I, OS, TRI); +      IsRegInRegMaskFound = true; +    } +  } + +  OS << ')'; +} +  void MIRPrinter::convert(yaml::MachineFunction &MF,                           const MachineRegisterInfo &RegInfo,                           const TargetRegisterInfo *TRI) { @@ -239,20 +266,18 @@ void MIRPrinter::convert(yaml::MachineFunction &MF,        printReg(I->second, LiveIn.VirtualRegister, TRI);      MF.LiveIns.push_back(LiveIn);    } -  // The used physical register mask is printed as an inverted callee saved -  // register mask. -  const BitVector &UsedPhysRegMask = RegInfo.getUsedPhysRegsMask(); -  if (UsedPhysRegMask.none()) -    return; -  std::vector<yaml::FlowStringValue> CalleeSavedRegisters; -  for (unsigned I = 0, E = UsedPhysRegMask.size(); I != E; ++I) { -    if (!UsedPhysRegMask[I]) { + +  // Prints the callee saved registers. +  if (RegInfo.isUpdatedCSRsInitialized()) { +    const MCPhysReg *CalleeSavedRegs = RegInfo.getCalleeSavedRegs(); +    std::vector<yaml::FlowStringValue> CalleeSavedRegisters; +    for (const MCPhysReg *I = CalleeSavedRegs; *I; ++I) {        yaml::FlowStringValue Reg; -      printReg(I, Reg, TRI); +      printReg(*I, Reg, TRI);        CalleeSavedRegisters.push_back(Reg);      } +    MF.CalleeSavedRegisters = CalleeSavedRegisters;    } -  MF.CalleeSavedRegisters = CalleeSavedRegisters;  }  void MIRPrinter::convert(ModuleSlotTracker &MST, @@ -267,7 +292,8 @@ void MIRPrinter::convert(ModuleSlotTracker &MST,    YamlMFI.MaxAlignment = MFI.getMaxAlignment();    YamlMFI.AdjustsStack = MFI.adjustsStack();    YamlMFI.HasCalls = MFI.hasCalls(); -  YamlMFI.MaxCallFrameSize = MFI.getMaxCallFrameSize(); +  YamlMFI.MaxCallFrameSize = MFI.isMaxCallFrameSizeComputed() +    ? MFI.getMaxCallFrameSize() : ~0u;    YamlMFI.HasOpaqueSPAdjustment = MFI.hasOpaqueSPAdjustment();    YamlMFI.HasVAStart = MFI.hasVAStart();    YamlMFI.HasMustTailInVarArgFunc = MFI.hasMustTailInVarArgFunc(); @@ -434,6 +460,63 @@ void MIRPrinter::initRegisterMaskIds(const MachineFunction &MF) {      RegisterMaskIds.insert(std::make_pair(Mask, I++));  } +void llvm::guessSuccessors(const MachineBasicBlock &MBB, +                           SmallVectorImpl<MachineBasicBlock*> &Result, +                           bool &IsFallthrough) { +  SmallPtrSet<MachineBasicBlock*,8> Seen; + +  for (const MachineInstr &MI : MBB) { +    if (MI.isPHI()) +      continue; +    for (const MachineOperand &MO : MI.operands()) { +      if (!MO.isMBB()) +        continue; +      MachineBasicBlock *Succ = MO.getMBB(); +      auto RP = Seen.insert(Succ); +      if (RP.second) +        Result.push_back(Succ); +    } +  } +  MachineBasicBlock::const_iterator I = MBB.getLastNonDebugInstr(); +  IsFallthrough = I == MBB.end() || !I->isBarrier(); +} + +bool +MIPrinter::canPredictBranchProbabilities(const MachineBasicBlock &MBB) const { +  if (MBB.succ_size() <= 1) +    return true; +  if (!MBB.hasSuccessorProbabilities()) +    return true; + +  SmallVector<BranchProbability,8> Normalized(MBB.Probs.begin(), +                                              MBB.Probs.end()); +  BranchProbability::normalizeProbabilities(Normalized.begin(), +                                            Normalized.end()); +  SmallVector<BranchProbability,8> Equal(Normalized.size()); +  BranchProbability::normalizeProbabilities(Equal.begin(), Equal.end()); + +  return std::equal(Normalized.begin(), Normalized.end(), Equal.begin()); +} + +bool MIPrinter::canPredictSuccessors(const MachineBasicBlock &MBB) const { +  SmallVector<MachineBasicBlock*,8> GuessedSuccs; +  bool GuessedFallthrough; +  guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough); +  if (GuessedFallthrough) { +    const MachineFunction &MF = *MBB.getParent(); +    MachineFunction::const_iterator NextI = std::next(MBB.getIterator()); +    if (NextI != MF.end()) { +      MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI); +      if (!is_contained(GuessedSuccs, Next)) +        GuessedSuccs.push_back(Next); +    } +  } +  if (GuessedSuccs.size() != MBB.succ_size()) +    return false; +  return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin()); +} + +  void MIPrinter::print(const MachineBasicBlock &MBB) {    assert(MBB.getNumber() >= 0 && "Invalid MBB number");    OS << "bb." << MBB.getNumber(); @@ -472,13 +555,15 @@ void MIPrinter::print(const MachineBasicBlock &MBB) {    bool HasLineAttributes = false;    // Print the successors -  if (!MBB.succ_empty()) { +  bool canPredictProbs = canPredictBranchProbabilities(MBB); +  if (!MBB.succ_empty() && (!SimplifyMIR || !canPredictProbs || +                            !canPredictSuccessors(MBB))) {      OS.indent(2) << "successors: ";      for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) {        if (I != MBB.succ_begin())          OS << ", ";        printMBBReference(**I); -      if (MBB.hasSuccessorProbabilities()) +      if (!SimplifyMIR || !canPredictProbs)          OS << '('             << format("0x%08" PRIx32, MBB.getSuccProbability(I).getNumerator())             << ')'; @@ -860,7 +945,7 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI,      if (RegMaskInfo != RegisterMaskIds.end())        OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower();      else -      llvm_unreachable("Can't print this machine register mask yet."); +      printCustomRegMask(Op.getRegMask(), OS, TRI);      break;    }    case MachineOperand::MO_RegisterLiveOut: { @@ -926,6 +1011,15 @@ void MIPrinter::print(const MachineMemOperand &Op) {      assert(Op.isStore() && "Non load machine operand must be a store");      OS << "store ";    } + +  if (Op.getSynchScope() == SynchronizationScope::SingleThread) +    OS << "singlethread "; + +  if (Op.getOrdering() != AtomicOrdering::NotAtomic) +    OS << toIRString(Op.getOrdering()) << ' '; +  if (Op.getFailureOrdering() != AtomicOrdering::NotAtomic) +    OS << toIRString(Op.getFailureOrdering()) << ' '; +    OS << Op.getSize();    if (const Value *Val = Op.getValue()) {      OS << (Op.isLoad() ? " from " : " into ");  | 
