diff options
author | Andrew Trick <atrick@apple.com> | 2012-03-07 05:21:44 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2012-03-07 05:21:44 +0000 |
commit | 84b454d1a270a5d685e01686ed15e68c44b0b56a (patch) | |
tree | f9053c8e0fd57d4500418db38cd4fc15e2d7694f /lib/CodeGen/PostRASchedulerList.cpp | |
parent | 73ba69b6843f7f23345b1e8745cb328952cae0d8 (diff) | |
download | llvm-84b454d1a270a5d685e01686ed15e68c44b0b56a.tar.gz llvm-84b454d1a270a5d685e01686ed15e68c44b0b56a.tar.bz2 llvm-84b454d1a270a5d685e01686ed15e68c44b0b56a.tar.xz |
misched preparation: modularize schedule emission.
ScheduleDAG has nothing to do with how the instructions are scheduled.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152206 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PostRASchedulerList.cpp')
-rw-r--r-- | lib/CodeGen/PostRASchedulerList.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/CodeGen/PostRASchedulerList.cpp b/lib/CodeGen/PostRASchedulerList.cpp index 72ae6febb1..488dab7217 100644 --- a/lib/CodeGen/PostRASchedulerList.cpp +++ b/lib/CodeGen/PostRASchedulerList.cpp @@ -145,6 +145,8 @@ namespace { /// void Schedule(); + void EmitSchedule(); + /// Observe - Update liveness information to account for the current /// instruction, which will not be scheduled. /// @@ -730,3 +732,37 @@ void SchedulePostRATDList::ListScheduleTopDown() { "The number of nodes scheduled doesn't match the expected number!"); #endif // NDEBUG } + +// EmitSchedule - Emit the machine code in scheduled order. +void SchedulePostRATDList::EmitSchedule() { + Begin = InsertPos; + + // If first instruction was a DBG_VALUE then put it back. + if (FirstDbgValue) + BB->splice(InsertPos, BB, FirstDbgValue); + + // Then re-insert them according to the given schedule. + for (unsigned i = 0, e = Sequence.size(); i != e; i++) { + if (SUnit *SU = Sequence[i]) + BB->splice(InsertPos, BB, SU->getInstr()); + else + // Null SUnit* is a noop. + TII->insertNoop(*BB, InsertPos); + + // Update the Begin iterator, as the first instruction in the block + // may have been scheduled later. + if (i == 0) + Begin = prior(InsertPos); + } + + // Reinsert any remaining debug_values. + for (std::vector<std::pair<MachineInstr *, MachineInstr *> >::iterator + DI = DbgValues.end(), DE = DbgValues.begin(); DI != DE; --DI) { + std::pair<MachineInstr *, MachineInstr *> P = *prior(DI); + MachineInstr *DbgValue = P.first; + MachineBasicBlock::iterator OrigPrivMI = P.second; + BB->splice(++OrigPrivMI, BB, DbgValue); + } + DbgValues.clear(); + FirstDbgValue = NULL; +} |