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 // SchedCustomRegistry("custom", "Run my target's custom scheduler",
19 // createCustomMachineSched);
21 // Inside <Target>PassConfig:
22 // enablePass(MachineSchedulerID);
23 // MachineSchedRegistry::setDefault(createCustomMachineSched);
25 //===----------------------------------------------------------------------===//
27 #ifndef MACHINESCHEDULER_H
28 #define MACHINESCHEDULER_H
30 #include "llvm/CodeGen/MachinePassRegistry.h"
36 class MachineDominatorTree;
37 class MachineLoopInfo;
38 class ScheduleDAGInstrs;
40 /// MachineSchedContext provides enough context from the MachineScheduler pass
41 /// for the target to instantiate a scheduler.
42 struct MachineSchedContext {
44 const MachineLoopInfo *MLI;
45 const MachineDominatorTree *MDT;
46 const TargetPassConfig *PassConfig;
50 MachineSchedContext(): MF(0), MLI(0), MDT(0), PassConfig(0), AA(0), LIS(0) {}
53 /// MachineSchedRegistry provides a selection of available machine instruction
55 class MachineSchedRegistry : public MachinePassRegistryNode {
57 typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineSchedContext *);
59 // RegisterPassParser requires a (misnamed) FunctionPassCtor type.
60 typedef ScheduleDAGCtor FunctionPassCtor;
62 static MachinePassRegistry Registry;
64 MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C)
65 : MachinePassRegistryNode(N, D, (MachinePassCtor)C) {
68 ~MachineSchedRegistry() { Registry.Remove(this); }
72 MachineSchedRegistry *getNext() const {
73 return (MachineSchedRegistry *)MachinePassRegistryNode::getNext();
75 static MachineSchedRegistry *getList() {
76 return (MachineSchedRegistry *)Registry.getList();
78 static ScheduleDAGCtor getDefault() {
79 return (ScheduleDAGCtor)Registry.getDefault();
81 static void setDefault(ScheduleDAGCtor C) {
82 Registry.setDefault((MachinePassCtor)C);
84 static void setListener(MachinePassRegistryListener *L) {
85 Registry.setListener(L);