misched interface: Expose the MachineScheduler pass.
[oota-llvm.git] / include / llvm / CodeGen / MachineScheduler.h
1 //==- MachineScheduler.h - MachineInstr Scheduling Pass ----------*- 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 provides a MachineSchedRegistry for registering alternative machine
11 // schedulers. A Target may provide an alternative scheduler implementation by
12 // implementing the following boilerplate:
13 //
14 // static ScheduleDAGInstrs *createCustomMachineSched(MachineSchedContext *C) {
15 //  return new CustomMachineScheduler(C);
16 // }
17 // static MachineSchedRegistry
18 // SchedDefaultRegistry("custom", "Run my target's custom scheduler",
19 //                      createCustomMachineSched);
20 //
21 //===----------------------------------------------------------------------===//
22
23 #ifndef MACHINESCHEDULER_H
24 #define MACHINESCHEDULER_H
25
26 #include "llvm/CodeGen/MachinePassRegistry.h"
27
28 namespace llvm {
29
30 class AliasAnalysis;
31 class LiveIntervals;
32 class MachineDominatorTree;
33 class MachineLoopInfo;
34 class ScheduleDAGInstrs;
35
36 /// MachineSchedContext provides enough context from the MachineScheduler pass
37 /// for the target to instantiate a scheduler.
38 struct MachineSchedContext {
39   MachineFunction *MF;
40   const MachineLoopInfo *MLI;
41   const MachineDominatorTree *MDT;
42   AliasAnalysis *AA;
43   LiveIntervals *LIS;
44
45   MachineSchedContext(): MF(0), MLI(0), MDT(0), AA(0), LIS(0) {}
46 };
47
48 /// MachineSchedRegistry provides a selection of available machine instruction
49 /// schedulers.
50 class MachineSchedRegistry : public MachinePassRegistryNode {
51 public:
52   typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineSchedContext *);
53
54   // RegisterPassParser requires a (misnamed) FunctionPassCtor type.
55   typedef ScheduleDAGCtor FunctionPassCtor;
56
57   static MachinePassRegistry Registry;
58
59   MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C)
60     : MachinePassRegistryNode(N, D, (MachinePassCtor)C) {
61     Registry.Add(this);
62   }
63   ~MachineSchedRegistry() { Registry.Remove(this); }
64
65   // Accessors.
66   //
67   MachineSchedRegistry *getNext() const {
68     return (MachineSchedRegistry *)MachinePassRegistryNode::getNext();
69   }
70   static MachineSchedRegistry *getList() {
71     return (MachineSchedRegistry *)Registry.getList();
72   }
73   static ScheduleDAGCtor getDefault() {
74     return (ScheduleDAGCtor)Registry.getDefault();
75   }
76   static void setDefault(ScheduleDAGCtor C) {
77     Registry.setDefault((MachinePassCtor)C);
78   }
79   static void setListener(MachinePassRegistryListener *L) {
80     Registry.setListener(L);
81   }
82 };
83
84 } // namespace llvm
85
86 #endif