From d039b383e76e6658846dca9eee3fe7f221a2f938 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Fri, 14 Sep 2012 17:22:42 +0000 Subject: [PATCH] misched: add a hook for custom DAG postprocessing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163915 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineScheduler.h | 22 ++++++++++++++++++++++ lib/CodeGen/MachineScheduler.cpp | 9 +++++++++ 2 files changed, 31 insertions(+) diff --git a/include/llvm/CodeGen/MachineScheduler.h b/include/llvm/CodeGen/MachineScheduler.h index f87c2a5c40e..d88f3fc57d6 100644 --- a/include/llvm/CodeGen/MachineScheduler.h +++ b/include/llvm/CodeGen/MachineScheduler.h @@ -179,6 +179,14 @@ public: #endif }; +/// Mutate the DAG as a postpass after normal DAG building. +class ScheduleDAGMutation { +public: + virtual ~ScheduleDAGMutation() {} + + virtual void apply(ScheduleDAGMI *DAG) = 0; +}; + /// ScheduleDAGMI is an implementation of ScheduleDAGInstrs that schedules /// machine instructions while updating LiveIntervals and tracking regpressure. class ScheduleDAGMI : public ScheduleDAGInstrs { @@ -187,6 +195,9 @@ protected: RegisterClassInfo *RegClassInfo; MachineSchedStrategy *SchedImpl; + /// Ordered list of DAG postprocessing steps. + std::vector Mutations; + MachineBasicBlock::iterator LiveRegionEnd; /// Register pressure in this region computed by buildSchedGraph. @@ -229,6 +240,13 @@ public: delete SchedImpl; } + /// Add a postprocessing step to the DAG builder. + /// Mutations are applied in the order that they are added after normal DAG + /// building and before MachineSchedStrategy initialization. + void addMutation(ScheduleDAGMutation *Mutation) { + Mutations.push_back(Mutation); + } + MachineBasicBlock::iterator top() const { return CurrentTop; } MachineBasicBlock::iterator bottom() const { return CurrentBottom; } @@ -282,6 +300,10 @@ protected: /// bottom of the DAG region without covereing any unscheduled instruction. void buildDAGWithRegPressure(); + /// Apply each ScheduleDAGMutation step in order. This allows different + /// instances of ScheduleDAGMI to perform custom DAG postprocessing. + void postprocessDAG(); + /// Identify DAG roots and setup scheduler queues. void initQueues(); diff --git a/lib/CodeGen/MachineScheduler.cpp b/lib/CodeGen/MachineScheduler.cpp index 330ec560f88..d7ecec4163a 100644 --- a/lib/CodeGen/MachineScheduler.cpp +++ b/lib/CodeGen/MachineScheduler.cpp @@ -484,6 +484,8 @@ void ScheduleDAGMI::releaseRoots() { void ScheduleDAGMI::schedule() { buildDAGWithRegPressure(); + postprocessDAG(); + DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su) SUnits[su].dumpAll(this)); @@ -522,6 +524,13 @@ void ScheduleDAGMI::buildDAGWithRegPressure() { initRegPressure(); } +/// Apply each ScheduleDAGMutation step in order. +void ScheduleDAGMI::postprocessDAG() { + for (unsigned i = 0, e = Mutations.size(); i < e; ++i) { + Mutations[i]->apply(this); + } +} + /// Identify DAG roots and setup scheduler queues. void ScheduleDAGMI::initQueues() { // Initialize the strategy before modifying the DAG. -- 2.11.0