diff options
Diffstat (limited to 'lib/CodeGen/TargetSubtargetInfo.cpp')
| -rw-r--r-- | lib/CodeGen/TargetSubtargetInfo.cpp | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/CodeGen/TargetSubtargetInfo.cpp b/lib/CodeGen/TargetSubtargetInfo.cpp index c74707d95b9e..0a444e0fff07 100644 --- a/lib/CodeGen/TargetSubtargetInfo.cpp +++ b/lib/CodeGen/TargetSubtargetInfo.cpp @@ -11,6 +11,9 @@  //  //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/TargetSchedule.h" +#include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetSubtargetInfo.h"  using namespace llvm; @@ -52,3 +55,46 @@ bool TargetSubtargetInfo::enablePostRAScheduler() const {  bool TargetSubtargetInfo::useAA() const {    return false;  } + +static std::string createSchedInfoStr(unsigned Latency, +                                     Optional<double> RThroughput) { +  static const char *SchedPrefix = " sched: ["; +  std::string Comment; +  raw_string_ostream CS(Comment); +  if (Latency > 0 && RThroughput.hasValue()) +    CS << SchedPrefix << Latency << format(":%2.2f", RThroughput.getValue()) +       << "]"; +  else if (Latency > 0) +    CS << SchedPrefix << Latency << ":?]"; +  else if (RThroughput.hasValue()) +    CS << SchedPrefix << "?:" << RThroughput.getValue() << "]"; +  CS.flush(); +  return Comment; +} + +/// Returns string representation of scheduler comment +std::string TargetSubtargetInfo::getSchedInfoStr(const MachineInstr &MI) const { +  if (MI.isPseudo() || MI.isTerminator()) +    return std::string(); +  // We don't cache TSchedModel because it depends on TargetInstrInfo +  // that could be changed during the compilation +  TargetSchedModel TSchedModel; +  TSchedModel.init(getSchedModel(), this, getInstrInfo()); +  unsigned Latency = TSchedModel.computeInstrLatency(&MI); +  Optional<double> RThroughput = TSchedModel.computeInstrRThroughput(&MI); +  return createSchedInfoStr(Latency, RThroughput); +} + +/// Returns string representation of scheduler comment +std::string TargetSubtargetInfo::getSchedInfoStr(MCInst const &MCI) const { +  // We don't cache TSchedModel because it depends on TargetInstrInfo +  // that could be changed during the compilation +  TargetSchedModel TSchedModel; +  TSchedModel.init(getSchedModel(), this, getInstrInfo()); +  if (!TSchedModel.hasInstrSchedModel()) +    return std::string(); +  unsigned Latency = TSchedModel.computeInstrLatency(MCI.getOpcode()); +  Optional<double> RThroughput = +      TSchedModel.computeInstrRThroughput(MCI.getOpcode()); +  return createSchedInfoStr(Latency, RThroughput); +}  | 
