| Dan Gohman | 84fbac5 | 2009-02-06 17:22:58 +0000 | [diff] [blame] | 1 | //===---- ScheduleDAGSDNodes.h - SDNode Scheduling --------------*- C++ -*-===// | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 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 |  | 
| Dan Gohman | 84fbac5 | 2009-02-06 17:22:58 +0000 | [diff] [blame] | 15 | #ifndef SCHEDULEDAGSDNODES_H | 
 | 16 | #define SCHEDULEDAGSDNODES_H | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 17 |  | 
 | 18 | #include "llvm/CodeGen/ScheduleDAG.h" | 
 | 19 | #include "llvm/CodeGen/SelectionDAG.h" | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 20 |  | 
 | 21 | namespace llvm { | 
| Dan Gohman | 983bbba | 2008-12-22 21:06:20 +0000 | [diff] [blame] | 22 |   /// ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs. | 
 | 23 |   ///  | 
 | 24 |   /// Edges between SUnits are initially based on edges in the SelectionDAG, | 
 | 25 |   /// and additional edges can be added by the schedulers as heuristics. | 
 | 26 |   /// SDNodes such as Constants, Registers, and a few others that are not | 
 | 27 |   /// interesting to schedulers are not allocated SUnits. | 
 | 28 |   /// | 
 | 29 |   /// SDNodes with MVT::Flag operands are grouped along with the flagged | 
 | 30 |   /// nodes into a single SUnit so that they are scheduled together. | 
 | 31 |   /// | 
 | 32 |   /// SDNode-based scheduling graphs do not use SDep::Anti or SDep::Output | 
 | 33 |   /// edges.  Physical register dependence information is not carried in | 
 | 34 |   /// the DAG and must be handled explicitly by schedulers. | 
 | 35 |   /// | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 36 |   class ScheduleDAGSDNodes : public ScheduleDAG { | 
 | 37 |   public: | 
| Dan Gohman | 47ac0f0 | 2009-02-11 04:27:20 +0000 | [diff] [blame] | 38 |     SelectionDAG *DAG;                    // DAG of the current basic block | 
 | 39 |  | 
| Dan Gohman | 79ce276 | 2009-01-15 19:20:50 +0000 | [diff] [blame] | 40 |     explicit ScheduleDAGSDNodes(MachineFunction &mf); | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 41 |  | 
 | 42 |     virtual ~ScheduleDAGSDNodes() {} | 
 | 43 |  | 
| Dan Gohman | 47ac0f0 | 2009-02-11 04:27:20 +0000 | [diff] [blame] | 44 |     /// Run - perform scheduling. | 
 | 45 |     /// | 
 | 46 |     void Run(SelectionDAG *dag, MachineBasicBlock *bb, | 
 | 47 |              MachineBasicBlock::iterator insertPos); | 
 | 48 |  | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 49 |     /// isPassiveNode - Return true if the node is a non-scheduled leaf. | 
 | 50 |     /// | 
 | 51 |     static bool isPassiveNode(SDNode *Node) { | 
 | 52 |       if (isa<ConstantSDNode>(Node))       return true; | 
 | 53 |       if (isa<ConstantFPSDNode>(Node))     return true; | 
 | 54 |       if (isa<RegisterSDNode>(Node))       return true; | 
 | 55 |       if (isa<GlobalAddressSDNode>(Node))  return true; | 
 | 56 |       if (isa<BasicBlockSDNode>(Node))     return true; | 
 | 57 |       if (isa<FrameIndexSDNode>(Node))     return true; | 
 | 58 |       if (isa<ConstantPoolSDNode>(Node))   return true; | 
 | 59 |       if (isa<JumpTableSDNode>(Node))      return true; | 
 | 60 |       if (isa<ExternalSymbolSDNode>(Node)) return true; | 
| Dan Gohman | 8c2b525 | 2009-10-30 01:27:03 +0000 | [diff] [blame] | 61 |       if (isa<BlockAddressSDNode>(Node))   return true; | 
| Chris Lattner | decc267 | 2010-04-07 05:20:54 +0000 | [diff] [blame] | 62 |       if (Node->getOpcode() == ISD::EntryToken || | 
 | 63 |           isa<MDNodeSDNode>(Node)) return true; | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 64 |       return false; | 
 | 65 |     } | 
 | 66 |  | 
 | 67 |     /// NewSUnit - Creates a new SUnit and return a ptr to it. | 
 | 68 |     /// | 
| Evan Cheng | 1cc3984 | 2010-05-20 23:26:43 +0000 | [diff] [blame] | 69 |     SUnit *NewSUnit(SDNode *N); | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 70 |  | 
 | 71 |     /// Clone - Creates a clone of the specified SUnit. It does not copy the | 
 | 72 |     /// predecessors / successors info nor the temporary scheduling states. | 
 | 73 |     /// | 
 | 74 |     SUnit *Clone(SUnit *N); | 
 | 75 |      | 
| Dan Gohman | c9a5b9e | 2008-12-23 18:36:58 +0000 | [diff] [blame] | 76 |     /// BuildSchedGraph - Build the SUnit graph from the selection dag that we | 
 | 77 |     /// are input.  This SUnit graph is similar to the SelectionDAG, but | 
 | 78 |     /// excludes nodes that aren't interesting to scheduling, and represents | 
 | 79 |     /// flagged together nodes with a single SUnit. | 
| Dan Gohman | 98976e4 | 2009-10-09 23:33:48 +0000 | [diff] [blame] | 80 |     virtual void BuildSchedGraph(AliasAnalysis *AA); | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 81 |  | 
 | 82 |     /// ComputeLatency - Compute node latency. | 
 | 83 |     /// | 
 | 84 |     virtual void ComputeLatency(SUnit *SU); | 
 | 85 |  | 
| Evan Cheng | 15a16de | 2010-05-20 06:13:19 +0000 | [diff] [blame] | 86 |     /// ComputeOperandLatency - Override dependence edge latency using | 
 | 87 |     /// operand use/def information | 
 | 88 |     /// | 
 | 89 |     virtual void ComputeOperandLatency(SUnit *Def, SUnit *Use, | 
 | 90 |                                        SDep& dep) const { } | 
 | 91 |  | 
 | 92 |     virtual void ComputeOperandLatency(SDNode *Def, SDNode *Use, | 
 | 93 |                                        unsigned OpIdx, SDep& dep) const; | 
 | 94 |  | 
| Dan Gohman | af1d8ca | 2010-05-01 00:01:06 +0000 | [diff] [blame] | 95 |     virtual MachineBasicBlock *EmitSchedule(); | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 96 |  | 
 | 97 |     /// Schedule - Order nodes according to selected style, filling | 
 | 98 |     /// in the Sequence member. | 
 | 99 |     /// | 
 | 100 |     virtual void Schedule() = 0; | 
 | 101 |  | 
 | 102 |     virtual void dumpNode(const SUnit *SU) const; | 
 | 103 |  | 
 | 104 |     virtual std::string getGraphNodeLabel(const SUnit *SU) const; | 
 | 105 |  | 
 | 106 |     virtual void getCustomGraphFeatures(GraphWriter<ScheduleDAG*> &GW) const; | 
 | 107 |  | 
 | 108 |   private: | 
| Evan Cheng | c589e03 | 2010-01-22 03:36:51 +0000 | [diff] [blame] | 109 |     /// ClusterNeighboringLoads - Cluster loads from "near" addresses into | 
 | 110 |     /// combined SUnits. | 
| Evan Cheng | 302ef83 | 2010-06-10 02:09:31 +0000 | [diff] [blame^] | 111 |     void ClusterNeighboringLoads(SDNode *Node); | 
 | 112 |     /// ClusterNodes - Cluster certain nodes which should be scheduled together. | 
 | 113 |     /// | 
 | 114 |     void ClusterNodes(); | 
| Evan Cheng | c589e03 | 2010-01-22 03:36:51 +0000 | [diff] [blame] | 115 |  | 
| Dan Gohman | c9a5b9e | 2008-12-23 18:36:58 +0000 | [diff] [blame] | 116 |     /// BuildSchedUnits, AddSchedEdges - Helper functions for BuildSchedGraph. | 
 | 117 |     void BuildSchedUnits(); | 
 | 118 |     void AddSchedEdges(); | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 119 |   }; | 
| Dan Gohman | 343f0c0 | 2008-11-19 23:18:57 +0000 | [diff] [blame] | 120 | } | 
 | 121 |  | 
 | 122 | #endif |