|
@@ -7,8 +7,48 @@
|
|
|
//
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
//
|
|
|
-// This file provides a MachineSchedRegistry for registering alternative machine
|
|
|
-// schedulers. A Target may provide an alternative scheduler implementation by
|
|
|
+// This file provides an interface for customizing the standard MachineScheduler
|
|
|
+// pass. Note that the entire pass may be replaced as follows:
|
|
|
+//
|
|
|
+// <Target>TargetMachine::createPassConfig(PassManagerBase &PM) {
|
|
|
+// PM.substitutePass(&MachineSchedulerID, &CustomSchedulerPassID);
|
|
|
+// ...}
|
|
|
+//
|
|
|
+// The MachineScheduler pass is only responsible for choosing the regions to be
|
|
|
+// scheduled. Targets can override the DAG builder and scheduler without
|
|
|
+// replacing the pass as follows:
|
|
|
+//
|
|
|
+// ScheduleDAGInstrs *<Target>PassConfig::
|
|
|
+// createMachineScheduler(MachineSchedContext *C) {
|
|
|
+// return new CustomMachineScheduler(C);
|
|
|
+// }
|
|
|
+//
|
|
|
+// The default scheduler, ScheduleDAGMI, builds the DAG and drives list
|
|
|
+// scheduling while updating the instruction stream, register pressure, and live
|
|
|
+// intervals. Most targets don't need to override the DAG builder and list
|
|
|
+// schedulier, but subtargets that require custom scheduling heuristics may
|
|
|
+// plugin an alternate MachineSchedStrategy. The strategy is responsible for
|
|
|
+// selecting the highest priority node from the list:
|
|
|
+//
|
|
|
+// ScheduleDAGInstrs *<Target>PassConfig::
|
|
|
+// createMachineScheduler(MachineSchedContext *C) {
|
|
|
+// return new ScheduleDAGMI(C, CustomStrategy(C));
|
|
|
+// }
|
|
|
+//
|
|
|
+// The DAG builder can also be customized in a sense by adding DAG mutations
|
|
|
+// that will run after DAG building and before list scheduling. DAG mutations
|
|
|
+// can adjust dependencies based on target-specific knowledge or add weak edges
|
|
|
+// to aid heuristics:
|
|
|
+//
|
|
|
+// ScheduleDAGInstrs *<Target>PassConfig::
|
|
|
+// createMachineScheduler(MachineSchedContext *C) {
|
|
|
+// ScheduleDAGMI *DAG = new ScheduleDAGMI(C, CustomStrategy(C));
|
|
|
+// DAG->addMutation(new CustomDependencies(DAG->TII, DAG->TRI));
|
|
|
+// return DAG;
|
|
|
+// }
|
|
|
+//
|
|
|
+// A target that supports alternative schedulers can use the
|
|
|
+// MachineSchedRegistry to allow command line selection. This can be done by
|
|
|
// implementing the following boilerplate:
|
|
|
//
|
|
|
// static ScheduleDAGInstrs *createCustomMachineSched(MachineSchedContext *C) {
|
|
@@ -18,9 +58,19 @@
|
|
|
// SchedCustomRegistry("custom", "Run my target's custom scheduler",
|
|
|
// createCustomMachineSched);
|
|
|
//
|
|
|
-// Inside <Target>PassConfig:
|
|
|
-// enablePass(&MachineSchedulerID);
|
|
|
-// MachineSchedRegistry::setDefault(createCustomMachineSched);
|
|
|
+//
|
|
|
+// Finally, subtargets that don't need to implement custom heuristics but would
|
|
|
+// like to configure the GenericScheduler's policy for a given scheduler region,
|
|
|
+// including scheduling direction and register pressure tracking policy, can do
|
|
|
+// this:
|
|
|
+//
|
|
|
+// void <SubTarget>Subtarget::
|
|
|
+// overrideSchedPolicy(MachineSchedPolicy &Policy,
|
|
|
+// MachineInstr *begin,
|
|
|
+// MachineInstr *end,
|
|
|
+// unsigned NumRegionInstrs) const {
|
|
|
+// Policy.<Flag> = true;
|
|
|
+// }
|
|
|
//
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
@@ -85,15 +135,6 @@ public:
|
|
|
static MachineSchedRegistry *getList() {
|
|
|
return (MachineSchedRegistry *)Registry.getList();
|
|
|
}
|
|
|
- static ScheduleDAGCtor getDefault() {
|
|
|
- return (ScheduleDAGCtor)Registry.getDefault();
|
|
|
- }
|
|
|
- static void setDefault(ScheduleDAGCtor C) {
|
|
|
- Registry.setDefault((MachinePassCtor)C);
|
|
|
- }
|
|
|
- static void setDefault(StringRef Name) {
|
|
|
- Registry.setDefault(Name);
|
|
|
- }
|
|
|
static void setListener(MachinePassRegistryListener *L) {
|
|
|
Registry.setListener(L);
|
|
|
}
|