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