| //===- TargetSubtargetInfo.cpp - General Target Information ----------------==// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| /// \file This file describes the general parts of a Subtarget. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/CodeGen/TargetSubtargetInfo.h" |
| #include "llvm/ADT/Optional.h" |
| #include "llvm/CodeGen/MachineInstr.h" |
| #include "llvm/CodeGen/TargetInstrInfo.h" |
| #include "llvm/CodeGen/TargetSchedule.h" |
| #include "llvm/MC/MCInst.h" |
| #include "llvm/Support/Format.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <string> |
| |
| using namespace llvm; |
| |
| TargetSubtargetInfo::TargetSubtargetInfo( |
| const Triple &TT, StringRef CPU, StringRef FS, |
| ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetFeatureKV> PD, |
| const SubtargetInfoKV *ProcSched, const MCWriteProcResEntry *WPR, |
| const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA, |
| const InstrStage *IS, const unsigned *OC, const unsigned *FP) |
| : MCSubtargetInfo(TT, CPU, FS, PF, PD, ProcSched, WPR, WL, RA, IS, OC, FP) { |
| } |
| |
| TargetSubtargetInfo::~TargetSubtargetInfo() = default; |
| |
| bool TargetSubtargetInfo::enableAtomicExpand() const { |
| return true; |
| } |
| |
| bool TargetSubtargetInfo::enableIndirectBrExpand() const { |
| return false; |
| } |
| |
| bool TargetSubtargetInfo::enableMachineScheduler() const { |
| return false; |
| } |
| |
| bool TargetSubtargetInfo::enableJoinGlobalCopies() const { |
| return enableMachineScheduler(); |
| } |
| |
| bool TargetSubtargetInfo::enableRALocalReassignment( |
| CodeGenOpt::Level OptLevel) const { |
| return true; |
| } |
| |
| bool TargetSubtargetInfo::enableAdvancedRASplitCost() const { |
| return false; |
| } |
| |
| bool TargetSubtargetInfo::enablePostRAScheduler() const { |
| return getSchedModel().PostRAScheduler; |
| } |
| |
| bool TargetSubtargetInfo::useAA() const { |
| return false; |
| } |
| |
| static std::string createSchedInfoStr(unsigned Latency, double RThroughput) { |
| static const char *SchedPrefix = " sched: ["; |
| std::string Comment; |
| raw_string_ostream CS(Comment); |
| if (RThroughput != 0.0) |
| CS << SchedPrefix << Latency << format(":%2.2f", RThroughput) |
| << "]"; |
| else |
| CS << SchedPrefix << Latency << ":?]"; |
| 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(this); |
| unsigned Latency = TSchedModel.computeInstrLatency(&MI); |
| double RThroughput = TSchedModel.computeReciprocalThroughput(&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(this); |
| unsigned Latency; |
| if (TSchedModel.hasInstrSchedModel()) |
| Latency = TSchedModel.computeInstrLatency(MCI); |
| else if (TSchedModel.hasInstrItineraries()) { |
| auto *ItinData = TSchedModel.getInstrItineraries(); |
| Latency = ItinData->getStageLatency( |
| getInstrInfo()->get(MCI.getOpcode()).getSchedClass()); |
| } else |
| return std::string(); |
| double RThroughput = TSchedModel.computeReciprocalThroughput(MCI); |
| return createSchedInfoStr(Latency, RThroughput); |
| } |
| |
| void TargetSubtargetInfo::mirFileLoaded(MachineFunction &MF) const { |
| } |