1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===// 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 // Optimizations may be specified an arbitrary number of times on the command 11 // line, They are run in the order specified. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "BreakpointPrinter.h" 16 #include "NewPMDriver.h" 17 #include "PassPrinters.h" 18 #include "llvm/ADT/Triple.h" 19 #include "llvm/Analysis/CallGraph.h" 20 #include "llvm/Analysis/CallGraphSCCPass.h" 21 #include "llvm/Analysis/LoopPass.h" 22 #include "llvm/Analysis/RegionPass.h" 23 #include "llvm/Bitcode/BitcodeWriterPass.h" 24 #include "llvm/CodeGen/CommandFlags.h" 25 #include "llvm/IR/DataLayout.h" 26 #include "llvm/IR/IRPrintingPasses.h" 27 #include "llvm/IR/LLVMContext.h" 28 #include "llvm/IR/LegacyPassNameParser.h" 29 #include "llvm/IR/Module.h" 30 #include "llvm/IR/Verifier.h" 31 #include "llvm/IRReader/IRReader.h" 32 #include "llvm/InitializePasses.h" 33 #include "llvm/LinkAllIR.h" 34 #include "llvm/LinkAllPasses.h" 35 #include "llvm/MC/SubtargetFeature.h" 36 #include "llvm/PassManager.h" 37 #include "llvm/Support/Debug.h" 38 #include "llvm/Support/FileSystem.h" 39 #include "llvm/Support/ManagedStatic.h" 40 #include "llvm/Support/PluginLoader.h" 41 #include "llvm/Support/PrettyStackTrace.h" 42 #include "llvm/Support/Signals.h" 43 #include "llvm/Support/SourceMgr.h" 44 #include "llvm/Support/SystemUtils.h" 45 #include "llvm/Support/TargetRegistry.h" 46 #include "llvm/Support/TargetSelect.h" 47 #include "llvm/Support/ToolOutputFile.h" 48 #include "llvm/Target/TargetLibraryInfo.h" 49 #include "llvm/Target/TargetMachine.h" 50 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 51 #include <algorithm> 52 #include <memory> 53 using namespace llvm; 54 using namespace opt_tool; 55 56 // The OptimizationList is automatically populated with registered Passes by the 57 // PassNameParser. 58 // 59 static cl::list<const PassInfo*, bool, PassNameParser> 60 PassList(cl::desc("Optimizations available:")); 61 62 // This flag specifies a textual description of the optimization pass pipeline 63 // to run over the module. This flag switches opt to use the new pass manager 64 // infrastructure, completely disabling all of the flags specific to the old 65 // pass management. 66 static cl::opt<std::string> PassPipeline( 67 "passes", 68 cl::desc("A textual description of the pass pipeline for optimizing"), 69 cl::Hidden); 70 71 // Other command line options... 72 // 73 static cl::opt<std::string> 74 InputFilename(cl::Positional, cl::desc("<input bitcode file>"), 75 cl::init("-"), cl::value_desc("filename")); 76 77 static cl::opt<std::string> 78 OutputFilename("o", cl::desc("Override output filename"), 79 cl::value_desc("filename")); 80 81 static cl::opt<bool> 82 Force("f", cl::desc("Enable binary output on terminals")); 83 84 static cl::opt<bool> 85 PrintEachXForm("p", cl::desc("Print module after each transformation")); 86 87 static cl::opt<bool> 88 NoOutput("disable-output", 89 cl::desc("Do not write result bitcode file"), cl::Hidden); 90 91 static cl::opt<bool> 92 OutputAssembly("S", cl::desc("Write output as LLVM assembly")); 93 94 static cl::opt<bool> 95 NoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden); 96 97 static cl::opt<bool> 98 VerifyEach("verify-each", cl::desc("Verify after each transform")); 99 100 static cl::opt<bool> 101 StripDebug("strip-debug", 102 cl::desc("Strip debugger symbol info from translation unit")); 103 104 static cl::opt<bool> 105 DisableInline("disable-inlining", cl::desc("Do not run the inliner pass")); 106 107 static cl::opt<bool> 108 DisableOptimizations("disable-opt", 109 cl::desc("Do not run any optimization passes")); 110 111 static cl::opt<bool> 112 StandardCompileOpts("std-compile-opts", 113 cl::desc("Include the standard compile time optimizations")); 114 115 static cl::opt<bool> 116 StandardLinkOpts("std-link-opts", 117 cl::desc("Include the standard link time optimizations")); 118 119 static cl::opt<bool> 120 OptLevelO1("O1", 121 cl::desc("Optimization level 1. Similar to clang -O1")); 122 123 static cl::opt<bool> 124 OptLevelO2("O2", 125 cl::desc("Optimization level 2. Similar to clang -O2")); 126 127 static cl::opt<bool> 128 OptLevelOs("Os", 129 cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os")); 130 131 static cl::opt<bool> 132 OptLevelOz("Oz", 133 cl::desc("Like -Os but reduces code size further. Similar to clang -Oz")); 134 135 static cl::opt<bool> 136 OptLevelO3("O3", 137 cl::desc("Optimization level 3. Similar to clang -O3")); 138 139 static cl::opt<std::string> 140 TargetTriple("mtriple", cl::desc("Override target triple for module")); 141 142 static cl::opt<bool> 143 UnitAtATime("funit-at-a-time", 144 cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"), 145 cl::init(true)); 146 147 static cl::opt<bool> 148 DisableLoopUnrolling("disable-loop-unrolling", 149 cl::desc("Disable loop unrolling in all relevant passes"), 150 cl::init(false)); 151 static cl::opt<bool> 152 DisableLoopVectorization("disable-loop-vectorization", 153 cl::desc("Disable the loop vectorization pass"), 154 cl::init(false)); 155 156 static cl::opt<bool> 157 DisableSLPVectorization("disable-slp-vectorization", 158 cl::desc("Disable the slp vectorization pass"), 159 cl::init(false)); 160 161 162 static cl::opt<bool> 163 DisableSimplifyLibCalls("disable-simplify-libcalls", 164 cl::desc("Disable simplify-libcalls")); 165 166 static cl::opt<bool> 167 Quiet("q", cl::desc("Obsolete option"), cl::Hidden); 168 169 static cl::alias 170 QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); 171 172 static cl::opt<bool> 173 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization")); 174 175 static cl::opt<bool> 176 PrintBreakpoints("print-breakpoints-for-testing", 177 cl::desc("Print select breakpoints location for testing")); 178 179 static cl::opt<std::string> 180 DefaultDataLayout("default-data-layout", 181 cl::desc("data layout string to use if not specified by module"), 182 cl::value_desc("layout-string"), cl::init("")); 183 184 185 186 static inline void addPass(PassManagerBase &PM, Pass *P) { 187 // Add the pass to the pass manager... 188 PM.add(P); 189 190 // If we are verifying all of the intermediate steps, add the verifier... 191 if (VerifyEach) { 192 PM.add(createVerifierPass()); 193 PM.add(createDebugInfoVerifierPass()); 194 } 195 } 196 197 /// This routine adds optimization passes based on selected optimization level, 198 /// OptLevel. 199 /// 200 /// OptLevel - Optimization Level 201 static void AddOptimizationPasses(PassManagerBase &MPM,FunctionPassManager &FPM, 202 unsigned OptLevel, unsigned SizeLevel) { 203 FPM.add(createVerifierPass()); // Verify that input is correct 204 MPM.add(createDebugInfoVerifierPass()); // Verify that debug info is correct 205 206 PassManagerBuilder Builder; 207 Builder.OptLevel = OptLevel; 208 Builder.SizeLevel = SizeLevel; 209 210 if (DisableInline) { 211 // No inlining pass 212 } else if (OptLevel > 1) { 213 Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel); 214 } else { 215 Builder.Inliner = createAlwaysInlinerPass(); 216 } 217 Builder.DisableUnitAtATime = !UnitAtATime; 218 Builder.DisableUnrollLoops = (DisableLoopUnrolling.getNumOccurrences() > 0) ? 219 DisableLoopUnrolling : OptLevel == 0; 220 221 // This is final, unless there is a #pragma vectorize enable 222 if (DisableLoopVectorization) 223 Builder.LoopVectorize = false; 224 // If option wasn't forced via cmd line (-vectorize-loops, -loop-vectorize) 225 else if (!Builder.LoopVectorize) 226 Builder.LoopVectorize = OptLevel > 1 && SizeLevel < 2; 227 228 // When #pragma vectorize is on for SLP, do the same as above 229 Builder.SLPVectorize = 230 DisableSLPVectorization ? false : OptLevel > 1 && SizeLevel < 2; 231 232 Builder.populateFunctionPassManager(FPM); 233 Builder.populateModulePassManager(MPM); 234 } 235 236 static void AddStandardCompilePasses(PassManagerBase &PM) { 237 PM.add(createVerifierPass()); // Verify that input is correct 238 239 // If the -strip-debug command line option was specified, do it. 240 if (StripDebug) 241 addPass(PM, createStripSymbolsPass(true)); 242 243 // Verify debug info only after it's (possibly) stripped. 244 PM.add(createDebugInfoVerifierPass()); 245 246 if (DisableOptimizations) return; 247 248 // -std-compile-opts adds the same module passes as -O3. 249 PassManagerBuilder Builder; 250 if (!DisableInline) 251 Builder.Inliner = createFunctionInliningPass(); 252 Builder.OptLevel = 3; 253 Builder.populateModulePassManager(PM); 254 } 255 256 static void AddStandardLinkPasses(PassManagerBase &PM) { 257 PassManagerBuilder Builder; 258 Builder.VerifyInput = true; 259 Builder.StripDebug = StripDebug; 260 if (DisableOptimizations) 261 Builder.OptLevel = 0; 262 263 if (!DisableInline) 264 Builder.Inliner = createFunctionInliningPass(); 265 Builder.populateLTOPassManager(PM); 266 } 267 268 //===----------------------------------------------------------------------===// 269 // CodeGen-related helper functions. 270 // 271 272 CodeGenOpt::Level GetCodeGenOptLevel() { 273 if (OptLevelO1) 274 return CodeGenOpt::Less; 275 if (OptLevelO2) 276 return CodeGenOpt::Default; 277 if (OptLevelO3) 278 return CodeGenOpt::Aggressive; 279 return CodeGenOpt::None; 280 } 281 282 // Returns the TargetMachine instance or zero if no triple is provided. 283 static TargetMachine* GetTargetMachine(Triple TheTriple) { 284 std::string Error; 285 const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, 286 Error); 287 // Some modules don't specify a triple, and this is okay. 288 if (!TheTarget) { 289 return nullptr; 290 } 291 292 // Package up features to be passed to target/subtarget 293 std::string FeaturesStr; 294 if (MAttrs.size()) { 295 SubtargetFeatures Features; 296 for (unsigned i = 0; i != MAttrs.size(); ++i) 297 Features.AddFeature(MAttrs[i]); 298 FeaturesStr = Features.getString(); 299 } 300 301 return TheTarget->createTargetMachine(TheTriple.getTriple(), 302 MCPU, FeaturesStr, 303 InitTargetOptionsFromCodeGenFlags(), 304 RelocModel, CMModel, 305 GetCodeGenOptLevel()); 306 } 307 308 #ifdef LINK_POLLY_INTO_TOOLS 309 namespace polly { 310 void initializePollyPasses(llvm::PassRegistry &Registry); 311 } 312 #endif 313 314 //===----------------------------------------------------------------------===// 315 // main for opt 316 // 317 int main(int argc, char **argv) { 318 sys::PrintStackTraceOnErrorSignal(); 319 llvm::PrettyStackTraceProgram X(argc, argv); 320 321 // Enable debug stream buffering. 322 EnableDebugBuffering = true; 323 324 llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 325 LLVMContext &Context = getGlobalContext(); 326 327 InitializeAllTargets(); 328 InitializeAllTargetMCs(); 329 InitializeAllAsmPrinters(); 330 331 // Initialize passes 332 PassRegistry &Registry = *PassRegistry::getPassRegistry(); 333 initializeCore(Registry); 334 initializeDebugIRPass(Registry); 335 initializeScalarOpts(Registry); 336 initializeObjCARCOpts(Registry); 337 initializeVectorization(Registry); 338 initializeIPO(Registry); 339 initializeAnalysis(Registry); 340 initializeIPA(Registry); 341 initializeTransformUtils(Registry); 342 initializeInstCombine(Registry); 343 initializeInstrumentation(Registry); 344 initializeTarget(Registry); 345 // For codegen passes, only passes that do IR to IR transformation are 346 // supported. 347 initializeCodeGenPreparePass(Registry); 348 initializeAtomicExpandPass(Registry); 349 350 #ifdef LINK_POLLY_INTO_TOOLS 351 polly::initializePollyPasses(Registry); 352 #endif 353 354 cl::ParseCommandLineOptions(argc, argv, 355 "llvm .bc -> .bc modular optimizer and analysis printer\n"); 356 357 if (AnalyzeOnly && NoOutput) { 358 errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n"; 359 return 1; 360 } 361 362 SMDiagnostic Err; 363 364 // Load the input module... 365 std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context); 366 367 if (!M.get()) { 368 Err.print(argv[0], errs()); 369 return 1; 370 } 371 372 // If we are supposed to override the target triple, do so now. 373 if (!TargetTriple.empty()) 374 M->setTargetTriple(Triple::normalize(TargetTriple)); 375 376 // Figure out what stream we are supposed to write to... 377 std::unique_ptr<tool_output_file> Out; 378 if (NoOutput) { 379 if (!OutputFilename.empty()) 380 errs() << "WARNING: The -o (output filename) option is ignored when\n" 381 "the --disable-output option is used.\n"; 382 } else { 383 // Default to standard output. 384 if (OutputFilename.empty()) 385 OutputFilename = "-"; 386 387 std::error_code EC; 388 Out.reset(new tool_output_file(OutputFilename, EC, sys::fs::F_None)); 389 if (EC) { 390 errs() << EC.message() << '\n'; 391 return 1; 392 } 393 } 394 395 // If the output is set to be emitted to standard out, and standard out is a 396 // console, print out a warning message and refuse to do it. We don't 397 // impress anyone by spewing tons of binary goo to a terminal. 398 if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly) 399 if (CheckBitcodeOutputToConsole(Out->os(), !Quiet)) 400 NoOutput = true; 401 402 if (PassPipeline.getNumOccurrences() > 0) { 403 OutputKind OK = OK_NoOutput; 404 if (!NoOutput) 405 OK = OutputAssembly ? OK_OutputAssembly : OK_OutputBitcode; 406 407 VerifierKind VK = VK_VerifyInAndOut; 408 if (NoVerify) 409 VK = VK_NoVerifier; 410 else if (VerifyEach) 411 VK = VK_VerifyEachPass; 412 413 // The user has asked to use the new pass manager and provided a pipeline 414 // string. Hand off the rest of the functionality to the new code for that 415 // layer. 416 return runPassPipeline(argv[0], Context, *M.get(), Out.get(), PassPipeline, 417 OK, VK) 418 ? 0 419 : 1; 420 } 421 422 // Create a PassManager to hold and optimize the collection of passes we are 423 // about to build. 424 // 425 PassManager Passes; 426 427 // Add an appropriate TargetLibraryInfo pass for the module's triple. 428 TargetLibraryInfo *TLI = new TargetLibraryInfo(Triple(M->getTargetTriple())); 429 430 // The -disable-simplify-libcalls flag actually disables all builtin optzns. 431 if (DisableSimplifyLibCalls) 432 TLI->disableAllFunctions(); 433 Passes.add(TLI); 434 435 // Add an appropriate DataLayout instance for this module. 436 const DataLayout *DL = M.get()->getDataLayout(); 437 if (!DL && !DefaultDataLayout.empty()) { 438 M->setDataLayout(DefaultDataLayout); 439 DL = M.get()->getDataLayout(); 440 } 441 442 if (DL) 443 Passes.add(new DataLayoutPass()); 444 445 Triple ModuleTriple(M->getTargetTriple()); 446 TargetMachine *Machine = nullptr; 447 if (ModuleTriple.getArch()) 448 Machine = GetTargetMachine(Triple(ModuleTriple)); 449 std::unique_ptr<TargetMachine> TM(Machine); 450 451 // Add internal analysis passes from the target machine. 452 if (TM.get()) 453 TM->addAnalysisPasses(Passes); 454 455 std::unique_ptr<FunctionPassManager> FPasses; 456 if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { 457 FPasses.reset(new FunctionPassManager(M.get())); 458 if (DL) 459 FPasses->add(new DataLayoutPass()); 460 if (TM.get()) 461 TM->addAnalysisPasses(*FPasses); 462 463 } 464 465 if (PrintBreakpoints) { 466 // Default to standard output. 467 if (!Out) { 468 if (OutputFilename.empty()) 469 OutputFilename = "-"; 470 471 std::error_code EC; 472 Out.reset(new tool_output_file(OutputFilename, EC, sys::fs::F_None)); 473 if (EC) { 474 errs() << EC.message() << '\n'; 475 return 1; 476 } 477 } 478 Passes.add(createBreakpointPrinter(Out->os())); 479 NoOutput = true; 480 } 481 482 // If the -strip-debug command line option was specified, add it. If 483 // -std-compile-opts was also specified, it will handle StripDebug. 484 if (StripDebug && !StandardCompileOpts) 485 addPass(Passes, createStripSymbolsPass(true)); 486 487 // Create a new optimization pass for each one specified on the command line 488 for (unsigned i = 0; i < PassList.size(); ++i) { 489 // Check to see if -std-compile-opts was specified before this option. If 490 // so, handle it. 491 if (StandardCompileOpts && 492 StandardCompileOpts.getPosition() < PassList.getPosition(i)) { 493 AddStandardCompilePasses(Passes); 494 StandardCompileOpts = false; 495 } 496 497 if (StandardLinkOpts && 498 StandardLinkOpts.getPosition() < PassList.getPosition(i)) { 499 AddStandardLinkPasses(Passes); 500 StandardLinkOpts = false; 501 } 502 503 if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) { 504 AddOptimizationPasses(Passes, *FPasses, 1, 0); 505 OptLevelO1 = false; 506 } 507 508 if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) { 509 AddOptimizationPasses(Passes, *FPasses, 2, 0); 510 OptLevelO2 = false; 511 } 512 513 if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) { 514 AddOptimizationPasses(Passes, *FPasses, 2, 1); 515 OptLevelOs = false; 516 } 517 518 if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) { 519 AddOptimizationPasses(Passes, *FPasses, 2, 2); 520 OptLevelOz = false; 521 } 522 523 if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) { 524 AddOptimizationPasses(Passes, *FPasses, 3, 0); 525 OptLevelO3 = false; 526 } 527 528 const PassInfo *PassInf = PassList[i]; 529 Pass *P = nullptr; 530 if (PassInf->getTargetMachineCtor()) 531 P = PassInf->getTargetMachineCtor()(TM.get()); 532 else if (PassInf->getNormalCtor()) 533 P = PassInf->getNormalCtor()(); 534 else 535 errs() << argv[0] << ": cannot create pass: " 536 << PassInf->getPassName() << "\n"; 537 if (P) { 538 PassKind Kind = P->getPassKind(); 539 addPass(Passes, P); 540 541 if (AnalyzeOnly) { 542 switch (Kind) { 543 case PT_BasicBlock: 544 Passes.add(createBasicBlockPassPrinter(PassInf, Out->os(), Quiet)); 545 break; 546 case PT_Region: 547 Passes.add(createRegionPassPrinter(PassInf, Out->os(), Quiet)); 548 break; 549 case PT_Loop: 550 Passes.add(createLoopPassPrinter(PassInf, Out->os(), Quiet)); 551 break; 552 case PT_Function: 553 Passes.add(createFunctionPassPrinter(PassInf, Out->os(), Quiet)); 554 break; 555 case PT_CallGraphSCC: 556 Passes.add(createCallGraphPassPrinter(PassInf, Out->os(), Quiet)); 557 break; 558 default: 559 Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet)); 560 break; 561 } 562 } 563 } 564 565 if (PrintEachXForm) 566 Passes.add(createPrintModulePass(errs())); 567 } 568 569 // If -std-compile-opts was specified at the end of the pass list, add them. 570 if (StandardCompileOpts) { 571 AddStandardCompilePasses(Passes); 572 StandardCompileOpts = false; 573 } 574 575 if (StandardLinkOpts) { 576 AddStandardLinkPasses(Passes); 577 StandardLinkOpts = false; 578 } 579 580 if (OptLevelO1) 581 AddOptimizationPasses(Passes, *FPasses, 1, 0); 582 583 if (OptLevelO2) 584 AddOptimizationPasses(Passes, *FPasses, 2, 0); 585 586 if (OptLevelOs) 587 AddOptimizationPasses(Passes, *FPasses, 2, 1); 588 589 if (OptLevelOz) 590 AddOptimizationPasses(Passes, *FPasses, 2, 2); 591 592 if (OptLevelO3) 593 AddOptimizationPasses(Passes, *FPasses, 3, 0); 594 595 if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { 596 FPasses->doInitialization(); 597 for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F) 598 FPasses->run(*F); 599 FPasses->doFinalization(); 600 } 601 602 // Check that the module is well formed on completion of optimization 603 if (!NoVerify && !VerifyEach) { 604 Passes.add(createVerifierPass()); 605 Passes.add(createDebugInfoVerifierPass()); 606 } 607 608 // Write bitcode or assembly to the output as the last step... 609 if (!NoOutput && !AnalyzeOnly) { 610 if (OutputAssembly) 611 Passes.add(createPrintModulePass(Out->os())); 612 else 613 Passes.add(createBitcodeWriterPass(Out->os())); 614 } 615 616 // Before executing passes, print the final values of the LLVM options. 617 cl::PrintOptionValues(); 618 619 // Now that we have all of the passes ready, run them. 620 Passes.run(*M.get()); 621 622 // Declare success. 623 if (!NoOutput || PrintBreakpoints) 624 Out->keep(); 625 626 return 0; 627 } 628