Post RA scheduler changes. Introduce a hazard recognizer that uses the target schedul...
[oota-llvm.git] / include / llvm / CodeGen / ScheduleHazardRecognizer.h
1 //=- llvm/CodeGen/ScheduleHazardRecognizer.h - Scheduling Support -*- 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 ScheduleHazardRecognizer class, which implements
11 // hazard-avoidance heuristics for scheduling.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CODEGEN_SCHEDULEHAZARDRECOGNIZER_H
16 #define LLVM_CODEGEN_SCHEDULEHAZARDRECOGNIZER_H
17
18 namespace llvm {
19
20 class SUnit;
21
22 /// HazardRecognizer - This determines whether or not an instruction can be
23 /// issued this cycle, and whether or not a noop needs to be inserted to handle
24 /// the hazard.
25 class ScheduleHazardRecognizer {
26 public:
27   virtual ~ScheduleHazardRecognizer();
28
29   enum HazardType {
30     NoHazard,      // This instruction can be emitted at this cycle.
31     Hazard,        // This instruction can't be emitted at this cycle.
32     NoopHazard     // This instruction can't be emitted, and needs noops.
33   };
34
35   /// getHazardType - Return the hazard type of emitting this node.  There are
36   /// three possible results.  Either:
37   ///  * NoHazard: it is legal to issue this instruction on this cycle.
38   ///  * Hazard: issuing this instruction would stall the machine.  If some
39   ///     other instruction is available, issue it first.
40   ///  * NoopHazard: issuing this instruction would break the program.  If
41   ///     some other instruction can be issued, do so, otherwise issue a noop.
42   virtual HazardType getHazardType(SUnit *) {
43     return NoHazard;
44   }
45
46   /// Reset - This callback is invoked when a new block of
47   /// instructions is about to be schedule. The hazard state should be
48   /// set to an initialized state.
49   virtual void Reset() {}
50
51   /// EmitInstruction - This callback is invoked when an instruction is
52   /// emitted, to advance the hazard state.
53   virtual void EmitInstruction(SUnit *) {}
54
55   /// AdvanceCycle - This callback is invoked when no instructions can be
56   /// issued on this cycle without a hazard.  This should increment the
57   /// internal state of the hazard recognizer so that previously "Hazard"
58   /// instructions will now not be hazards.
59   virtual void AdvanceCycle() {}
60
61   /// EmitNoop - This callback is invoked when a noop was added to the
62   /// instruction stream.
63   virtual void EmitNoop() {
64     // Default implementation: count it as a cycle.
65     AdvanceCycle();
66   }
67 };
68
69 }
70
71 #endif