[llvm-commits] CVS: llvm/include/llvm/CodeGen/ScheduleDAG.h SelectionDAGISel.h

Chris Lattner lattner at cs.uiuc.edu
Sun Mar 5 16:20:41 PST 2006



Changes in directory llvm/include/llvm/CodeGen:

ScheduleDAG.h updated: 1.13 -> 1.14
SelectionDAGISel.h updated: 1.9 -> 1.10
---
Log message:

Hoist the HazardRecognizer out of the ScheduleDAGList.cpp file to where
targets can implement them.  Make the top-down scheduler non-g5-specific.


---
Diffs of the changes:  (+57 -6)

 ScheduleDAG.h      |   58 +++++++++++++++++++++++++++++++++++++++++++++++------
 SelectionDAGISel.h |    5 ++++
 2 files changed, 57 insertions(+), 6 deletions(-)


Index: llvm/include/llvm/CodeGen/ScheduleDAG.h
diff -u llvm/include/llvm/CodeGen/ScheduleDAG.h:1.13 llvm/include/llvm/CodeGen/ScheduleDAG.h:1.14
--- llvm/include/llvm/CodeGen/ScheduleDAG.h:1.13	Sun Mar  5 17:50:42 2006
+++ llvm/include/llvm/CodeGen/ScheduleDAG.h	Sun Mar  5 18:20:29 2006
@@ -41,7 +41,53 @@
     simpleScheduling,       // Two pass, min. critical path, max. utilization.
     simpleNoItinScheduling, // Same as above exact using generic latency.
     listSchedulingBURR,     // Bottom up reg reduction list scheduling.
-    listSchedulingG5        // G5-specific scheduler. FIXME: parameterize better
+    listSchedulingTD        // Top-down list scheduler.
+  };
+  
+  /// HazardRecognizer - This determines whether or not an instruction can be
+  /// issued this cycle, and whether or not a noop needs to be inserted to handle
+  /// the hazard.
+  class HazardRecognizer {
+  public:
+    virtual ~HazardRecognizer();
+    
+    enum HazardType {
+      NoHazard,      // This instruction can be emitted at this cycle.
+      Hazard,        // This instruction can't be emitted at this cycle.
+      NoopHazard,    // This instruction can't be emitted, and needs noops.
+    };
+    
+    /// StartBasicBlock - This is called when a new basic block is started.
+    ///
+    virtual void StartBasicBlock() {}
+    
+    /// getHazardType - Return the hazard type of emitting this node.  There are
+    /// three possible results.  Either:
+    ///  * NoHazard: it is legal to issue this instruction on this cycle.
+    ///  * Hazard: issuing this instruction would stall the machine.  If some
+    ///     other instruction is available, issue it first.
+    ///  * NoopHazard: issuing this instruction would break the program.  If
+    ///     some other instruction can be issued, do so, otherwise issue a noop.
+    virtual HazardType getHazardType(SDNode *Node) {
+      return NoHazard;
+    }
+    
+    /// EmitInstruction - This callback is invoked when an instruction is
+    /// emitted, to advance the hazard state.
+    virtual void EmitInstruction(SDNode *Node) {
+    }
+    
+    /// AdvanceCycle - This callback is invoked when no instructions can be
+    /// issued on this cycle without a hazard.  This should increment the
+    /// internal state of the hazard recognizer so that previously "Hazard"
+    /// instructions will now not be hazards.
+    virtual void AdvanceCycle() {
+    }
+    
+    /// EmitNoop - This callback is invoked when a noop was added to the
+    /// instruction stream.
+    virtual void EmitNoop() {
+    }
   };
 
   //===--------------------------------------------------------------------===//
@@ -363,11 +409,11 @@
   ScheduleDAG* createBURRListDAGScheduler(SelectionDAG &DAG,
                                           MachineBasicBlock *BB);
   
-  /// createTDG5ListDAGScheduler - This creates a top-down list scheduler for
-  /// the PowerPC G5.  FIXME: pull the priority function out into the PPC
-  /// backend!
-  ScheduleDAG* createTDG5ListDAGScheduler(SelectionDAG &DAG,
-                                          MachineBasicBlock *BB);
+  /// createTDListDAGScheduler - This creates a top-down list scheduler with
+  /// the specified hazard recognizer.
+  ScheduleDAG* createTDListDAGScheduler(SelectionDAG &DAG,
+                                        MachineBasicBlock *BB,
+                                        HazardRecognizer &HR);
 }
 
 #endif


Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h
diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.9 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.10
--- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.9	Thu Feb 23 20:12:52 2006
+++ llvm/include/llvm/CodeGen/SelectionDAGISel.h	Sun Mar  5 18:20:29 2006
@@ -28,6 +28,7 @@
   class MachineInstr;
   class TargetLowering;
   class FunctionLoweringInfo;
+  class HazardRecognizer;
 
 /// SelectionDAGISel - This is the common base class used for SelectionDAG-based
 /// pattern-matching instruction selectors.
@@ -61,6 +62,10 @@
     return true;
   }
   
+  /// GetTargetHazardRecognizer - Return the hazard recognizer to use for this
+  /// target when scheduling the DAG.
+  virtual HazardRecognizer &GetTargetHazardRecognizer();
+  
 protected:
   /// Pick a safe ordering and emit instructions for each target node in the
   /// graph.






More information about the llvm-commits mailing list