LCOV - code coverage report
Current view: top level - lib/CodeGen/SelectionDAG - ScheduleDAGSDNodes.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 10 17 58.8 %
Date: 2018-10-20 13:21:21 Functions: 2 8 25.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===---- ScheduleDAGSDNodes.h - SDNode Scheduling --------------*- 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 implements the ScheduleDAGSDNodes class, which implements
      11             : // scheduling for an SDNode-based dependency graph.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_SCHEDULEDAGSDNODES_H
      16             : #define LLVM_LIB_CODEGEN_SELECTIONDAG_SCHEDULEDAGSDNODES_H
      17             : 
      18             : #include "llvm/CodeGen/ISDOpcodes.h"
      19             : #include "llvm/CodeGen/MachineBasicBlock.h"
      20             : #include "llvm/CodeGen/ScheduleDAG.h"
      21             : #include "llvm/CodeGen/SelectionDAGNodes.h"
      22             : #include "llvm/Support/Casting.h"
      23             : #include "llvm/Support/MachineValueType.h"
      24             : #include <cassert>
      25             : #include <string>
      26             : #include <vector>
      27             : 
      28             : namespace llvm {
      29             : 
      30             : class InstrItineraryData;
      31             : 
      32             :   /// ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
      33             :   ///
      34             :   /// Edges between SUnits are initially based on edges in the SelectionDAG,
      35             :   /// and additional edges can be added by the schedulers as heuristics.
      36             :   /// SDNodes such as Constants, Registers, and a few others that are not
      37             :   /// interesting to schedulers are not allocated SUnits.
      38             :   ///
      39             :   /// SDNodes with MVT::Glue operands are grouped along with the flagged
      40             :   /// nodes into a single SUnit so that they are scheduled together.
      41             :   ///
      42             :   /// SDNode-based scheduling graphs do not use SDep::Anti or SDep::Output
      43             :   /// edges.  Physical register dependence information is not carried in
      44             :   /// the DAG and must be handled explicitly by schedulers.
      45             :   ///
      46             :   class ScheduleDAGSDNodes : public ScheduleDAG {
      47             :   public:
      48             :     MachineBasicBlock *BB;
      49             :     SelectionDAG *DAG;                    // DAG of the current basic block
      50             :     const InstrItineraryData *InstrItins;
      51             : 
      52             :     /// The schedule. Null SUnit*'s represent noop instructions.
      53             :     std::vector<SUnit*> Sequence;
      54             : 
      55             :     explicit ScheduleDAGSDNodes(MachineFunction &mf);
      56             : 
      57     2534105 :     ~ScheduleDAGSDNodes() override = default;
      58             : 
      59             :     /// Run - perform scheduling.
      60             :     ///
      61             :     void Run(SelectionDAG *dag, MachineBasicBlock *bb);
      62             : 
      63             :     /// isPassiveNode - Return true if the node is a non-scheduled leaf.
      64             :     ///
      65   119037116 :     static bool isPassiveNode(SDNode *Node) {
      66             :       if (isa<ConstantSDNode>(Node))       return true;
      67             :       if (isa<ConstantFPSDNode>(Node))     return true;
      68    95792418 :       if (isa<RegisterSDNode>(Node))       return true;
      69    69086635 :       if (isa<RegisterMaskSDNode>(Node))   return true;
      70             :       if (isa<GlobalAddressSDNode>(Node))  return true;
      71    63913948 :       if (isa<BasicBlockSDNode>(Node))     return true;
      72             :       if (isa<FrameIndexSDNode>(Node))     return true;
      73             :       if (isa<ConstantPoolSDNode>(Node))   return true;
      74    55760008 :       if (isa<TargetIndexSDNode>(Node))    return true;
      75             :       if (isa<JumpTableSDNode>(Node))      return true;
      76             :       if (isa<ExternalSymbolSDNode>(Node)) return true;
      77    55696630 :       if (isa<MCSymbolSDNode>(Node))       return true;
      78             :       if (isa<BlockAddressSDNode>(Node))   return true;
      79    55695960 :       if (Node->getOpcode() == ISD::EntryToken ||
      80     5418868 :           isa<MDNodeSDNode>(Node)) return true;
      81             :       return false;
      82             :     }
      83             : 
      84             :     /// NewSUnit - Creates a new SUnit and return a ptr to it.
      85             :     ///
      86             :     SUnit *newSUnit(SDNode *N);
      87             : 
      88             :     /// Clone - Creates a clone of the specified SUnit. It does not copy the
      89             :     /// predecessors / successors info nor the temporary scheduling states.
      90             :     ///
      91             :     SUnit *Clone(SUnit *Old);
      92             : 
      93             :     /// BuildSchedGraph - Build the SUnit graph from the selection dag that we
      94             :     /// are input.  This SUnit graph is similar to the SelectionDAG, but
      95             :     /// excludes nodes that aren't interesting to scheduling, and represents
      96             :     /// flagged together nodes with a single SUnit.
      97             :     void BuildSchedGraph(AliasAnalysis *AA);
      98             : 
      99             :     /// InitNumRegDefsLeft - Determine the # of regs defined by this node.
     100             :     ///
     101             :     void InitNumRegDefsLeft(SUnit *SU);
     102             : 
     103             :     /// computeLatency - Compute node latency.
     104             :     ///
     105             :     virtual void computeLatency(SUnit *SU);
     106             : 
     107             :     virtual void computeOperandLatency(SDNode *Def, SDNode *Use,
     108             :                                        unsigned OpIdx, SDep& dep) const;
     109             : 
     110             :     /// Schedule - Order nodes according to selected style, filling
     111             :     /// in the Sequence member.
     112             :     ///
     113             :     virtual void Schedule() = 0;
     114             : 
     115             :     /// VerifyScheduledSequence - Verify that all SUnits are scheduled and
     116             :     /// consistent with the Sequence of scheduled instructions.
     117             :     void VerifyScheduledSequence(bool isBottomUp);
     118             : 
     119             :     /// EmitSchedule - Insert MachineInstrs into the MachineBasicBlock
     120             :     /// according to the order specified in Sequence.
     121             :     ///
     122             :     virtual MachineBasicBlock*
     123             :     EmitSchedule(MachineBasicBlock::iterator &InsertPos);
     124             : 
     125             :     void dumpNode(const SUnit &SU) const override;
     126             :     void dump() const override;
     127             :     void dumpSchedule() const;
     128             : 
     129             :     std::string getGraphNodeLabel(const SUnit *SU) const override;
     130             : 
     131             :     std::string getDAGName() const override;
     132             : 
     133             :     virtual void getCustomGraphFeatures(GraphWriter<ScheduleDAG*> &GW) const;
     134             : 
     135             :     /// RegDefIter - In place iteration over the values defined by an
     136             :     /// SUnit. This does not need copies of the iterator or any other STLisms.
     137             :     /// The iterator creates itself, rather than being provided by the SchedDAG.
     138             :     class RegDefIter {
     139             :       const ScheduleDAGSDNodes *SchedDAG;
     140             :       const SDNode *Node;
     141             :       unsigned DefIdx;
     142             :       unsigned NodeNumDefs;
     143             :       MVT ValueType;
     144             : 
     145             :     public:
     146             :       RegDefIter(const SUnit *SU, const ScheduleDAGSDNodes *SD);
     147             : 
     148           0 :       bool IsValid() const { return Node != nullptr; }
     149             : 
     150           0 :       MVT GetValue() const {
     151             :         assert(IsValid() && "bad iterator");
     152           0 :         return ValueType;
     153             :       }
     154             : 
     155           0 :       const SDNode *GetNode() const {
     156           0 :         return Node;
     157             :       }
     158             : 
     159           0 :       unsigned GetIdx() const {
     160        1555 :         return DefIdx-1;
     161             :       }
     162             : 
     163             :       void Advance();
     164             : 
     165             :     private:
     166             :       void InitNodeNumDefs();
     167             :     };
     168             : 
     169             :   protected:
     170             :     /// ForceUnitLatencies - Return true if all scheduling edges should be given
     171             :     /// a latency value of one.  The default is to return false; schedulers may
     172             :     /// override this as needed.
     173           0 :     virtual bool forceUnitLatencies() const { return false; }
     174             : 
     175             :   private:
     176             :     /// ClusterNeighboringLoads - Cluster loads from "near" addresses into
     177             :     /// combined SUnits.
     178             :     void ClusterNeighboringLoads(SDNode *Node);
     179             :     /// ClusterNodes - Cluster certain nodes which should be scheduled together.
     180             :     ///
     181             :     void ClusterNodes();
     182             : 
     183             :     /// BuildSchedUnits, AddSchedEdges - Helper functions for BuildSchedGraph.
     184             :     void BuildSchedUnits();
     185             :     void AddSchedEdges();
     186             : 
     187             :     void EmitPhysRegCopy(SUnit *SU, DenseMap<SUnit*, unsigned> &VRBaseMap,
     188             :                          MachineBasicBlock::iterator InsertPos);
     189             :   };
     190             : 
     191             : } // end namespace llvm
     192             : 
     193             : #endif // LLVM_LIB_CODEGEN_SELECTIONDAG_SCHEDULEDAGSDNODES_H

Generated by: LCOV version 1.13