1 //===-- Passes.cpp - Target independent code generation passes ------------===// 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 // This file defines interfaces to access the target independent code 11 // generation passes provided by the LLVM backend. 12 // 13 //===---------------------------------------------------------------------===// 14 15 #include "llvm/CodeGen/Passes.h" 16 #include "llvm/Analysis/Passes.h" 17 #include "llvm/Analysis/Verifier.h" 18 #include "llvm/Assembly/PrintModulePass.h" 19 #include "llvm/CodeGen/GCStrategy.h" 20 #include "llvm/CodeGen/MachineFunctionPass.h" 21 #include "llvm/CodeGen/RegAllocRegistry.h" 22 #include "llvm/MC/MCAsmInfo.h" 23 #include "llvm/PassManager.h" 24 #include "llvm/Support/CommandLine.h" 25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/ErrorHandling.h" 27 #include "llvm/Target/TargetLowering.h" 28 #include "llvm/Target/TargetSubtargetInfo.h" 29 #include "llvm/Transforms/Scalar.h" 30 31 using namespace llvm; 32 33 static cl::opt<bool> DisablePostRA("disable-post-ra", cl::Hidden, 34 cl::desc("Disable Post Regalloc")); 35 static cl::opt<bool> DisableBranchFold("disable-branch-fold", cl::Hidden, 36 cl::desc("Disable branch folding")); 37 static cl::opt<bool> DisableTailDuplicate("disable-tail-duplicate", cl::Hidden, 38 cl::desc("Disable tail duplication")); 39 static cl::opt<bool> DisableEarlyTailDup("disable-early-taildup", cl::Hidden, 40 cl::desc("Disable pre-register allocation tail duplication")); 41 static cl::opt<bool> DisableBlockPlacement("disable-block-placement", 42 cl::Hidden, cl::desc("Disable probability-driven block placement")); 43 static cl::opt<bool> EnableBlockPlacementStats("enable-block-placement-stats", 44 cl::Hidden, cl::desc("Collect probability-driven block placement stats")); 45 static cl::opt<bool> DisableSSC("disable-ssc", cl::Hidden, 46 cl::desc("Disable Stack Slot Coloring")); 47 static cl::opt<bool> DisableMachineDCE("disable-machine-dce", cl::Hidden, 48 cl::desc("Disable Machine Dead Code Elimination")); 49 static cl::opt<bool> DisableEarlyIfConversion("disable-early-ifcvt", cl::Hidden, 50 cl::desc("Disable Early If-conversion")); 51 static cl::opt<bool> DisableMachineLICM("disable-machine-licm", cl::Hidden, 52 cl::desc("Disable Machine LICM")); 53 static cl::opt<bool> DisableMachineCSE("disable-machine-cse", cl::Hidden, 54 cl::desc("Disable Machine Common Subexpression Elimination")); 55 static cl::opt<cl::boolOrDefault> 56 OptimizeRegAlloc("optimize-regalloc", cl::Hidden, 57 cl::desc("Enable optimized register allocation compilation path.")); 58 static cl::opt<cl::boolOrDefault> 59 EnableMachineSched("enable-misched", cl::Hidden, 60 cl::desc("Enable the machine instruction scheduling pass.")); 61 static cl::opt<bool> EnableStrongPHIElim("strong-phi-elim", cl::Hidden, 62 cl::desc("Use strong PHI elimination.")); 63 static cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm", 64 cl::Hidden, 65 cl::desc("Disable Machine LICM")); 66 static cl::opt<bool> DisableMachineSink("disable-machine-sink", cl::Hidden, 67 cl::desc("Disable Machine Sinking")); 68 static cl::opt<bool> DisableLSR("disable-lsr", cl::Hidden, 69 cl::desc("Disable Loop Strength Reduction Pass")); 70 static cl::opt<bool> DisableCGP("disable-cgp", cl::Hidden, 71 cl::desc("Disable Codegen Prepare")); 72 static cl::opt<bool> DisableCopyProp("disable-copyprop", cl::Hidden, 73 cl::desc("Disable Copy Propagation pass")); 74 static cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden, 75 cl::desc("Print LLVM IR produced by the loop-reduce pass")); 76 static cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden, 77 cl::desc("Print LLVM IR input to isel pass")); 78 static cl::opt<bool> PrintGCInfo("print-gc", cl::Hidden, 79 cl::desc("Dump garbage collector data")); 80 static cl::opt<bool> VerifyMachineCode("verify-machineinstrs", cl::Hidden, 81 cl::desc("Verify generated machine code"), 82 cl::init(getenv("LLVM_VERIFY_MACHINEINSTRS")!=NULL)); 83 static cl::opt<std::string> 84 PrintMachineInstrs("print-machineinstrs", cl::ValueOptional, 85 cl::desc("Print machine instrs"), 86 cl::value_desc("pass-name"), cl::init("option-unspecified")); 87 88 // Experimental option to run live interval analysis early. 89 static cl::opt<bool> EarlyLiveIntervals("early-live-intervals", cl::Hidden, 90 cl::desc("Run live interval analysis earlier in the pipeline")); 91 92 /// Allow standard passes to be disabled by command line options. This supports 93 /// simple binary flags that either suppress the pass or do nothing. 94 /// i.e. -disable-mypass=false has no effect. 95 /// These should be converted to boolOrDefault in order to use applyOverride. 96 static IdentifyingPassPtr applyDisable(IdentifyingPassPtr PassID, 97 bool Override) { 98 if (Override) 99 return IdentifyingPassPtr(); 100 return PassID; 101 } 102 103 /// Allow Pass selection to be overriden by command line options. This supports 104 /// flags with ternary conditions. TargetID is passed through by default. The 105 /// pass is suppressed when the option is false. When the option is true, the 106 /// StandardID is selected if the target provides no default. 107 static IdentifyingPassPtr applyOverride(IdentifyingPassPtr TargetID, 108 cl::boolOrDefault Override, 109 AnalysisID StandardID) { 110 switch (Override) { 111 case cl::BOU_UNSET: 112 return TargetID; 113 case cl::BOU_TRUE: 114 if (TargetID.isValid()) 115 return TargetID; 116 if (StandardID == 0) 117 report_fatal_error("Target cannot enable pass"); 118 return StandardID; 119 case cl::BOU_FALSE: 120 return IdentifyingPassPtr(); 121 } 122 llvm_unreachable("Invalid command line option state"); 123 } 124 125 /// Allow standard passes to be disabled by the command line, regardless of who 126 /// is adding the pass. 127 /// 128 /// StandardID is the pass identified in the standard pass pipeline and provided 129 /// to addPass(). It may be a target-specific ID in the case that the target 130 /// directly adds its own pass, but in that case we harmlessly fall through. 131 /// 132 /// TargetID is the pass that the target has configured to override StandardID. 133 /// 134 /// StandardID may be a pseudo ID. In that case TargetID is the name of the real 135 /// pass to run. This allows multiple options to control a single pass depending 136 /// on where in the pipeline that pass is added. 137 static IdentifyingPassPtr overridePass(AnalysisID StandardID, 138 IdentifyingPassPtr TargetID) { 139 if (StandardID == &PostRASchedulerID) 140 return applyDisable(TargetID, DisablePostRA); 141 142 if (StandardID == &BranchFolderPassID) 143 return applyDisable(TargetID, DisableBranchFold); 144 145 if (StandardID == &TailDuplicateID) 146 return applyDisable(TargetID, DisableTailDuplicate); 147 148 if (StandardID == &TargetPassConfig::EarlyTailDuplicateID) 149 return applyDisable(TargetID, DisableEarlyTailDup); 150 151 if (StandardID == &MachineBlockPlacementID) 152 return applyDisable(TargetID, DisableBlockPlacement); 153 154 if (StandardID == &StackSlotColoringID) 155 return applyDisable(TargetID, DisableSSC); 156 157 if (StandardID == &DeadMachineInstructionElimID) 158 return applyDisable(TargetID, DisableMachineDCE); 159 160 if (StandardID == &EarlyIfConverterID) 161 return applyDisable(TargetID, DisableEarlyIfConversion); 162 163 if (StandardID == &MachineLICMID) 164 return applyDisable(TargetID, DisableMachineLICM); 165 166 if (StandardID == &MachineCSEID) 167 return applyDisable(TargetID, DisableMachineCSE); 168 169 if (StandardID == &MachineSchedulerID) 170 return applyOverride(TargetID, EnableMachineSched, StandardID); 171 172 if (StandardID == &TargetPassConfig::PostRAMachineLICMID) 173 return applyDisable(TargetID, DisablePostRAMachineLICM); 174 175 if (StandardID == &MachineSinkingID) 176 return applyDisable(TargetID, DisableMachineSink); 177 178 if (StandardID == &MachineCopyPropagationID) 179 return applyDisable(TargetID, DisableCopyProp); 180 181 return TargetID; 182 } 183 184 //===---------------------------------------------------------------------===// 185 /// TargetPassConfig 186 //===---------------------------------------------------------------------===// 187 188 INITIALIZE_PASS(TargetPassConfig, "targetpassconfig", 189 "Target Pass Configuration", false, false) 190 char TargetPassConfig::ID = 0; 191 192 // Pseudo Pass IDs. 193 char TargetPassConfig::EarlyTailDuplicateID = 0; 194 char TargetPassConfig::PostRAMachineLICMID = 0; 195 196 namespace llvm { 197 class PassConfigImpl { 198 public: 199 // List of passes explicitly substituted by this target. Normally this is 200 // empty, but it is a convenient way to suppress or replace specific passes 201 // that are part of a standard pass pipeline without overridding the entire 202 // pipeline. This mechanism allows target options to inherit a standard pass's 203 // user interface. For example, a target may disable a standard pass by 204 // default by substituting a pass ID of zero, and the user may still enable 205 // that standard pass with an explicit command line option. 206 DenseMap<AnalysisID,IdentifyingPassPtr> TargetPasses; 207 208 /// Store the pairs of <AnalysisID, AnalysisID> of which the second pass 209 /// is inserted after each instance of the first one. 210 SmallVector<std::pair<AnalysisID, IdentifyingPassPtr>, 4> InsertedPasses; 211 }; 212 } // namespace llvm 213 214 // Out of line virtual method. 215 TargetPassConfig::~TargetPassConfig() { 216 delete Impl; 217 } 218 219 // Out of line constructor provides default values for pass options and 220 // registers all common codegen passes. 221 TargetPassConfig::TargetPassConfig(TargetMachine *tm, PassManagerBase &pm) 222 : ImmutablePass(ID), PM(&pm), StartAfter(0), StopAfter(0), 223 Started(true), Stopped(false), TM(tm), Impl(0), Initialized(false), 224 DisableVerify(false), 225 EnableTailMerge(true) { 226 227 Impl = new PassConfigImpl(); 228 229 // Register all target independent codegen passes to activate their PassIDs, 230 // including this pass itself. 231 initializeCodeGen(*PassRegistry::getPassRegistry()); 232 233 // Substitute Pseudo Pass IDs for real ones. 234 substitutePass(&EarlyTailDuplicateID, &TailDuplicateID); 235 substitutePass(&PostRAMachineLICMID, &MachineLICMID); 236 237 // Temporarily disable experimental passes. 238 const TargetSubtargetInfo &ST = TM->getSubtarget<TargetSubtargetInfo>(); 239 if (!ST.enableMachineScheduler()) 240 disablePass(&MachineSchedulerID); 241 } 242 243 /// Insert InsertedPassID pass after TargetPassID. 244 void TargetPassConfig::insertPass(AnalysisID TargetPassID, 245 IdentifyingPassPtr InsertedPassID) { 246 assert(((!InsertedPassID.isInstance() && 247 TargetPassID != InsertedPassID.getID()) || 248 (InsertedPassID.isInstance() && 249 TargetPassID != InsertedPassID.getInstance()->getPassID())) && 250 "Insert a pass after itself!"); 251 std::pair<AnalysisID, IdentifyingPassPtr> P(TargetPassID, InsertedPassID); 252 Impl->InsertedPasses.push_back(P); 253 } 254 255 /// createPassConfig - Create a pass configuration object to be used by 256 /// addPassToEmitX methods for generating a pipeline of CodeGen passes. 257 /// 258 /// Targets may override this to extend TargetPassConfig. 259 TargetPassConfig *LLVMTargetMachine::createPassConfig(PassManagerBase &PM) { 260 return new TargetPassConfig(this, PM); 261 } 262 263 TargetPassConfig::TargetPassConfig() 264 : ImmutablePass(ID), PM(0) { 265 llvm_unreachable("TargetPassConfig should not be constructed on-the-fly"); 266 } 267 268 // Helper to verify the analysis is really immutable. 269 void TargetPassConfig::setOpt(bool &Opt, bool Val) { 270 assert(!Initialized && "PassConfig is immutable"); 271 Opt = Val; 272 } 273 274 void TargetPassConfig::substitutePass(AnalysisID StandardID, 275 IdentifyingPassPtr TargetID) { 276 Impl->TargetPasses[StandardID] = TargetID; 277 } 278 279 IdentifyingPassPtr TargetPassConfig::getPassSubstitution(AnalysisID ID) const { 280 DenseMap<AnalysisID, IdentifyingPassPtr>::const_iterator 281 I = Impl->TargetPasses.find(ID); 282 if (I == Impl->TargetPasses.end()) 283 return ID; 284 return I->second; 285 } 286 287 /// Add a pass to the PassManager if that pass is supposed to be run. If the 288 /// Started/Stopped flags indicate either that the compilation should start at 289 /// a later pass or that it should stop after an earlier pass, then do not add 290 /// the pass. Finally, compare the current pass against the StartAfter 291 /// and StopAfter options and change the Started/Stopped flags accordingly. 292 void TargetPassConfig::addPass(Pass *P) { 293 assert(!Initialized && "PassConfig is immutable"); 294 295 // Cache the Pass ID here in case the pass manager finds this pass is 296 // redundant with ones already scheduled / available, and deletes it. 297 // Fundamentally, once we add the pass to the manager, we no longer own it 298 // and shouldn't reference it. 299 AnalysisID PassID = P->getPassID(); 300 301 if (Started && !Stopped) 302 PM->add(P); 303 else 304 delete P; 305 if (StopAfter == PassID) 306 Stopped = true; 307 if (StartAfter == PassID) 308 Started = true; 309 if (Stopped && !Started) 310 report_fatal_error("Cannot stop compilation after pass that is not run"); 311 } 312 313 /// Add a CodeGen pass at this point in the pipeline after checking for target 314 /// and command line overrides. 315 /// 316 /// addPass cannot return a pointer to the pass instance because is internal the 317 /// PassManager and the instance we create here may already be freed. 318 AnalysisID TargetPassConfig::addPass(AnalysisID PassID) { 319 IdentifyingPassPtr TargetID = getPassSubstitution(PassID); 320 IdentifyingPassPtr FinalPtr = overridePass(PassID, TargetID); 321 if (!FinalPtr.isValid()) 322 return 0; 323 324 Pass *P; 325 if (FinalPtr.isInstance()) 326 P = FinalPtr.getInstance(); 327 else { 328 P = Pass::createPass(FinalPtr.getID()); 329 if (!P) 330 llvm_unreachable("Pass ID not registered"); 331 } 332 AnalysisID FinalID = P->getPassID(); 333 addPass(P); // Ends the lifetime of P. 334 335 // Add the passes after the pass P if there is any. 336 for (SmallVectorImpl<std::pair<AnalysisID, IdentifyingPassPtr> >::iterator 337 I = Impl->InsertedPasses.begin(), E = Impl->InsertedPasses.end(); 338 I != E; ++I) { 339 if ((*I).first == PassID) { 340 assert((*I).second.isValid() && "Illegal Pass ID!"); 341 Pass *NP; 342 if ((*I).second.isInstance()) 343 NP = (*I).second.getInstance(); 344 else { 345 NP = Pass::createPass((*I).second.getID()); 346 assert(NP && "Pass ID not registered"); 347 } 348 addPass(NP); 349 } 350 } 351 return FinalID; 352 } 353 354 void TargetPassConfig::printAndVerify(const char *Banner) { 355 if (TM->shouldPrintMachineCode()) 356 addPass(createMachineFunctionPrinterPass(dbgs(), Banner)); 357 358 if (VerifyMachineCode) 359 addPass(createMachineVerifierPass(Banner)); 360 } 361 362 /// Add common target configurable passes that perform LLVM IR to IR transforms 363 /// following machine independent optimization. 364 void TargetPassConfig::addIRPasses() { 365 // Basic AliasAnalysis support. 366 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that 367 // BasicAliasAnalysis wins if they disagree. This is intended to help 368 // support "obvious" type-punning idioms. 369 addPass(createTypeBasedAliasAnalysisPass()); 370 addPass(createBasicAliasAnalysisPass()); 371 372 // Before running any passes, run the verifier to determine if the input 373 // coming from the front-end and/or optimizer is valid. 374 if (!DisableVerify) 375 addPass(createVerifierPass()); 376 377 // Run loop strength reduction before anything else. 378 if (getOptLevel() != CodeGenOpt::None && !DisableLSR) { 379 addPass(createLoopStrengthReducePass()); 380 if (PrintLSR) 381 addPass(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs())); 382 } 383 384 addPass(createGCLoweringPass()); 385 386 // Make sure that no unreachable blocks are instruction selected. 387 addPass(createUnreachableBlockEliminationPass()); 388 } 389 390 /// Turn exception handling constructs into something the code generators can 391 /// handle. 392 void TargetPassConfig::addPassesToHandleExceptions() { 393 switch (TM->getMCAsmInfo()->getExceptionHandlingType()) { 394 case ExceptionHandling::SjLj: 395 // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both 396 // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise, 397 // catch info can get misplaced when a selector ends up more than one block 398 // removed from the parent invoke(s). This could happen when a landing 399 // pad is shared by multiple invokes and is also a target of a normal 400 // edge from elsewhere. 401 addPass(createSjLjEHPreparePass(TM)); 402 // FALLTHROUGH 403 case ExceptionHandling::DwarfCFI: 404 case ExceptionHandling::ARM: 405 case ExceptionHandling::Win64: 406 addPass(createDwarfEHPass(TM)); 407 break; 408 case ExceptionHandling::None: 409 addPass(createLowerInvokePass(TM)); 410 411 // The lower invoke pass may create unreachable code. Remove it. 412 addPass(createUnreachableBlockEliminationPass()); 413 break; 414 } 415 } 416 417 /// Add pass to prepare the LLVM IR for code generation. This should be done 418 /// before exception handling preparation passes. 419 void TargetPassConfig::addCodeGenPrepare() { 420 if (getOptLevel() != CodeGenOpt::None && !DisableCGP) 421 addPass(createCodeGenPreparePass(TM)); 422 } 423 424 /// Add common passes that perform LLVM IR to IR transforms in preparation for 425 /// instruction selection. 426 void TargetPassConfig::addISelPrepare() { 427 addPass(createStackProtectorPass(TM)); 428 429 addPreISel(); 430 431 if (PrintISelInput) 432 addPass(createPrintFunctionPass("\n\n" 433 "*** Final LLVM Code input to ISel ***\n", 434 &dbgs())); 435 436 // All passes which modify the LLVM IR are now complete; run the verifier 437 // to ensure that the IR is valid. 438 if (!DisableVerify) 439 addPass(createVerifierPass()); 440 } 441 442 /// Add the complete set of target-independent postISel code generator passes. 443 /// 444 /// This can be read as the standard order of major LLVM CodeGen stages. Stages 445 /// with nontrivial configuration or multiple passes are broken out below in 446 /// add%Stage routines. 447 /// 448 /// Any TargetPassConfig::addXX routine may be overriden by the Target. The 449 /// addPre/Post methods with empty header implementations allow injecting 450 /// target-specific fixups just before or after major stages. Additionally, 451 /// targets have the flexibility to change pass order within a stage by 452 /// overriding default implementation of add%Stage routines below. Each 453 /// technique has maintainability tradeoffs because alternate pass orders are 454 /// not well supported. addPre/Post works better if the target pass is easily 455 /// tied to a common pass. But if it has subtle dependencies on multiple passes, 456 /// the target should override the stage instead. 457 /// 458 /// TODO: We could use a single addPre/Post(ID) hook to allow pass injection 459 /// before/after any target-independent pass. But it's currently overkill. 460 void TargetPassConfig::addMachinePasses() { 461 // Insert a machine instr printer pass after the specified pass. 462 // If -print-machineinstrs specified, print machineinstrs after all passes. 463 if (StringRef(PrintMachineInstrs.getValue()).equals("")) 464 TM->Options.PrintMachineCode = true; 465 else if (!StringRef(PrintMachineInstrs.getValue()) 466 .equals("option-unspecified")) { 467 const PassRegistry *PR = PassRegistry::getPassRegistry(); 468 const PassInfo *TPI = PR->getPassInfo(PrintMachineInstrs.getValue()); 469 const PassInfo *IPI = PR->getPassInfo(StringRef("print-machineinstrs")); 470 assert (TPI && IPI && "Pass ID not registered!"); 471 const char *TID = (const char *)(TPI->getTypeInfo()); 472 const char *IID = (const char *)(IPI->getTypeInfo()); 473 insertPass(TID, IID); 474 } 475 476 // Print the instruction selected machine code... 477 printAndVerify("After Instruction Selection"); 478 479 // Expand pseudo-instructions emitted by ISel. 480 if (addPass(&ExpandISelPseudosID)) 481 printAndVerify("After ExpandISelPseudos"); 482 483 // Add passes that optimize machine instructions in SSA form. 484 if (getOptLevel() != CodeGenOpt::None) { 485 addMachineSSAOptimization(); 486 } else { 487 // If the target requests it, assign local variables to stack slots relative 488 // to one another and simplify frame index references where possible. 489 addPass(&LocalStackSlotAllocationID); 490 } 491 492 // Run pre-ra passes. 493 if (addPreRegAlloc()) 494 printAndVerify("After PreRegAlloc passes"); 495 496 // Run register allocation and passes that are tightly coupled with it, 497 // including phi elimination and scheduling. 498 if (getOptimizeRegAlloc()) 499 addOptimizedRegAlloc(createRegAllocPass(true)); 500 else 501 addFastRegAlloc(createRegAllocPass(false)); 502 503 // Run post-ra passes. 504 if (addPostRegAlloc()) 505 printAndVerify("After PostRegAlloc passes"); 506 507 // Insert prolog/epilog code. Eliminate abstract frame index references... 508 addPass(&PrologEpilogCodeInserterID); 509 printAndVerify("After PrologEpilogCodeInserter"); 510 511 /// Add passes that optimize machine instructions after register allocation. 512 if (getOptLevel() != CodeGenOpt::None) 513 addMachineLateOptimization(); 514 515 // Expand pseudo instructions before second scheduling pass. 516 addPass(&ExpandPostRAPseudosID); 517 printAndVerify("After ExpandPostRAPseudos"); 518 519 // Run pre-sched2 passes. 520 if (addPreSched2()) 521 printAndVerify("After PreSched2 passes"); 522 523 // Second pass scheduler. 524 if (getOptLevel() != CodeGenOpt::None) { 525 addPass(&PostRASchedulerID); 526 printAndVerify("After PostRAScheduler"); 527 } 528 529 // GC 530 if (addGCPasses()) { 531 if (PrintGCInfo) 532 addPass(createGCInfoPrinter(dbgs())); 533 } 534 535 // Basic block placement. 536 if (getOptLevel() != CodeGenOpt::None) 537 addBlockPlacement(); 538 539 if (addPreEmitPass()) 540 printAndVerify("After PreEmit passes"); 541 } 542 543 /// Add passes that optimize machine instructions in SSA form. 544 void TargetPassConfig::addMachineSSAOptimization() { 545 // Pre-ra tail duplication. 546 if (addPass(&EarlyTailDuplicateID)) 547 printAndVerify("After Pre-RegAlloc TailDuplicate"); 548 549 // Optimize PHIs before DCE: removing dead PHI cycles may make more 550 // instructions dead. 551 addPass(&OptimizePHIsID); 552 553 // This pass merges large allocas. StackSlotColoring is a different pass 554 // which merges spill slots. 555 addPass(&StackColoringID); 556 557 // If the target requests it, assign local variables to stack slots relative 558 // to one another and simplify frame index references where possible. 559 addPass(&LocalStackSlotAllocationID); 560 561 // With optimization, dead code should already be eliminated. However 562 // there is one known exception: lowered code for arguments that are only 563 // used by tail calls, where the tail calls reuse the incoming stack 564 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll). 565 addPass(&DeadMachineInstructionElimID); 566 printAndVerify("After codegen DCE pass"); 567 568 // Allow targets to insert passes that improve instruction level parallelism, 569 // like if-conversion. Such passes will typically need dominator trees and 570 // loop info, just like LICM and CSE below. 571 if (addILPOpts()) 572 printAndVerify("After ILP optimizations"); 573 574 addPass(&MachineLICMID); 575 addPass(&MachineCSEID); 576 addPass(&MachineSinkingID); 577 printAndVerify("After Machine LICM, CSE and Sinking passes"); 578 579 addPass(&PeepholeOptimizerID); 580 printAndVerify("After codegen peephole optimization pass"); 581 } 582 583 //===---------------------------------------------------------------------===// 584 /// Register Allocation Pass Configuration 585 //===---------------------------------------------------------------------===// 586 587 bool TargetPassConfig::getOptimizeRegAlloc() const { 588 switch (OptimizeRegAlloc) { 589 case cl::BOU_UNSET: return getOptLevel() != CodeGenOpt::None; 590 case cl::BOU_TRUE: return true; 591 case cl::BOU_FALSE: return false; 592 } 593 llvm_unreachable("Invalid optimize-regalloc state"); 594 } 595 596 /// RegisterRegAlloc's global Registry tracks allocator registration. 597 MachinePassRegistry RegisterRegAlloc::Registry; 598 599 /// A dummy default pass factory indicates whether the register allocator is 600 /// overridden on the command line. 601 static FunctionPass *useDefaultRegisterAllocator() { return 0; } 602 static RegisterRegAlloc 603 defaultRegAlloc("default", 604 "pick register allocator based on -O option", 605 useDefaultRegisterAllocator); 606 607 /// -regalloc=... command line option. 608 static cl::opt<RegisterRegAlloc::FunctionPassCtor, false, 609 RegisterPassParser<RegisterRegAlloc> > 610 RegAlloc("regalloc", 611 cl::init(&useDefaultRegisterAllocator), 612 cl::desc("Register allocator to use")); 613 614 615 /// Instantiate the default register allocator pass for this target for either 616 /// the optimized or unoptimized allocation path. This will be added to the pass 617 /// manager by addFastRegAlloc in the unoptimized case or addOptimizedRegAlloc 618 /// in the optimized case. 619 /// 620 /// A target that uses the standard regalloc pass order for fast or optimized 621 /// allocation may still override this for per-target regalloc 622 /// selection. But -regalloc=... always takes precedence. 623 FunctionPass *TargetPassConfig::createTargetRegisterAllocator(bool Optimized) { 624 if (Optimized) 625 return createGreedyRegisterAllocator(); 626 else 627 return createFastRegisterAllocator(); 628 } 629 630 /// Find and instantiate the register allocation pass requested by this target 631 /// at the current optimization level. Different register allocators are 632 /// defined as separate passes because they may require different analysis. 633 /// 634 /// This helper ensures that the regalloc= option is always available, 635 /// even for targets that override the default allocator. 636 /// 637 /// FIXME: When MachinePassRegistry register pass IDs instead of function ptrs, 638 /// this can be folded into addPass. 639 FunctionPass *TargetPassConfig::createRegAllocPass(bool Optimized) { 640 RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault(); 641 642 // Initialize the global default. 643 if (!Ctor) { 644 Ctor = RegAlloc; 645 RegisterRegAlloc::setDefault(RegAlloc); 646 } 647 if (Ctor != useDefaultRegisterAllocator) 648 return Ctor(); 649 650 // With no -regalloc= override, ask the target for a regalloc pass. 651 return createTargetRegisterAllocator(Optimized); 652 } 653 654 /// Add the minimum set of target-independent passes that are required for 655 /// register allocation. No coalescing or scheduling. 656 void TargetPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { 657 addPass(&PHIEliminationID); 658 addPass(&TwoAddressInstructionPassID); 659 660 addPass(RegAllocPass); 661 printAndVerify("After Register Allocation"); 662 } 663 664 /// Add standard target-independent passes that are tightly coupled with 665 /// optimized register allocation, including coalescing, machine instruction 666 /// scheduling, and register allocation itself. 667 void TargetPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { 668 addPass(&ProcessImplicitDefsID); 669 670 // LiveVariables currently requires pure SSA form. 671 // 672 // FIXME: Once TwoAddressInstruction pass no longer uses kill flags, 673 // LiveVariables can be removed completely, and LiveIntervals can be directly 674 // computed. (We still either need to regenerate kill flags after regalloc, or 675 // preferably fix the scavenger to not depend on them). 676 addPass(&LiveVariablesID); 677 678 // Add passes that move from transformed SSA into conventional SSA. This is a 679 // "copy coalescing" problem. 680 // 681 if (!EnableStrongPHIElim) { 682 // Edge splitting is smarter with machine loop info. 683 addPass(&MachineLoopInfoID); 684 addPass(&PHIEliminationID); 685 } 686 687 // Eventually, we want to run LiveIntervals before PHI elimination. 688 if (EarlyLiveIntervals) 689 addPass(&LiveIntervalsID); 690 691 addPass(&TwoAddressInstructionPassID); 692 693 if (EnableStrongPHIElim) 694 addPass(&StrongPHIEliminationID); 695 696 addPass(&RegisterCoalescerID); 697 698 // PreRA instruction scheduling. 699 if (addPass(&MachineSchedulerID)) 700 printAndVerify("After Machine Scheduling"); 701 702 // Add the selected register allocation pass. 703 addPass(RegAllocPass); 704 printAndVerify("After Register Allocation, before rewriter"); 705 706 // Allow targets to change the register assignments before rewriting. 707 if (addPreRewrite()) 708 printAndVerify("After pre-rewrite passes"); 709 710 // Finally rewrite virtual registers. 711 addPass(&VirtRegRewriterID); 712 printAndVerify("After Virtual Register Rewriter"); 713 714 // Perform stack slot coloring and post-ra machine LICM. 715 // 716 // FIXME: Re-enable coloring with register when it's capable of adding 717 // kill markers. 718 addPass(&StackSlotColoringID); 719 720 // Run post-ra machine LICM to hoist reloads / remats. 721 // 722 // FIXME: can this move into MachineLateOptimization? 723 addPass(&PostRAMachineLICMID); 724 725 printAndVerify("After StackSlotColoring and postra Machine LICM"); 726 } 727 728 //===---------------------------------------------------------------------===// 729 /// Post RegAlloc Pass Configuration 730 //===---------------------------------------------------------------------===// 731 732 /// Add passes that optimize machine instructions after register allocation. 733 void TargetPassConfig::addMachineLateOptimization() { 734 // Branch folding must be run after regalloc and prolog/epilog insertion. 735 if (addPass(&BranchFolderPassID)) 736 printAndVerify("After BranchFolding"); 737 738 // Tail duplication. 739 if (addPass(&TailDuplicateID)) 740 printAndVerify("After TailDuplicate"); 741 742 // Copy propagation. 743 if (addPass(&MachineCopyPropagationID)) 744 printAndVerify("After copy propagation pass"); 745 } 746 747 /// Add standard GC passes. 748 bool TargetPassConfig::addGCPasses() { 749 addPass(&GCMachineCodeAnalysisID); 750 return true; 751 } 752 753 /// Add standard basic block placement passes. 754 void TargetPassConfig::addBlockPlacement() { 755 if (addPass(&MachineBlockPlacementID)) { 756 // Run a separate pass to collect block placement statistics. 757 if (EnableBlockPlacementStats) 758 addPass(&MachineBlockPlacementStatsID); 759 760 printAndVerify("After machine block placement."); 761 } 762 } 763