LCOV - code coverage report
Current view: top level - include/llvm/CodeGen - TargetSubtargetInfo.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 22 45 48.9 %
Date: 2018-10-20 13:21:21 Functions: 15 31 48.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- llvm/CodeGen/TargetSubtargetInfo.h - Target Information --*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file describes the subtarget options of a Target machine.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #ifndef LLVM_CODEGEN_TARGETSUBTARGETINFO_H
      15             : #define LLVM_CODEGEN_TARGETSUBTARGETINFO_H
      16             : 
      17             : #include "llvm/ADT/APInt.h"
      18             : #include "llvm/ADT/ArrayRef.h"
      19             : #include "llvm/ADT/SmallVector.h"
      20             : #include "llvm/ADT/StringRef.h"
      21             : #include "llvm/CodeGen/PBQPRAConstraint.h"
      22             : #include "llvm/CodeGen/ScheduleDAGMutation.h"
      23             : #include "llvm/CodeGen/SchedulerRegistry.h"
      24             : #include "llvm/MC/MCSubtargetInfo.h"
      25             : #include "llvm/Support/CodeGen.h"
      26             : #include <memory>
      27             : #include <vector>
      28             : 
      29             : 
      30             : namespace llvm {
      31             : 
      32             : class CallLowering;
      33             : class InstrItineraryData;
      34             : struct InstrStage;
      35             : class InstructionSelector;
      36             : class LegalizerInfo;
      37             : class MachineInstr;
      38             : struct MachineSchedPolicy;
      39             : struct MCReadAdvanceEntry;
      40             : struct MCWriteLatencyEntry;
      41             : struct MCWriteProcResEntry;
      42             : class RegisterBankInfo;
      43             : class SDep;
      44             : class SelectionDAGTargetInfo;
      45             : struct SubtargetFeatureKV;
      46             : struct SubtargetInfoKV;
      47             : class SUnit;
      48             : class TargetFrameLowering;
      49             : class TargetInstrInfo;
      50             : class TargetLowering;
      51             : class TargetRegisterClass;
      52             : class TargetRegisterInfo;
      53             : class TargetSchedModel;
      54             : class Triple;
      55             : 
      56             : //===----------------------------------------------------------------------===//
      57             : ///
      58             : /// TargetSubtargetInfo - Generic base class for all target subtargets.  All
      59             : /// Target-specific options that control code generation and printing should
      60             : /// be exposed through a TargetSubtargetInfo-derived class.
      61             : ///
      62       37411 : class TargetSubtargetInfo : public MCSubtargetInfo {
      63             : protected: // Can only create subclasses...
      64             :   TargetSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS,
      65             :                       ArrayRef<SubtargetFeatureKV> PF,
      66             :                       ArrayRef<SubtargetFeatureKV> PD,
      67             :                       const SubtargetInfoKV *ProcSched,
      68             :                       const MCWriteProcResEntry *WPR,
      69             :                       const MCWriteLatencyEntry *WL,
      70             :                       const MCReadAdvanceEntry *RA, const InstrStage *IS,
      71             :                       const unsigned *OC, const unsigned *FP);
      72             : 
      73             : public:
      74             :   // AntiDepBreakMode - Type of anti-dependence breaking that should
      75             :   // be performed before post-RA scheduling.
      76             :   using AntiDepBreakMode = enum { ANTIDEP_NONE, ANTIDEP_CRITICAL, ANTIDEP_ALL };
      77             :   using RegClassVector = SmallVectorImpl<const TargetRegisterClass *>;
      78             : 
      79             :   TargetSubtargetInfo() = delete;
      80             :   TargetSubtargetInfo(const TargetSubtargetInfo &) = delete;
      81             :   TargetSubtargetInfo &operator=(const TargetSubtargetInfo &) = delete;
      82             :   ~TargetSubtargetInfo() override;
      83             : 
      84           0 :   virtual bool isXRaySupported() const { return false; }
      85             : 
      86             :   // Interfaces to the major aspects of target machine information:
      87             :   //
      88             :   // -- Instruction opcode and operand information
      89             :   // -- Pipelines and scheduling information
      90             :   // -- Stack frame information
      91             :   // -- Selection DAG lowering information
      92             :   // -- Call lowering information
      93             :   //
      94             :   // N.B. These objects may change during compilation. It's not safe to cache
      95             :   // them between functions.
      96           0 :   virtual const TargetInstrInfo *getInstrInfo() const { return nullptr; }
      97           0 :   virtual const TargetFrameLowering *getFrameLowering() const {
      98           0 :     return nullptr;
      99             :   }
     100           0 :   virtual const TargetLowering *getTargetLowering() const { return nullptr; }
     101           0 :   virtual const SelectionDAGTargetInfo *getSelectionDAGInfo() const {
     102           0 :     return nullptr;
     103             :   }
     104           0 :   virtual const CallLowering *getCallLowering() const { return nullptr; }
     105             : 
     106             :   // FIXME: This lets targets specialize the selector by subtarget (which lets
     107             :   // us do things like a dedicated avx512 selector).  However, we might want
     108             :   // to also specialize selectors by MachineFunction, which would let us be
     109             :   // aware of optsize/optnone and such.
     110           0 :   virtual const InstructionSelector *getInstructionSelector() const {
     111           0 :     return nullptr;
     112             :   }
     113             : 
     114           0 :   virtual unsigned getHwMode() const { return 0; }
     115             : 
     116             :   /// Target can subclass this hook to select a different DAG scheduler.
     117             :   virtual RegisterScheduler::FunctionPassCtor
     118     1267027 :       getDAGScheduler(CodeGenOpt::Level) const {
     119     1267027 :     return nullptr;
     120             :   }
     121             : 
     122           0 :   virtual const LegalizerInfo *getLegalizerInfo() const { return nullptr; }
     123             : 
     124             :   /// getRegisterInfo - If register information is available, return it.  If
     125             :   /// not, return null.
     126           3 :   virtual const TargetRegisterInfo *getRegisterInfo() const { return nullptr; }
     127             : 
     128             :   /// If the information for the register banks is available, return it.
     129             :   /// Otherwise return nullptr.
     130         427 :   virtual const RegisterBankInfo *getRegBankInfo() const { return nullptr; }
     131             : 
     132             :   /// getInstrItineraryData - Returns instruction itinerary data for the target
     133             :   /// or specific subtarget.
     134     1541449 :   virtual const InstrItineraryData *getInstrItineraryData() const {
     135     1541449 :     return nullptr;
     136             :   }
     137             : 
     138             :   /// Resolve a SchedClass at runtime, where SchedClass identifies an
     139             :   /// MCSchedClassDesc with the isVariant property. This may return the ID of
     140             :   /// another variant SchedClass, but repeated invocation must quickly terminate
     141             :   /// in a nonvariant SchedClass.
     142           0 :   virtual unsigned resolveSchedClass(unsigned SchedClass,
     143             :                                      const MachineInstr *MI,
     144             :                                      const TargetSchedModel *SchedModel) const {
     145           0 :     return 0;
     146             :   }
     147             : 
     148             :   /// Returns true if MI is a dependency breaking zero-idiom instruction for the
     149             :   /// subtarget.
     150             :   ///
     151             :   /// This function also sets bits in Mask related to input operands that
     152             :   /// are not in a data dependency relationship.  There is one bit for each
     153             :   /// machine operand; implicit operands follow explicit operands in the bit
     154             :   /// representation used for Mask.  An empty (i.e. a mask with all bits
     155             :   /// cleared) means: data dependencies are "broken" for all the explicit input
     156             :   /// machine operands of MI.
     157           0 :   virtual bool isZeroIdiom(const MachineInstr *MI, APInt &Mask) const {
     158           0 :     return false;
     159             :   }
     160             : 
     161             :   /// Returns true if MI is a dependency breaking instruction for the subtarget.
     162             :   ///
     163             :   /// Similar in behavior to `isZeroIdiom`. However, it knows how to identify
     164             :   /// all dependency breaking instructions (i.e. not just zero-idioms).
     165             :   /// 
     166             :   /// As for `isZeroIdiom`, this method returns a mask of "broken" dependencies.
     167             :   /// (See method `isZeroIdiom` for a detailed description of Mask).
     168           0 :   virtual bool isDependencyBreaking(const MachineInstr *MI, APInt &Mask) const {
     169           0 :     return isZeroIdiom(MI, Mask);
     170             :   }
     171             : 
     172             :   /// Returns true if MI is a candidate for move elimination.
     173             :   ///
     174             :   /// A candidate for move elimination may be optimized out at register renaming
     175             :   /// stage. Subtargets can specify the set of optimizable moves by
     176             :   /// instantiating tablegen class `IsOptimizableRegisterMove` (see
     177             :   /// llvm/Target/TargetInstrPredicate.td).
     178             :   ///
     179             :   /// SubtargetEmitter is responsible for processing all the definitions of class
     180             :   /// IsOptimizableRegisterMove, and auto-generate an override for this method.
     181           0 :   virtual bool isOptimizableRegisterMove(const MachineInstr *MI) const {
     182           0 :     return false;
     183             :   }
     184             : 
     185             :   /// True if the subtarget should run MachineScheduler after aggressive
     186             :   /// coalescing.
     187             :   ///
     188             :   /// This currently replaces the SelectionDAG scheduler with the "source" order
     189             :   /// scheduler (though see below for an option to turn this off and use the
     190             :   /// TargetLowering preference). It does not yet disable the postRA scheduler.
     191             :   virtual bool enableMachineScheduler() const;
     192             : 
     193             :   /// Support printing of [latency:throughput] comment in output .S file.
     194       92162 :   virtual bool supportPrintSchedInfo() const { return false; }
     195             : 
     196             :   /// True if the machine scheduler should disable the TLI preference
     197             :   /// for preRA scheduling with the source level scheduler.
     198      378201 :   virtual bool enableMachineSchedDefaultSched() const { return true; }
     199             : 
     200             :   /// True if the subtarget should enable joining global copies.
     201             :   ///
     202             :   /// By default this is enabled if the machine scheduler is enabled, but
     203             :   /// can be overridden.
     204             :   virtual bool enableJoinGlobalCopies() const;
     205             : 
     206             :   /// True if the subtarget should run a scheduler after register allocation.
     207             :   ///
     208             :   /// By default this queries the PostRAScheduling bit in the scheduling model
     209             :   /// which is the preferred way to influence this.
     210             :   virtual bool enablePostRAScheduler() const;
     211             : 
     212             :   /// True if the subtarget should run the atomic expansion pass.
     213             :   virtual bool enableAtomicExpand() const;
     214             : 
     215             :   /// True if the subtarget should run the indirectbr expansion pass.
     216             :   virtual bool enableIndirectBrExpand() const;
     217             : 
     218             :   /// Override generic scheduling policy within a region.
     219             :   ///
     220             :   /// This is a convenient way for targets that don't provide any custom
     221             :   /// scheduling heuristics (no custom MachineSchedStrategy) to make
     222             :   /// changes to the generic scheduling policy.
     223      881800 :   virtual void overrideSchedPolicy(MachineSchedPolicy &Policy,
     224      881800 :                                    unsigned NumRegionInstrs) const {}
     225             : 
     226             :   // Perform target specific adjustments to the latency of a schedule
     227             :   // dependency.
     228     4215304 :   virtual void adjustSchedDependency(SUnit *def, SUnit *use, SDep &dep) const {}
     229             : 
     230             :   // For use with PostRAScheduling: get the anti-dependence breaking that should
     231             :   // be performed before post-RA scheduling.
     232       48659 :   virtual AntiDepBreakMode getAntiDepBreakMode() const { return ANTIDEP_NONE; }
     233             : 
     234             :   // For use with PostRAScheduling: in CriticalPathRCs, return any register
     235             :   // classes that should only be considered for anti-dependence breaking if they
     236             :   // are on the critical path.
     237      151256 :   virtual void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const {
     238      151256 :     return CriticalPathRCs.clear();
     239             :   }
     240             : 
     241             :   // Provide an ordered list of schedule DAG mutations for the post-RA
     242             :   // scheduler.
     243       18266 :   virtual void getPostRAMutations(
     244             :       std::vector<std::unique_ptr<ScheduleDAGMutation>> &Mutations) const {
     245       18266 :   }
     246             : 
     247             :   // Provide an ordered list of schedule DAG mutations for the machine
     248             :   // pipeliner.
     249           0 :   virtual void getSMSMutations(
     250             :       std::vector<std::unique_ptr<ScheduleDAGMutation>> &Mutations) const {
     251           0 :   }
     252             : 
     253             :   // For use with PostRAScheduling: get the minimum optimization level needed
     254             :   // to enable post-RA scheduling.
     255       37584 :   virtual CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const {
     256       37584 :     return CodeGenOpt::Default;
     257             :   }
     258             : 
     259             :   /// True if the subtarget should run the local reassignment
     260             :   /// heuristic of the register allocator.
     261             :   /// This heuristic may be compile time intensive, \p OptLevel provides
     262             :   /// a finer grain to tune the register allocator.
     263             :   virtual bool enableRALocalReassignment(CodeGenOpt::Level OptLevel) const;
     264             : 
     265             :   /// True if the subtarget should consider the cost of local intervals
     266             :   /// created by a split candidate when choosing the best split candidate. This
     267             :   /// heuristic may be compile time intensive.
     268             :   virtual bool enableAdvancedRASplitCost() const;
     269             : 
     270             :   /// Enable use of alias analysis during code generation (during MI
     271             :   /// scheduling, DAGCombine, etc.).
     272             :   virtual bool useAA() const;
     273             : 
     274             :   /// Enable the use of the early if conversion pass.
     275           0 :   virtual bool enableEarlyIfConversion() const { return false; }
     276             : 
     277             :   /// Return PBQPConstraint(s) for the target.
     278             :   ///
     279             :   /// Override to provide custom PBQP constraints.
     280           2 :   virtual std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const {
     281           2 :     return nullptr;
     282             :   }
     283             : 
     284             :   /// Enable tracking of subregister liveness in register allocator.
     285             :   /// Please use MachineRegisterInfo::subRegLivenessEnabled() instead where
     286             :   /// possible.
     287      366380 :   virtual bool enableSubRegLiveness() const { return false; }
     288             : 
     289             :   /// Returns string representation of scheduler comment
     290             :   std::string getSchedInfoStr(const MachineInstr &MI) const;
     291             :   std::string getSchedInfoStr(MCInst const &MCI) const override;
     292             : 
     293             :   /// This is called after a .mir file was loaded.
     294             :   virtual void mirFileLoaded(MachineFunction &MF) const;
     295             : };
     296             : 
     297             : } // end namespace llvm
     298             : 
     299             : #endif // LLVM_CODEGEN_TARGETSUBTARGETINFO_H

Generated by: LCOV version 1.13