summaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/ScheduleDAG.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-03-06 00:20:29 +0000
committerChris Lattner <sabre@nondot.org>2006-03-06 00:20:29 +0000
commit37e30cf736f9975704f4994d4181fe65ebb7b76c (patch)
treebad8e85ae3d9de61fbdd13de800900d6acf9a9e5 /include/llvm/CodeGen/ScheduleDAG.h
parent67727308fa1fbcc5090e1da657bd2bb93c6d0858 (diff)
downloadllvm-37e30cf736f9975704f4994d4181fe65ebb7b76c.tar.gz
llvm-37e30cf736f9975704f4994d4181fe65ebb7b76c.tar.bz2
llvm-37e30cf736f9975704f4994d4181fe65ebb7b76c.tar.xz
Hoist the HazardRecognizer out of the ScheduleDAGList.cpp file to where
targets can implement them. Make the top-down scheduler non-g5-specific. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26568 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/ScheduleDAG.h')
-rw-r--r--include/llvm/CodeGen/ScheduleDAG.h58
1 files changed, 52 insertions, 6 deletions
diff --git a/include/llvm/CodeGen/ScheduleDAG.h b/include/llvm/CodeGen/ScheduleDAG.h
index dee706def2..a506b82dae 100644
--- a/include/llvm/CodeGen/ScheduleDAG.h
+++ b/include/llvm/CodeGen/ScheduleDAG.h
@@ -41,7 +41,53 @@ namespace llvm {
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 @@ namespace llvm {
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