1 //===- MachineScheduler.cpp - Machine Instruction Scheduler ---------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // MachineScheduler schedules machine instructions after phi elimination. It 11 // preserves LiveIntervals so it can be invoked before register allocation. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #define DEBUG_TYPE "misched" 16 17 #include "ScheduleDAGInstrs.h" 18 #include "LiveDebugVariables.h" 19 #include "llvm/CodeGen/LiveIntervalAnalysis.h" 20 #include "llvm/CodeGen/MachinePassRegistry.h" 21 #include "llvm/CodeGen/Passes.h" 22 #include "llvm/Analysis/AliasAnalysis.h" 23 #include "llvm/Target/TargetInstrInfo.h" 24 #include "llvm/Support/CommandLine.h" 25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/ErrorHandling.h" 27 #include "llvm/Support/raw_ostream.h" 28 #include "llvm/ADT/OwningPtr.h" 29 30 #include <queue> 31 32 using namespace llvm; 33 34 //===----------------------------------------------------------------------===// 35 // Machine Instruction Scheduling Pass and Registry 36 //===----------------------------------------------------------------------===// 37 38 namespace { 39 /// MachineScheduler runs after coalescing and before register allocation. 40 class MachineScheduler : public MachineFunctionPass { 41 public: 42 MachineFunction *MF; 43 const TargetInstrInfo *TII; 44 const MachineLoopInfo *MLI; 45 const MachineDominatorTree *MDT; 46 LiveIntervals *LIS; 47 48 MachineScheduler(); 49 50 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 51 52 virtual void releaseMemory() {} 53 54 virtual bool runOnMachineFunction(MachineFunction&); 55 56 virtual void print(raw_ostream &O, const Module* = 0) const; 57 58 static char ID; // Class identification, replacement for typeinfo 59 }; 60 } // namespace 61 62 char MachineScheduler::ID = 0; 63 64 char &llvm::MachineSchedulerID = MachineScheduler::ID; 65 66 INITIALIZE_PASS_BEGIN(MachineScheduler, "misched", 67 "Machine Instruction Scheduler", false, false) 68 INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 69 INITIALIZE_PASS_DEPENDENCY(SlotIndexes) 70 INITIALIZE_PASS_DEPENDENCY(LiveIntervals) 71 INITIALIZE_PASS_DEPENDENCY(LiveDebugVariables) 72 INITIALIZE_PASS_END(MachineScheduler, "misched", 73 "Machine Instruction Scheduler", false, false) 74 75 MachineScheduler::MachineScheduler() 76 : MachineFunctionPass(ID), MF(0), MLI(0), MDT(0) { 77 initializeMachineSchedulerPass(*PassRegistry::getPassRegistry()); 78 } 79 80 void MachineScheduler::getAnalysisUsage(AnalysisUsage &AU) const { 81 AU.setPreservesCFG(); 82 AU.addRequiredID(MachineDominatorsID); 83 AU.addRequired<MachineLoopInfo>(); 84 AU.addRequired<AliasAnalysis>(); 85 AU.addPreserved<AliasAnalysis>(); 86 AU.addRequired<SlotIndexes>(); 87 AU.addPreserved<SlotIndexes>(); 88 AU.addRequired<LiveIntervals>(); 89 AU.addPreserved<LiveIntervals>(); 90 AU.addRequired<LiveDebugVariables>(); 91 AU.addPreserved<LiveDebugVariables>(); 92 MachineFunctionPass::getAnalysisUsage(AU); 93 } 94 95 namespace { 96 /// MachineSchedRegistry provides a selection of available machine instruction 97 /// schedulers. 98 class MachineSchedRegistry : public MachinePassRegistryNode { 99 public: 100 typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineScheduler *); 101 102 // RegisterPassParser requires a (misnamed) FunctionPassCtor type. 103 typedef ScheduleDAGCtor FunctionPassCtor; 104 105 static MachinePassRegistry Registry; 106 107 MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C) 108 : MachinePassRegistryNode(N, D, (MachinePassCtor)C) { 109 Registry.Add(this); 110 } 111 ~MachineSchedRegistry() { Registry.Remove(this); } 112 113 // Accessors. 114 // 115 MachineSchedRegistry *getNext() const { 116 return (MachineSchedRegistry *)MachinePassRegistryNode::getNext(); 117 } 118 static MachineSchedRegistry *getList() { 119 return (MachineSchedRegistry *)Registry.getList(); 120 } 121 static ScheduleDAGCtor getDefault() { 122 return (ScheduleDAGCtor)Registry.getDefault(); 123 } 124 static void setDefault(ScheduleDAGCtor C) { 125 Registry.setDefault((MachinePassCtor)C); 126 } 127 static void setListener(MachinePassRegistryListener *L) { 128 Registry.setListener(L); 129 } 130 }; 131 } // namespace 132 133 MachinePassRegistry MachineSchedRegistry::Registry; 134 135 static ScheduleDAGInstrs *createDefaultMachineSched(MachineScheduler *P); 136 137 /// MachineSchedOpt allows command line selection of the scheduler. 138 static cl::opt<MachineSchedRegistry::ScheduleDAGCtor, false, 139 RegisterPassParser<MachineSchedRegistry> > 140 MachineSchedOpt("misched", 141 cl::init(&createDefaultMachineSched), cl::Hidden, 142 cl::desc("Machine instruction scheduler to use")); 143 144 //===----------------------------------------------------------------------===// 145 // Machine Instruction Scheduling Common Implementation 146 //===----------------------------------------------------------------------===// 147 148 namespace { 149 /// ScheduleTopDownLive is an implementation of ScheduleDAGInstrs that schedules 150 /// machine instructions while updating LiveIntervals. 151 class ScheduleTopDownLive : public ScheduleDAGInstrs { 152 protected: 153 MachineScheduler *Pass; 154 public: 155 ScheduleTopDownLive(MachineScheduler *P): 156 ScheduleDAGInstrs(*P->MF, *P->MLI, *P->MDT, /*IsPostRA=*/false), Pass(P) {} 157 158 /// ScheduleDAGInstrs callback. 159 void Schedule(); 160 161 /// Interface implemented by the selected top-down liveinterval scheduler. 162 /// 163 /// Pick the next node to schedule, or return NULL. 164 virtual SUnit *pickNode() = 0; 165 166 /// When all preceeding dependencies have been resolved, free this node for 167 /// scheduling. 168 virtual void releaseNode(SUnit *SU) = 0; 169 170 protected: 171 void releaseSucc(SUnit *SU, SDep *SuccEdge); 172 void releaseSuccessors(SUnit *SU); 173 }; 174 } // namespace 175 176 /// ReleaseSucc - Decrement the NumPredsLeft count of a successor. When 177 /// NumPredsLeft reaches zero, release the successor node. 178 void ScheduleTopDownLive::releaseSucc(SUnit *SU, SDep *SuccEdge) { 179 SUnit *SuccSU = SuccEdge->getSUnit(); 180 181 #ifndef NDEBUG 182 if (SuccSU->NumPredsLeft == 0) { 183 dbgs() << "*** Scheduling failed! ***\n"; 184 SuccSU->dump(this); 185 dbgs() << " has been released too many times!\n"; 186 llvm_unreachable(0); 187 } 188 #endif 189 --SuccSU->NumPredsLeft; 190 if (SuccSU->NumPredsLeft == 0 && SuccSU != &ExitSU) 191 releaseNode(SuccSU); 192 } 193 194 /// releaseSuccessors - Call releaseSucc on each of SU's successors. 195 void ScheduleTopDownLive::releaseSuccessors(SUnit *SU) { 196 for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); 197 I != E; ++I) { 198 releaseSucc(SU, &*I); 199 } 200 } 201 202 /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's 203 /// time to do some work. 204 void ScheduleTopDownLive::Schedule() { 205 BuildSchedGraph(&Pass->getAnalysis<AliasAnalysis>()); 206 207 DEBUG(dbgs() << "********** MI Scheduling **********\n"); 208 DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su) 209 SUnits[su].dumpAll(this)); 210 211 // Release any successors of the special Entry node. It is currently unused, 212 // but we keep up appearances. 213 releaseSuccessors(&EntrySU); 214 215 // Release all DAG roots for scheduling. 216 for (std::vector<SUnit>::iterator I = SUnits.begin(), E = SUnits.end(); 217 I != E; ++I) { 218 // A SUnit is ready to schedule if it has no predecessors. 219 if (I->Preds.empty()) 220 releaseNode(&(*I)); 221 } 222 223 InsertPos = Begin; 224 while (SUnit *SU = pickNode()) { 225 DEBUG(dbgs() << "*** Scheduling Instruction:\n"; SU->dump(this)); 226 227 // Move the instruction to its new location in the instruction stream. 228 MachineInstr *MI = SU->getInstr(); 229 if (&*InsertPos == MI) 230 ++InsertPos; 231 else { 232 BB->splice(InsertPos, BB, MI); 233 Pass->LIS->handleMove(MI); 234 if (Begin == InsertPos) 235 Begin = MI; 236 } 237 238 // Release dependent instructions for scheduling. 239 releaseSuccessors(SU); 240 } 241 } 242 243 bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) { 244 // Initialize the context of the pass. 245 MF = &mf; 246 MLI = &getAnalysis<MachineLoopInfo>(); 247 MDT = &getAnalysis<MachineDominatorTree>(); 248 LIS = &getAnalysis<LiveIntervals>(); 249 TII = MF->getTarget().getInstrInfo(); 250 251 // Select the scheduler, or set the default. 252 MachineSchedRegistry::ScheduleDAGCtor Ctor = 253 MachineSchedRegistry::getDefault(); 254 if (!Ctor) { 255 Ctor = MachineSchedOpt; 256 MachineSchedRegistry::setDefault(Ctor); 257 } 258 // Instantiate the selected scheduler. 259 OwningPtr<ScheduleDAGInstrs> Scheduler(Ctor(this)); 260 261 // Visit all machine basic blocks. 262 for (MachineFunction::iterator MBB = MF->begin(), MBBEnd = MF->end(); 263 MBB != MBBEnd; ++MBB) { 264 265 // Break the block into scheduling regions [I, RegionEnd), and schedule each 266 // region as soon as it is discovered. 267 unsigned RemainingCount = MBB->size(); 268 for(MachineBasicBlock::iterator RegionEnd = MBB->end(); 269 RegionEnd != MBB->begin();) { 270 // The next region starts above the previous region. Look backward in the 271 // instruction stream until we find the nearest boundary. 272 MachineBasicBlock::iterator I = RegionEnd; 273 for(;I != MBB->begin(); --I, --RemainingCount) { 274 if (TII->isSchedulingBoundary(llvm::prior(I), MBB, *MF)) 275 break; 276 } 277 if (I == RegionEnd) { 278 // Skip empty scheduling regions. 279 RegionEnd = llvm::prior(RegionEnd); 280 --RemainingCount; 281 continue; 282 } 283 // Skip regions with one instruction. 284 if (I == llvm::prior(RegionEnd)) { 285 RegionEnd = llvm::prior(RegionEnd); 286 continue; 287 } 288 DEBUG(dbgs() << "MachineScheduling " << MF->getFunction()->getName() 289 << ":BB#" << MBB->getNumber() << "\n From: " << *I << " To: "; 290 if (RegionEnd != MBB->end()) dbgs() << *RegionEnd; 291 else dbgs() << "End"; 292 dbgs() << " Remaining: " << RemainingCount << "\n"); 293 294 // Inform ScheduleDAGInstrs of the region being scheduled. It calls back 295 // to our Schedule() method. 296 Scheduler->Run(MBB, I, RegionEnd, MBB->size()); 297 RegionEnd = Scheduler->Begin; 298 } 299 assert(RemainingCount == 0 && "Instruction count mismatch!"); 300 } 301 return true; 302 } 303 304 void MachineScheduler::print(raw_ostream &O, const Module* m) const { 305 // unimplemented 306 } 307 308 //===----------------------------------------------------------------------===// 309 // Placeholder for extending the machine instruction scheduler. 310 //===----------------------------------------------------------------------===// 311 312 namespace { 313 class DefaultMachineScheduler : public ScheduleDAGInstrs { 314 MachineScheduler *Pass; 315 public: 316 DefaultMachineScheduler(MachineScheduler *P): 317 ScheduleDAGInstrs(*P->MF, *P->MLI, *P->MDT, /*IsPostRA=*/false), Pass(P) {} 318 319 /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's 320 /// time to do some work. 321 void Schedule(); 322 }; 323 } // namespace 324 325 static ScheduleDAGInstrs *createDefaultMachineSched(MachineScheduler *P) { 326 return new DefaultMachineScheduler(P); 327 } 328 static MachineSchedRegistry 329 SchedDefaultRegistry("default", "Activate the scheduler pass, " 330 "but don't reorder instructions", 331 createDefaultMachineSched); 332 333 334 /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's 335 /// time to do some work. 336 void DefaultMachineScheduler::Schedule() { 337 BuildSchedGraph(&Pass->getAnalysis<AliasAnalysis>()); 338 339 DEBUG(dbgs() << "********** MI Scheduling **********\n"); 340 DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su) 341 SUnits[su].dumpAll(this)); 342 343 // TODO: Put interesting things here. 344 // 345 // When this is fully implemented, it will become a subclass of 346 // ScheduleTopDownLive. So this driver will disappear. 347 } 348 349 //===----------------------------------------------------------------------===// 350 // Machine Instruction Shuffler for Correctness Testing 351 //===----------------------------------------------------------------------===// 352 353 #ifndef NDEBUG 354 namespace { 355 // Nodes with a higher number have lower priority. This way we attempt to 356 // schedule the latest instructions earliest. 357 // 358 // TODO: Relies on the property of the BuildSchedGraph that results in SUnits 359 // being ordered in sequence bottom-up. This will be formalized, probably be 360 // constructing SUnits in a prepass. 361 struct ShuffleSUnitOrder { 362 bool operator()(SUnit *A, SUnit *B) const { 363 return A->NodeNum > B->NodeNum; 364 } 365 }; 366 367 /// Reorder instructions as much as possible. 368 class InstructionShuffler : public ScheduleTopDownLive { 369 std::priority_queue<SUnit*, std::vector<SUnit*>, ShuffleSUnitOrder> Queue; 370 public: 371 InstructionShuffler(MachineScheduler *P): 372 ScheduleTopDownLive(P) {} 373 374 /// ScheduleTopDownLive Interface 375 376 virtual SUnit *pickNode() { 377 if (Queue.empty()) return NULL; 378 SUnit *SU = Queue.top(); 379 Queue.pop(); 380 return SU; 381 } 382 383 virtual void releaseNode(SUnit *SU) { 384 Queue.push(SU); 385 } 386 }; 387 } // namespace 388 389 static ScheduleDAGInstrs *createInstructionShuffler(MachineScheduler *P) { 390 return new InstructionShuffler(P); 391 } 392 static MachineSchedRegistry ShufflerRegistry("shuffle", 393 "Shuffle machine instructions", 394 createInstructionShuffler); 395 #endif // !NDEBUG 396