176351aa57e99ab9a947b899e0677933f3a385b4dChris Lattner//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// Optimizations may be specified an arbitrary number of times on the command 11fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer// line, They are run in the order specified. 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 130eafc31684d6c512c6a56868031b8c1cc4ab4ed6Chris Lattner//===----------------------------------------------------------------------===// 14009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 158b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h" 160bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h" 17009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Module.h" 18fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner#include "llvm/PassManager.h" 1928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel#include "llvm/CallGraphSCCPass.h" 20b330e38f4ab1096403ade60028456cae9d0c67f3Chris Lattner#include "llvm/Bitcode/ReaderWriter.h" 21ffa6f9ca062d410ff25c8d11907f182d022f274dChris Lattner#include "llvm/Assembly/PrintModulePass.h" 2222d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner#include "llvm/Analysis/Verifier.h" 231bc89361c2ba023f305bf00edd4b5d95b021cac6Devang Patel#include "llvm/Analysis/LoopPass.h" 2465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#include "llvm/Analysis/RegionPass.h" 2528552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel#include "llvm/Analysis/CallGraph.h" 2607000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h" 272a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner#include "llvm/Target/TargetLibraryInfo.h" 2818fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve#include "llvm/Target/TargetMachine.h" 291be9980d065059e289fca739cbdcff74383dccbeDevang Patel#include "llvm/ADT/StringSet.h" 302a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner#include "llvm/ADT/Triple.h" 312053a2a2720ea93550b230da6ceac371014c20c2Chris Lattner#include "llvm/Support/PassNameParser.h" 321f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h" 3308fc0d30267340ef46751615cf6978336a25d0f8David Greene#include "llvm/Support/Debug.h" 3499ed416787e73b7965d9c183f23f9d78f996187fDan Gohman#include "llvm/Support/IRReader.h" 35c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 36551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h" 37c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 38551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/SystemUtils.h" 39e4f1a9b8a272ff7452759019ee7774e9dbdf1568Dan Gohman#include "llvm/Support/ToolOutputFile.h" 4062c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer#include "llvm/LinkAllPasses.h" 41af303d53e6013417d189621c75179df6c7cbdcdeReid Spencer#include "llvm/LinkAllVMCore.h" 423d453ac1317f910b0589d87c061f056be29e36cdRafael Espindola#include "llvm/Transforms/IPO/PassManagerBuilder.h" 4363202328d3dac33322f564889cd44126912102e6Chris Lattner#include <memory> 44c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner#include <algorithm> 45d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 4630af36808263fc256ead4fc50b639420b016a58dChris Lattner 47c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// The OptimizationList is automatically populated with registered Passes by the 48c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// PassNameParser. 49fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner// 507f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris Lattnerstatic cl::list<const PassInfo*, bool, PassNameParser> 517f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris LattnerPassList(cl::desc("Optimizations available:")); 52009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 53c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// Other command line options... 54fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner// 556c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string> 56a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherInputFilename(cl::Positional, cl::desc("<input bitcode file>"), 57fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer cl::init("-"), cl::value_desc("filename")); 585ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 596c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string> 605ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"), 6186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman cl::value_desc("filename")); 625ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 635ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 64baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals")); 655ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 665ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 675ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerPrintEachXForm("p", cl::desc("Print module after each transformation")); 685ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 695ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 70ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoOutput("disable-output", 71a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif cl::desc("Do not write result bitcode file"), cl::Hidden); 72d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner 73d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattnerstatic cl::opt<bool> 7481b0b64298fb06f225a9544440bb7b230ccf3c35Duncan SandsOutputAssembly("S", cl::desc("Write output as LLVM assembly")); 758c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbar 768c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbarstatic cl::opt<bool> 77ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden); 78f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner 79f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattnerstatic cl::opt<bool> 8074ed997d527d35d27690feb5c648489c638947c9Reid SpencerVerifyEach("verify-each", cl::desc("Verify after each transform")); 8174ed997d527d35d27690feb5c648489c638947c9Reid Spencer 8274ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool> 8374ed997d527d35d27690feb5c648489c638947c9Reid SpencerStripDebug("strip-debug", 8474ed997d527d35d27690feb5c648489c638947c9Reid Spencer cl::desc("Strip debugger symbol info from translation unit")); 8574ed997d527d35d27690feb5c648489c638947c9Reid Spencer 8674ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool> 8774ed997d527d35d27690feb5c648489c638947c9Reid SpencerDisableInline("disable-inlining", cl::desc("Do not run the inliner pass")); 8874ed997d527d35d27690feb5c648489c638947c9Reid Spencer 89a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool> 90a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherDisableOptimizations("disable-opt", 9174ed997d527d35d27690feb5c648489c638947c9Reid Spencer cl::desc("Do not run any optimization passes")); 9274ed997d527d35d27690feb5c648489c638947c9Reid Spencer 93a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool> 94adc82888b5be1d43caa94e9247f19927ef70f621Daniel DunbarDisableInternalize("disable-internalize", 95adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar cl::desc("Do not mark all symbols as internal")); 96adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 9774ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool> 98a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardCompileOpts("std-compile-opts", 9974ed997d527d35d27690feb5c648489c638947c9Reid Spencer cl::desc("Include the standard compile time optimizations")); 10074ed997d527d35d27690feb5c648489c638947c9Reid Spencer 10174ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool> 102a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardLinkOpts("std-link-opts", 103adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar cl::desc("Include the standard link time optimizations")); 104adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 105adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbarstatic cl::opt<bool> 1062d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO1("O1", 1078bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth cl::desc("Optimization level 1. Similar to clang -O1")); 1082d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 1092d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool> 1102d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO2("O2", 1118bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth cl::desc("Optimization level 2. Similar to clang -O2")); 1128bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 1138bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool> 1148bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOs("Os", 1158bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os")); 1168bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 1178bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool> 1188bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOz("Oz", 1198bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth cl::desc("Like -Os but reduces code size further. Similar to clang -Oz")); 1202d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 1212d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool> 1222d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO3("O3", 1238bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth cl::desc("Optimization level 3. Similar to clang -O3")); 1242d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 125e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groffstatic cl::opt<std::string> 126e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe GroffTargetTriple("mtriple", cl::desc("Override target triple for module")); 127e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff 1282d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool> 1292d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelUnitAtATime("funit-at-a-time", 130c4769ba20432c19eff68d7802c9a836ada2424e6Eric Christopher cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time"), 1313472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands cl::init(true)); 1322d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 1332d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool> 1342d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelDisableSimplifyLibCalls("disable-simplify-libcalls", 135442b1aa94b4544555aceb9a5d5f2a72f2a9132c6Devang Patel cl::desc("Disable simplify-libcalls")); 1362d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 1372d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool> 1383153e4fc80badcd3f7f87d20df86027d20964469Chris LattnerQuiet("q", cl::desc("Obsolete option"), cl::Hidden); 1395ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 140ec7eb45926dc40a80534bad729be825bf129a126Reid Spencerstatic cl::alias 141ec7eb45926dc40a80534bad729be825bf129a126Reid SpencerQuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); 142ec7eb45926dc40a80534bad729be825bf129a126Reid Spencer 143fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstatic cl::opt<bool> 144fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid SpencerAnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization")); 145fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 146f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patelstatic cl::opt<bool> 147a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickPrintBreakpoints("print-breakpoints-for-testing", 148f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel cl::desc("Print select breakpoints location for testing")); 149f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 150d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattnerstatic cl::opt<std::string> 151a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickDefaultDataLayout("default-data-layout", 152d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner cl::desc("data layout string to use if not specified by module"), 153d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner cl::value_desc("layout-string"), cl::init("")); 154d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner 155fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer// ---------- Define Printers for module and function passes ------------ 156fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencernamespace { 157fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 15828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patelstruct CallGraphSCCPassPrinter : public CallGraphSCCPass { 15928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel static char ID; 16028552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel const PassInfo *PassToPrint; 1614931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman raw_ostream &Out; 1624207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassName; 1634207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 1644931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out) : 1654207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser CallGraphSCCPass(ID), PassToPrint(PI), Out(out) { 1664207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 1674207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser PassName = "CallGraphSCCPass Printer: " + PassToPrintName; 1684207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser } 16928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel 1702decb22222cac46bb1d9163e7b89d7e5be8ef65fChris Lattner virtual bool runOnSCC(CallGraphSCC &SCC) { 171e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (!Quiet) 1724931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 17328552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel 17428552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel // Get and print pass... 175e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 176e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser Function *F = (*I)->getFunction(); 177e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (F) 178e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, 179e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser F->getParent()); 180e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser } 18128552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel return false; 18228552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel } 183a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher 1844207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 18528552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel 18628552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 18790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AU.addRequiredID(PassToPrint->getTypeInfo()); 18828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel AU.setPreservesAll(); 18928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel } 19028552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel}; 19128552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel 19228552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patelchar CallGraphSCCPassPrinter::ID = 0; 19328552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel 194fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct ModulePassPrinter : public ModulePass { 1951997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 196fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer const PassInfo *PassToPrint; 1974931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman raw_ostream &Out; 1984207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassName; 1994207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 2004931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman ModulePassPrinter(const PassInfo *PI, raw_ostream &out) 2014207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser : ModulePass(ID), PassToPrint(PI), Out(out) { 2024207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 2034207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser PassName = "ModulePass Printer: " + PassToPrintName; 2044207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser } 205fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 206fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual bool runOnModule(Module &M) { 207e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (!Quiet) 2084931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 209fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 210fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer // Get and print pass... 211e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M); 212fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer return false; 213fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 214fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 2154207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 216fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 217fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual void getAnalysisUsage(AnalysisUsage &AU) const { 21890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AU.addRequiredID(PassToPrint->getTypeInfo()); 219fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer AU.setPreservesAll(); 220fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 221fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer}; 222fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 2231997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar ModulePassPrinter::ID = 0; 224fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct FunctionPassPrinter : public FunctionPass { 225fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer const PassInfo *PassToPrint; 2264931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman raw_ostream &Out; 2271997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 2284207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassName; 2294207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 2304931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman FunctionPassPrinter(const PassInfo *PI, raw_ostream &out) 2314207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser : FunctionPass(ID), PassToPrint(PI), Out(out) { 2324207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 2334207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser PassName = "FunctionPass Printer: " + PassToPrintName; 2344207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser } 235fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 236fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual bool runOnFunction(Function &F) { 237e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (!Quiet) 2384931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman Out << "Printing analysis '" << PassToPrint->getPassName() 2394931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman << "' for function '" << F.getName() << "':\n"; 240e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser 241fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer // Get and print pass... 2424931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, 24390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson F.getParent()); 244fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer return false; 245fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 246fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 2474207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 248fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 249fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual void getAnalysisUsage(AnalysisUsage &AU) const { 25090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AU.addRequiredID(PassToPrint->getTypeInfo()); 251fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer AU.setPreservesAll(); 252fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 253fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer}; 254fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 2551997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar FunctionPassPrinter::ID = 0; 25656fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel 25756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patelstruct LoopPassPrinter : public LoopPass { 25856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel static char ID; 25956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel const PassInfo *PassToPrint; 2604931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman raw_ostream &Out; 2614207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassName; 2624207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 2634931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman LoopPassPrinter(const PassInfo *PI, raw_ostream &out) : 2644207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser LoopPass(ID), PassToPrint(PI), Out(out) { 2654207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 2664207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser PassName = "LoopPass Printer: " + PassToPrintName; 2674207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser } 2684207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 26956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel 27056fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel virtual bool runOnLoop(Loop *L, LPPassManager &LPM) { 271e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (!Quiet) 2724931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; 273e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser 27456fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel // Get and print pass... 275e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, 276e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser L->getHeader()->getParent()->getParent()); 27756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel return false; 27856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel } 279a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher 2804207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 28156fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel 28256fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 28390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AU.addRequiredID(PassToPrint->getTypeInfo()); 28456fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel AU.setPreservesAll(); 28556fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel } 28656fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel}; 28756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel 28856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patelchar LoopPassPrinter::ID = 0; 28956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel 29065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserstruct RegionPassPrinter : public RegionPass { 29165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser static char ID; 29265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser const PassInfo *PassToPrint; 29365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser raw_ostream &Out; 29465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser std::string PassName; 29565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 29665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RegionPassPrinter(const PassInfo *PI, raw_ostream &out) : RegionPass(ID), 29765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PassToPrint(PI), Out(out) { 29865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 2995839614d977a18a3eef4e03b8aae6d2e12ecb2c7Tobias Grosser PassName = "RegionPass Printer: " + PassToPrintName; 30065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 30165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 30265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser virtual bool runOnRegion(Region *R, RGPassManager &RGM) { 30365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (!Quiet) { 30465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Out << "Printing analysis '" << PassToPrint->getPassName() << "' for " 305a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer << "region: '" << R->getNameStr() << "' in function '" 306a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer << R->getEntry()->getParent()->getName() << "':\n"; 30765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 30865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Get and print pass... 30965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, 31065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser R->getEntry()->getParent()->getParent()); 31165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser return false; 31265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 31365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 3145839614d977a18a3eef4e03b8aae6d2e12ecb2c7Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 31565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 31665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser virtual void getAnalysisUsage(AnalysisUsage &AU) const { 31765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser AU.addRequiredID(PassToPrint->getTypeInfo()); 31865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser AU.setPreservesAll(); 31965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 32065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser}; 32165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 32265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserchar RegionPassPrinter::ID = 0; 32365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 324fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct BasicBlockPassPrinter : public BasicBlockPass { 325fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer const PassInfo *PassToPrint; 3264931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman raw_ostream &Out; 3271997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 3284207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassName; 3294207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser 3304931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out) 3314207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser : BasicBlockPass(ID), PassToPrint(PI), Out(out) { 3324207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser std::string PassToPrintName = PassToPrint->getPassName(); 3334207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser PassName = "BasicBlockPass Printer: " + PassToPrintName; 3344207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser } 335fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 336fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual bool runOnBasicBlock(BasicBlock &BB) { 337e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser if (!Quiet) 3384931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman Out << "Printing Analysis info for BasicBlock '" << BB.getName() 3394931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman << "': Pass " << PassToPrint->getPassName() << ":\n"; 340fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 341fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer // Get and print pass... 342a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, 34390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson BB.getParent()->getParent()); 344fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer return false; 345fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 346fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 3474207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser virtual const char *getPassName() const { return PassName.c_str(); } 348fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 349fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer virtual void getAnalysisUsage(AnalysisUsage &AU) const { 35090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AU.addRequiredID(PassToPrint->getTypeInfo()); 351fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer AU.setPreservesAll(); 352fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer } 353fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer}; 354fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 3551997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar BasicBlockPassPrinter::ID = 0; 356f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 3571be9980d065059e289fca739cbdcff74383dccbeDevang Patelstruct BreakpointPrinter : public ModulePass { 358f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel raw_ostream &Out; 359f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel static char ID; 360f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 361f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel BreakpointPrinter(raw_ostream &out) 3621be9980d065059e289fca739cbdcff74383dccbeDevang Patel : ModulePass(ID), Out(out) { 363f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 364f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 3651be9980d065059e289fca739cbdcff74383dccbeDevang Patel void getContextName(DIDescriptor Context, std::string &N) { 3661be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (Context.isNameSpace()) { 3671be9980d065059e289fca739cbdcff74383dccbeDevang Patel DINameSpace NS(Context); 3681be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (!NS.getName().empty()) { 3691be9980d065059e289fca739cbdcff74383dccbeDevang Patel getContextName(NS.getContext(), N); 3701be9980d065059e289fca739cbdcff74383dccbeDevang Patel N = N + NS.getName().str() + "::"; 3711be9980d065059e289fca739cbdcff74383dccbeDevang Patel } 3721be9980d065059e289fca739cbdcff74383dccbeDevang Patel } else if (Context.isType()) { 3731be9980d065059e289fca739cbdcff74383dccbeDevang Patel DIType TY(Context); 3741be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (!TY.getName().empty()) { 3751be9980d065059e289fca739cbdcff74383dccbeDevang Patel getContextName(TY.getContext(), N); 3761be9980d065059e289fca739cbdcff74383dccbeDevang Patel N = N + TY.getName().str() + "::"; 3771be9980d065059e289fca739cbdcff74383dccbeDevang Patel } 3781be9980d065059e289fca739cbdcff74383dccbeDevang Patel } 3791be9980d065059e289fca739cbdcff74383dccbeDevang Patel } 3801be9980d065059e289fca739cbdcff74383dccbeDevang Patel 3811be9980d065059e289fca739cbdcff74383dccbeDevang Patel virtual bool runOnModule(Module &M) { 3821be9980d065059e289fca739cbdcff74383dccbeDevang Patel StringSet<> Processed; 3831be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) 3841be9980d065059e289fca739cbdcff74383dccbeDevang Patel for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 3851be9980d065059e289fca739cbdcff74383dccbeDevang Patel std::string Name; 3861be9980d065059e289fca739cbdcff74383dccbeDevang Patel DISubprogram SP(NMD->getOperand(i)); 3871be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (SP.Verify()) 3881be9980d065059e289fca739cbdcff74383dccbeDevang Patel getContextName(SP.getContext(), Name); 3891be9980d065059e289fca739cbdcff74383dccbeDevang Patel Name = Name + SP.getDisplayName().str(); 3901be9980d065059e289fca739cbdcff74383dccbeDevang Patel if (!Name.empty() && Processed.insert(Name)) { 3911be9980d065059e289fca739cbdcff74383dccbeDevang Patel Out << Name << "\n"; 3921be9980d065059e289fca739cbdcff74383dccbeDevang Patel } 39397f6d5b24136ac19d5f83c1ee9541b05f0eccebdDevang Patel } 394f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel return false; 395f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 396f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 397f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 398f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel AU.setPreservesAll(); 399f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 400f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel}; 40152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner 40252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner} // anonymous namespace 403f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 404f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patelchar BreakpointPrinter::ID = 0; 405f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 40652b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic inline void addPass(PassManagerBase &PM, Pass *P) { 40774ed997d527d35d27690feb5c648489c638947c9Reid Spencer // Add the pass to the pass manager... 40874ed997d527d35d27690feb5c648489c638947c9Reid Spencer PM.add(P); 40974ed997d527d35d27690feb5c648489c638947c9Reid Spencer 41074ed997d527d35d27690feb5c648489c638947c9Reid Spencer // If we are verifying all of the intermediate steps, add the verifier... 41174ed997d527d35d27690feb5c648489c638947c9Reid Spencer if (VerifyEach) PM.add(createVerifierPass()); 41274ed997d527d35d27690feb5c648489c638947c9Reid Spencer} 41374ed997d527d35d27690feb5c648489c638947c9Reid Spencer 414a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// AddOptimizationPasses - This routine adds optimization passes 415a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// based on selected optimization level, OptLevel. This routine 4162d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// duplicates llvm-gcc behaviour. 4172d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// 4182d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// OptLevel - Optimization Level 41952b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddOptimizationPasses(PassManagerBase &MPM,FunctionPassManager &FPM, 4208bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth unsigned OptLevel, unsigned SizeLevel) { 421a3e585d4c2e7829ae854bc0049d904db6a989f4bDuncan Sands FPM.add(createVerifierPass()); // Verify that input is correct 422a3e585d4c2e7829ae854bc0049d904db6a989f4bDuncan Sands 42352b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner PassManagerBuilder Builder; 42452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.OptLevel = OptLevel; 4258bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth Builder.SizeLevel = SizeLevel; 426ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar 42774733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman if (DisableInline) { 42874733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman // No inlining pass 42942d41fda0873c27b81e18662f5746783a974301dEli Friedman } else if (OptLevel > 1) { 430e6c6cec82bee4f419645577bffbc1f56d4c90f34Jakob Stoklund Olesen unsigned Threshold = 225; 4318bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (SizeLevel == 1) // -Os 4328bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth Threshold = 75; 4338bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth else if (SizeLevel == 2) // -Oz 4348bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth Threshold = 25; 43574733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman if (OptLevel > 2) 436e6c6cec82bee4f419645577bffbc1f56d4c90f34Jakob Stoklund Olesen Threshold = 275; 43752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.Inliner = createFunctionInliningPass(Threshold); 43874733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman } else { 43952b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.Inliner = createAlwaysInlinerPass(); 44074733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman } 44152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.DisableUnitAtATime = !UnitAtATime; 44252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.DisableUnrollLoops = OptLevel == 0; 44352b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.DisableSimplifyLibCalls = DisableSimplifyLibCalls; 44452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner 44552b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.populateFunctionPassManager(FPM); 44652b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.populateModulePassManager(MPM); 4472d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel} 4482d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 44952b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddStandardCompilePasses(PassManagerBase &PM) { 45074ed997d527d35d27690feb5c648489c638947c9Reid Spencer PM.add(createVerifierPass()); // Verify that input is correct 45174ed997d527d35d27690feb5c648489c638947c9Reid Spencer 45274ed997d527d35d27690feb5c648489c638947c9Reid Spencer // If the -strip-debug command line option was specified, do it. 45374ed997d527d35d27690feb5c648489c638947c9Reid Spencer if (StripDebug) 45474ed997d527d35d27690feb5c648489c638947c9Reid Spencer addPass(PM, createStripSymbolsPass(true)); 45574ed997d527d35d27690feb5c648489c638947c9Reid Spencer 45674ed997d527d35d27690feb5c648489c638947c9Reid Spencer if (DisableOptimizations) return; 45774ed997d527d35d27690feb5c648489c638947c9Reid Spencer 458ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar // -std-compile-opts adds the same module passes as -O3. 45952b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner PassManagerBuilder Builder; 46052b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner if (!DisableInline) 46152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.Inliner = createFunctionInliningPass(); 46252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.OptLevel = 3; 46352b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.DisableSimplifyLibCalls = DisableSimplifyLibCalls; 46452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.populateModulePassManager(PM); 46574ed997d527d35d27690feb5c648489c638947c9Reid Spencer} 46674ed997d527d35d27690feb5c648489c638947c9Reid Spencer 46752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddStandardLinkPasses(PassManagerBase &PM) { 468adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar PM.add(createVerifierPass()); // Verify that input is correct 469adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 470adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar // If the -strip-debug command line option was specified, do it. 471adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar if (StripDebug) 472adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar addPass(PM, createStripSymbolsPass(true)); 473adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 474adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar if (DisableOptimizations) return; 475adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 47652b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner PassManagerBuilder Builder; 47752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner Builder.populateLTOPassManager(PM, /*Internalize=*/ !DisableInternalize, 47852b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner /*RunInliner=*/ !DisableInline); 479adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar} 480adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 481009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 482c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//===----------------------------------------------------------------------===// 483c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// main for opt 484c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// 4858f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) { 486c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner sys::PrintStackTraceOnErrorSignal(); 487c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner llvm::PrettyStackTraceProgram X(argc, argv); 488d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman 48908fc0d30267340ef46751615cf6978336a25d0f8David Greene // Enable debug stream buffering. 49008fc0d30267340ef46751615cf6978336a25d0f8David Greene EnableDebugBuffering = true; 49108fc0d30267340ef46751615cf6978336a25d0f8David Greene 492c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 4930d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson LLVMContext &Context = getGlobalContext(); 494a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 495081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson // Initialize passes 496081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson PassRegistry &Registry = *PassRegistry::getPassRegistry(); 497081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeCore(Registry); 498081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeScalarOpts(Registry); 499de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel initializeVectorization(Registry); 500081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeIPO(Registry); 501081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeAnalysis(Registry); 502081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeIPA(Registry); 503081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeTransformUtils(Registry); 504081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeInstCombine(Registry); 505081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeInstrumentation(Registry); 506081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeTarget(Registry); 507a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 50861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner cl::ParseCommandLineOptions(argc, argv, 50961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner "llvm .bc -> .bc modular optimizer and analysis printer\n"); 5101ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 5117593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser if (AnalyzeOnly && NoOutput) { 5127593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n"; 5137593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser return 1; 5147593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser } 5157593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser 51661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner SMDiagnostic Err; 5171ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 51861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Load the input module... 51961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner std::auto_ptr<Module> M; 52061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner M.reset(ParseIRFile(InputFilename, Err, Context)); 521a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher 52261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (M.get() == 0) { 523d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner Err.print(argv[0], errs()); 52461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner return 1; 52561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 526697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner 527e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff // If we are supposed to override the target triple, do so now. 528e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff if (!TargetTriple.empty()) 529e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff M->setTargetTriple(Triple::normalize(TargetTriple)); 530e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff 53161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Figure out what stream we are supposed to write to... 532d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman OwningPtr<tool_output_file> Out; 5334931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman if (NoOutput) { 53486cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman if (!OutputFilename.empty()) 53586cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman errs() << "WARNING: The -o (output filename) option is ignored when\n" 5364931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman "the --disable-output option is used.\n"; 53786cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman } else { 53886cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman // Default to standard output. 53986cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman if (OutputFilename.empty()) 54086cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman OutputFilename = "-"; 54186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman 54286cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman std::string ErrorInfo; 543d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo, 544d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman raw_fd_ostream::F_Binary)); 54586cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman if (!ErrorInfo.empty()) { 54686cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman errs() << ErrorInfo << '\n'; 54786cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman return 1; 548009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 54961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 55076d12299b5333d71bfc079614031f97c97aa5148Chris Lattner 55161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // If the output is set to be emitted to standard out, and standard out is a 55261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // console, print out a warning message and refuse to do it. We don't 55361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // impress anyone by spewing tons of binary goo to a terminal. 554b56bf581a3bd8feb3eb454b30ab171bc5131e17cDan Gohman if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly) 555d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman if (CheckBitcodeOutputToConsole(Out->os(), !Quiet)) 55661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner NoOutput = true; 55761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 55861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Create a PassManager to hold and optimize the collection of passes we are 5592a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner // about to build. 56061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // 56161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner PassManager Passes; 56261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 5632a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner // Add an appropriate TargetLibraryInfo pass for the module's triple. 564188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner TargetLibraryInfo *TLI = new TargetLibraryInfo(Triple(M->getTargetTriple())); 565a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 566188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner // The -disable-simplify-libcalls flag actually disables all builtin optzns. 567188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner if (DisableSimplifyLibCalls) 568188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner TLI->disableAllFunctions(); 569188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner Passes.add(TLI); 570a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 5712a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner // Add an appropriate TargetData instance for this module. 57261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner TargetData *TD = 0; 57361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner const std::string &ModuleDataLayout = M.get()->getDataLayout(); 57461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (!ModuleDataLayout.empty()) 57561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner TD = new TargetData(ModuleDataLayout); 576b908f8ad6a38d989c7f769e329d778e563c398f4Kenneth Uildriks else if (!DefaultDataLayout.empty()) 57761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner TD = new TargetData(DefaultDataLayout); 57861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 57961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (TD) 58061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner Passes.add(TD); 58161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 58252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner OwningPtr<FunctionPassManager> FPasses; 5838bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { 58452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner FPasses.reset(new FunctionPassManager(M.get())); 585d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner if (TD) 58661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner FPasses->add(new TargetData(*TD)); 58761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 588a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher 589f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel if (PrintBreakpoints) { 590f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel // Default to standard output. 591f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel if (!Out) { 592f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel if (OutputFilename.empty()) 593f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel OutputFilename = "-"; 594a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 595f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel std::string ErrorInfo; 596f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo, 597f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel raw_fd_ostream::F_Binary)); 598f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel if (!ErrorInfo.empty()) { 599f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel errs() << ErrorInfo << '\n'; 600f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel return 1; 601f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 602f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 603f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel Passes.add(new BreakpointPrinter(Out->os())); 604f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel NoOutput = true; 605f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel } 606f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel 60761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // If the -strip-debug command line option was specified, add it. If 60861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // -std-compile-opts was also specified, it will handle StripDebug. 60961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (StripDebug && !StandardCompileOpts) 61061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner addPass(Passes, createStripSymbolsPass(true)); 61161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 61261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Create a new optimization pass for each one specified on the command line 61361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner for (unsigned i = 0; i < PassList.size(); ++i) { 61461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Check to see if -std-compile-opts was specified before this option. If 61561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // so, handle it. 61661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (StandardCompileOpts && 61761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner StandardCompileOpts.getPosition() < PassList.getPosition(i)) { 6183dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner AddStandardCompilePasses(Passes); 6193dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner StandardCompileOpts = false; 620a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher } 621fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner 62261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (StandardLinkOpts && 62361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner StandardLinkOpts.getPosition() < PassList.getPosition(i)) { 624adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar AddStandardLinkPasses(Passes); 625adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar StandardLinkOpts = false; 626a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher } 627adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar 62861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) { 6298bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 1, 0); 63061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner OptLevelO1 = false; 631adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar } 6322d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 63361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) { 6348bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 0); 63561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner OptLevelO2 = false; 636adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar } 6372d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 6388bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) { 6398bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 1); 6408bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth OptLevelOs = false; 6418bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth } 6428bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 6438bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) { 6448bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 2); 6458bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth OptLevelOz = false; 6468bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth } 6478bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 64861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) { 6498bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 3, 0); 65061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner OptLevelO3 = false; 651adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar } 6522d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 65361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner const PassInfo *PassInf = PassList[i]; 65461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner Pass *P = 0; 65561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (PassInf->getNormalCtor()) 65661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner P = PassInf->getNormalCtor()(); 65761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner else 65861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner errs() << argv[0] << ": cannot create pass: " 65961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner << PassInf->getPassName() << "\n"; 66061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (P) { 6613460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer PassKind Kind = P->getPassKind(); 66261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner addPass(Passes, P); 66361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 66461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (AnalyzeOnly) { 6653460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer switch (Kind) { 666476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner case PT_BasicBlock: 667d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(new BasicBlockPassPrinter(PassInf, Out->os())); 668476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner break; 66965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser case PT_Region: 67065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Passes.add(new RegionPassPrinter(PassInf, Out->os())); 67165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser break; 672476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner case PT_Loop: 673d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(new LoopPassPrinter(PassInf, Out->os())); 674476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner break; 675476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner case PT_Function: 676d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(new FunctionPassPrinter(PassInf, Out->os())); 677476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner break; 678476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner case PT_CallGraphSCC: 679d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(new CallGraphSCCPassPrinter(PassInf, Out->os())); 680476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner break; 681476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner default: 682d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(new ModulePassPrinter(PassInf, Out->os())); 683476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner break; 684476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner } 68561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 6862d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel } 6872d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel 68861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (PrintEachXForm) 68961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner Passes.add(createPrintModulePass(&errs())); 69061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 69122d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner 69261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // If -std-compile-opts was specified at the end of the pass list, add them. 69361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (StandardCompileOpts) { 69461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner AddStandardCompilePasses(Passes); 69561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner StandardCompileOpts = false; 69661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 697fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner 69861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (StandardLinkOpts) { 69961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner AddStandardLinkPasses(Passes); 70061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner StandardLinkOpts = false; 70161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 702009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 70361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO1) 7048bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 1, 0); 70561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 70661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO2) 7078bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 0); 7088bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 7098bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelOs) 7108bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 1); 7118bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth 7128bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelOz) 7138bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 2, 2); 714fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer 71561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OptLevelO3) 7168bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth AddOptimizationPasses(Passes, *FPasses, 3, 0); 71761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 7188bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { 7193e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner FPasses->doInitialization(); 72052b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F) 72152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner FPasses->run(*F); 7223e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner FPasses->doFinalization(); 7233e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner } 72461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 72561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Check that the module is well formed on completion of optimization 72661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (!NoVerify && !VerifyEach) 72761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner Passes.add(createVerifierPass()); 72861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 7294931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman // Write bitcode or assembly to the output as the last step... 73061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (!NoOutput && !AnalyzeOnly) { 73161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner if (OutputAssembly) 732d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(createPrintModulePass(&Out->os())); 73361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner else 734d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Passes.add(createBitcodeWriterPass(Out->os())); 73561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner } 73661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 737ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Before executing passes, print the final values of the LLVM options. 738ce96902d88d473697f05c0465952dae374be564eAndrew Trick cl::PrintOptionValues(); 739ce96902d88d473697f05c0465952dae374be564eAndrew Trick 74061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner // Now that we have all of the passes ready, run them. 74161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner Passes.run(*M.get()); 74261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner 743d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman // Declare success. 744f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel if (!NoOutput || PrintBreakpoints) 745d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman Out->keep(); 746d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman 74761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner return 0; 748009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 749