1 //==- MachineScheduler.h - MachineInstr Scheduling Pass ----------*- C++ -*-==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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:
14 // static ScheduleDAGInstrs *createCustomMachineSched(MachineSchedContext *C) {
15 // return new CustomMachineScheduler(C);
17 // static MachineSchedRegistry
18 // SchedDefaultRegistry("custom", "Run my target's custom scheduler",
19 // createCustomMachineSched);
21 //===----------------------------------------------------------------------===//
23 #ifndef MACHINESCHEDULER_H
24 #define MACHINESCHEDULER_H
26 #include "llvm/CodeGen/MachinePassRegistry.h"
32 class MachineDominatorTree;
33 class MachineLoopInfo;
34 class ScheduleDAGInstrs;
36 /// MachineSchedContext provides enough context from the MachineScheduler pass
37 /// for the target to instantiate a scheduler.
38 struct MachineSchedContext {
40 const MachineLoopInfo *MLI;
41 const MachineDominatorTree *MDT;
45 MachineSchedContext(): MF(0), MLI(0), MDT(0), AA(0), LIS(0) {}
48 /// MachineSchedRegistry provides a selection of available machine instruction
50 class MachineSchedRegistry : public MachinePassRegistryNode {
52 typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineSchedContext *);
54 // RegisterPassParser requires a (misnamed) FunctionPassCtor type.
55 typedef ScheduleDAGCtor FunctionPassCtor;
57 static MachinePassRegistry Registry;
59 MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C)
60 : MachinePassRegistryNode(N, D, (MachinePassCtor)C) {
63 ~MachineSchedRegistry() { Registry.Remove(this); }
67 MachineSchedRegistry *getNext() const {
68 return (MachineSchedRegistry *)MachinePassRegistryNode::getNext();
70 static MachineSchedRegistry *getList() {
71 return (MachineSchedRegistry *)Registry.getList();
73 static ScheduleDAGCtor getDefault() {
74 return (ScheduleDAGCtor)Registry.getDefault();
76 static void setDefault(ScheduleDAGCtor C) {
77 Registry.setDefault((MachinePassCtor)C);
79 static void setListener(MachinePassRegistryListener *L) {
80 Registry.setListener(L);