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
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "BreakpointPrinter.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "NewPMDriver.h"
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "PassPrinters.h"
18f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/ADT/Triple.h"
19f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Analysis/CallGraph.h"
203251e81d793a293b78f4914be6093b405c24fc2aChandler Carruth#include "llvm/Analysis/CallGraphSCCPass.h"
21f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Analysis/LoopPass.h"
22f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Analysis/RegionPass.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Bitcode/BitcodeWriterPass.h"
24f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/CodeGen/CommandFlags.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h"
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LLVMContext.h"
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LegacyPassNameParser.h"
290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h"
317fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/IRReader/IRReader.h"
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/InitializePasses.h"
33446991dc348a1b6c12666d52449d2ca7a2e39a1aJakub Staszak#include "llvm/LinkAllIR.h"
3490230c84668269fbd53d163e398cd16486d5d414Chandler Carruth#include "llvm/LinkAllPasses.h"
35f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/MC/SubtargetFeature.h"
36fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner#include "llvm/PassManager.h"
3708fc0d30267340ef46751615cf6978336a25d0f8David Greene#include "llvm/Support/Debug.h"
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h"
39c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
40551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h"
41c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
42f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/Signals.h"
437fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/Support/SourceMgr.h"
44551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/SystemUtils.h"
45cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/Support/TargetRegistry.h"
460873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem#include "llvm/Support/TargetSelect.h"
47f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/ToolOutputFile.h"
48f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Target/TargetLibraryInfo.h"
49f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Target/TargetMachine.h"
503d453ac1317f910b0589d87c061f056be29e36cdRafael Espindola#include "llvm/Transforms/IPO/PassManagerBuilder.h"
51c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner#include <algorithm>
52f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include <memory>
53d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace opt_tool;
5530af36808263fc256ead4fc50b639420b016a58dChris Lattner
56c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// The OptimizationList is automatically populated with registered Passes by the
57c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// PassNameParser.
58fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
597f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris Lattnerstatic cl::list<const PassInfo*, bool, PassNameParser>
607f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris LattnerPassList(cl::desc("Optimizations available:"));
61009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This flag specifies a textual description of the optimization pass pipeline
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// to run over the module. This flag switches opt to use the new pass manager
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// infrastructure, completely disabling all of the flags specific to the old
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// pass management.
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<std::string> PassPipeline(
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "passes",
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    cl::desc("A textual description of the pass pipeline for optimizing"),
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    cl::Hidden);
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
71c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// Other command line options...
72fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
736c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
74a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherInputFilename(cl::Positional, cl::desc("<input bitcode file>"),
75fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    cl::init("-"), cl::value_desc("filename"));
765ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
776c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
785ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"),
7986cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman               cl::value_desc("filename"));
805ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
815ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
82baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals"));
835ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
845ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
855ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerPrintEachXForm("p", cl::desc("Print module after each transformation"));
865ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
875ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
88ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoOutput("disable-output",
89a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif         cl::desc("Do not write result bitcode file"), cl::Hidden);
90d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner
91d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattnerstatic cl::opt<bool>
9281b0b64298fb06f225a9544440bb7b230ccf3c35Duncan SandsOutputAssembly("S", cl::desc("Write output as LLVM assembly"));
938c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbar
948c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbarstatic cl::opt<bool>
95ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
96f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner
97f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattnerstatic cl::opt<bool>
9874ed997d527d35d27690feb5c648489c638947c9Reid SpencerVerifyEach("verify-each", cl::desc("Verify after each transform"));
9974ed997d527d35d27690feb5c648489c638947c9Reid Spencer
10074ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
10174ed997d527d35d27690feb5c648489c638947c9Reid SpencerStripDebug("strip-debug",
10274ed997d527d35d27690feb5c648489c638947c9Reid Spencer           cl::desc("Strip debugger symbol info from translation unit"));
10374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
10474ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
10574ed997d527d35d27690feb5c648489c638947c9Reid SpencerDisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
10674ed997d527d35d27690feb5c648489c638947c9Reid Spencer
107a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
108a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherDisableOptimizations("disable-opt",
10974ed997d527d35d27690feb5c648489c638947c9Reid Spencer                     cl::desc("Do not run any optimization passes"));
11074ed997d527d35d27690feb5c648489c638947c9Reid Spencer
111a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
112adc82888b5be1d43caa94e9247f19927ef70f621Daniel DunbarDisableInternalize("disable-internalize",
113adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                   cl::desc("Do not mark all symbols as internal"));
114adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
11574ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
116a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardCompileOpts("std-compile-opts",
11774ed997d527d35d27690feb5c648489c638947c9Reid Spencer                   cl::desc("Include the standard compile time optimizations"));
11874ed997d527d35d27690feb5c648489c638947c9Reid Spencer
11974ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
120a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardLinkOpts("std-link-opts",
121adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                 cl::desc("Include the standard link time optimizations"));
122adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
123adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbarstatic cl::opt<bool>
1242d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO1("O1",
1258bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 1. Similar to clang -O1"));
1262d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1272d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1282d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO2("O2",
1298bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 2. Similar to clang -O2"));
1308bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
1318bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool>
1328bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOs("Os",
1338bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os"));
1348bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
1358bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool>
1368bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOz("Oz",
1378bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Like -Os but reduces code size further. Similar to clang -Oz"));
1382d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1392d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1402d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO3("O3",
1418bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 3. Similar to clang -O3"));
1422d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
143e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groffstatic cl::opt<std::string>
144e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe GroffTargetTriple("mtriple", cl::desc("Override target triple for module"));
145e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff
1462d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1472d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelUnitAtATime("funit-at-a-time",
148c4769ba20432c19eff68d7802c9a836ada2424e6Eric Christopher            cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time"),
1493472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands            cl::init(true));
1502d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1512d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
152435798e96a64738b55a01055dde1bc9a88a15191Hal FinkelDisableLoopUnrolling("disable-loop-unrolling",
153435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel                     cl::desc("Disable loop unrolling in all relevant passes"),
154435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel                     cl::init(false));
155b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendlingstatic cl::opt<bool>
156b84d18f57604b86ce2cae5a2447a5f879153bc0fBill WendlingDisableLoopVectorization("disable-loop-vectorization",
157b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                     cl::desc("Disable the loop vectorization pass"),
158b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                     cl::init(false));
159b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling
160b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendlingstatic cl::opt<bool>
161b84d18f57604b86ce2cae5a2447a5f879153bc0fBill WendlingDisableSLPVectorization("disable-slp-vectorization",
162b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                        cl::desc("Disable the slp vectorization pass"),
163b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                        cl::init(false));
164b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling
165435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel
166435798e96a64738b55a01055dde1bc9a88a15191Hal Finkelstatic cl::opt<bool>
1672d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelDisableSimplifyLibCalls("disable-simplify-libcalls",
168442b1aa94b4544555aceb9a5d5f2a72f2a9132c6Devang Patel                        cl::desc("Disable simplify-libcalls"));
1692d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1702d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1713153e4fc80badcd3f7f87d20df86027d20964469Chris LattnerQuiet("q", cl::desc("Obsolete option"), cl::Hidden);
1725ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
173ec7eb45926dc40a80534bad729be825bf129a126Reid Spencerstatic cl::alias
174ec7eb45926dc40a80534bad729be825bf129a126Reid SpencerQuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
175ec7eb45926dc40a80534bad729be825bf129a126Reid Spencer
176fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstatic cl::opt<bool>
177fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid SpencerAnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
178fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
179f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patelstatic cl::opt<bool>
180a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickPrintBreakpoints("print-breakpoints-for-testing",
181f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel                 cl::desc("Print select breakpoints location for testing"));
182f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
183d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattnerstatic cl::opt<std::string>
184a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickDefaultDataLayout("default-data-layout",
185d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::desc("data layout string to use if not specified by module"),
186d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::value_desc("layout-string"), cl::init(""));
187d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner
18828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
189f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
19052b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic inline void addPass(PassManagerBase &PM, Pass *P) {
19174ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // Add the pass to the pass manager...
19274ed997d527d35d27690feb5c648489c638947c9Reid Spencer  PM.add(P);
19374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
19474ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // If we are verifying all of the intermediate steps, add the verifier...
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (VerifyEach) {
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PM.add(createVerifierPass());
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PM.add(createDebugInfoVerifierPass());
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
19974ed997d527d35d27690feb5c648489c638947c9Reid Spencer}
20074ed997d527d35d27690feb5c648489c638947c9Reid Spencer
201a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// AddOptimizationPasses - This routine adds optimization passes
202a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// based on selected optimization level, OptLevel. This routine
2032d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// duplicates llvm-gcc behaviour.
2042d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel///
2052d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// OptLevel - Optimization Level
20652b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddOptimizationPasses(PassManagerBase &MPM,FunctionPassManager &FPM,
2078bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth                                  unsigned OptLevel, unsigned SizeLevel) {
208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  FPM.add(createVerifierPass());          // Verify that input is correct
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MPM.add(createDebugInfoVerifierPass()); // Verify that debug info is correct
210a3e585d4c2e7829ae854bc0049d904db6a989f4bDuncan Sands
21152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  PassManagerBuilder Builder;
21252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.OptLevel = OptLevel;
2138bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  Builder.SizeLevel = SizeLevel;
214ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar
21574733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  if (DisableInline) {
21674733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    // No inlining pass
21742d41fda0873c27b81e18662f5746783a974301dEli Friedman  } else if (OptLevel > 1) {
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel);
21974733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  } else {
22052b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner    Builder.Inliner = createAlwaysInlinerPass();
22174733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  }
22252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.DisableUnitAtATime = !UnitAtATime;
223435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel  Builder.DisableUnrollLoops = (DisableLoopUnrolling.getNumOccurrences() > 0) ?
224435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel                               DisableLoopUnrolling : OptLevel == 0;
2250568ba6e3af7ae7eb3ad7871ad0581c926150c8dGreg Bedwell
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // This is final, unless there is a #pragma vectorize enable
22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (DisableLoopVectorization)
22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Builder.LoopVectorize = false;
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // If option wasn't forced via cmd line (-vectorize-loops, -loop-vectorize)
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  else if (!Builder.LoopVectorize)
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Builder.LoopVectorize = OptLevel > 1 && SizeLevel < 2;
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // When #pragma vectorize is on for SLP, do the same as above
234b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling  Builder.SLPVectorize =
235b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling      DisableSLPVectorization ? false : OptLevel > 1 && SizeLevel < 2;
236435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel
23752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.populateFunctionPassManager(FPM);
23852b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.populateModulePassManager(MPM);
2392d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel}
2402d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
24152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddStandardCompilePasses(PassManagerBase &PM) {
24274ed997d527d35d27690feb5c648489c638947c9Reid Spencer  PM.add(createVerifierPass());                  // Verify that input is correct
24374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
24474ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // If the -strip-debug command line option was specified, do it.
24574ed997d527d35d27690feb5c648489c638947c9Reid Spencer  if (StripDebug)
24674ed997d527d35d27690feb5c648489c638947c9Reid Spencer    addPass(PM, createStripSymbolsPass(true));
24774ed997d527d35d27690feb5c648489c638947c9Reid Spencer
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Verify debug info only after it's (possibly) stripped.
249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PM.add(createDebugInfoVerifierPass());
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
25174ed997d527d35d27690feb5c648489c638947c9Reid Spencer  if (DisableOptimizations) return;
25274ed997d527d35d27690feb5c648489c638947c9Reid Spencer
253ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar  // -std-compile-opts adds the same module passes as -O3.
25452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  PassManagerBuilder Builder;
25552b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  if (!DisableInline)
25652b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner    Builder.Inliner = createFunctionInliningPass();
25752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.OptLevel = 3;
25852b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.populateModulePassManager(PM);
25974ed997d527d35d27690feb5c648489c638947c9Reid Spencer}
26074ed997d527d35d27690feb5c648489c638947c9Reid Spencer
26152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattnerstatic void AddStandardLinkPasses(PassManagerBase &PM) {
262adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  PM.add(createVerifierPass());                  // Verify that input is correct
263adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
264adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  // If the -strip-debug command line option was specified, do it.
265adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  if (StripDebug)
266adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    addPass(PM, createStripSymbolsPass(true));
267adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Verify debug info only after it's (possibly) stripped.
269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PM.add(createDebugInfoVerifierPass());
270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
271adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  if (DisableOptimizations) return;
272adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
27352b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  PassManagerBuilder Builder;
27452b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  Builder.populateLTOPassManager(PM, /*Internalize=*/ !DisableInternalize,
27552b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner                                 /*RunInliner=*/ !DisableInline);
276adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar}
277adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
278cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem//===----------------------------------------------------------------------===//
279cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// CodeGen-related helper functions.
280cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem//
281cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
282cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav RotemCodeGenOpt::Level GetCodeGenOptLevel() {
283cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO1)
284cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Less;
285cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO2)
286cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Default;
287cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO3)
288cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Aggressive;
289cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  return CodeGenOpt::None;
290cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem}
291cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
292cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// Returns the TargetMachine instance or zero if no triple is provided.
293b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotemstatic TargetMachine* GetTargetMachine(Triple TheTriple) {
294cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  std::string Error;
295cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
296cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                                         Error);
297b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem  // Some modules don't specify a triple, and this is okay.
29860d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  if (!TheTarget) {
299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
30060d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  }
301cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
302cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  // Package up features to be passed to target/subtarget
303cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  std::string FeaturesStr;
304cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (MAttrs.size()) {
305cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    SubtargetFeatures Features;
306cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    for (unsigned i = 0; i != MAttrs.size(); ++i)
307cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem      Features.AddFeature(MAttrs[i]);
308cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    FeaturesStr = Features.getString();
309cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  }
310cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
311cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  return TheTarget->createTargetMachine(TheTriple.getTriple(),
31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        MCPU, FeaturesStr,
31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        InitTargetOptionsFromCodeGenFlags(),
314cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                        RelocModel, CMModel,
315cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                        GetCodeGenOptLevel());
316cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem}
317009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifdef LINK_POLLY_INTO_TOOLS
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace polly {
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid initializePollyPasses(llvm::PassRegistry &Registry);
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
324c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//===----------------------------------------------------------------------===//
325c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// main for opt
326c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//
3278f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) {
328c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  sys::PrintStackTraceOnErrorSignal();
329c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm::PrettyStackTraceProgram X(argc, argv);
330d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman
33108fc0d30267340ef46751615cf6978336a25d0f8David Greene  // Enable debug stream buffering.
33208fc0d30267340ef46751615cf6978336a25d0f8David Greene  EnableDebugBuffering = true;
33308fc0d30267340ef46751615cf6978336a25d0f8David Greene
334c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
3350d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson  LLVMContext &Context = getGlobalContext();
336a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
3370873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem  InitializeAllTargets();
3380873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem  InitializeAllTargetMCs();
339cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  InitializeAllAsmPrinters();
3400873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem
341081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  // Initialize passes
342081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  PassRegistry &Registry = *PassRegistry::getPassRegistry();
343081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeCore(Registry);
34413ace6664fad8b4d0277d16690674f4e1f176642Daniel Malea  initializeDebugIRPass(Registry);
345081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeScalarOpts(Registry);
34624c4898973a074713201fb9351d302b9f7733e92Michael Gottesman  initializeObjCARCOpts(Registry);
347de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel  initializeVectorization(Registry);
348081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeIPO(Registry);
349081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeAnalysis(Registry);
350081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeIPA(Registry);
351081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeTransformUtils(Registry);
352081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInstCombine(Registry);
353081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInstrumentation(Registry);
354081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeTarget(Registry);
35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // For codegen passes, only passes that do IR to IR transformation are
356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // supported.
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  initializeCodeGenPreparePass(Registry);
358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  initializeAtomicExpandLoadLinkedPass(Registry);
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifdef LINK_POLLY_INTO_TOOLS
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  polly::initializePollyPasses(Registry);
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
363a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
36461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  cl::ParseCommandLineOptions(argc, argv,
36561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    "llvm .bc -> .bc modular optimizer and analysis printer\n");
3661ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
3677593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser  if (AnalyzeOnly && NoOutput) {
3687593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser    errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
3697593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser    return 1;
3707593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser  }
3717593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser
37261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  SMDiagnostic Err;
3731ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
37461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Load the input module...
37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<Module> M;
37661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  M.reset(ParseIRFile(InputFilename, Err, Context));
377a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!M.get()) {
379d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner    Err.print(argv[0], errs());
38061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    return 1;
38161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
382697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner
383e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff  // If we are supposed to override the target triple, do so now.
38460d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  if (!TargetTriple.empty())
385e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff    M->setTargetTriple(Triple::normalize(TargetTriple));
386f1216abf7ec0d37152a0aaaad5a238beca65ecb6Eric Christopher
38761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Figure out what stream we are supposed to write to...
38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<tool_output_file> Out;
3894931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  if (NoOutput) {
39086cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (!OutputFilename.empty())
39186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      errs() << "WARNING: The -o (output filename) option is ignored when\n"
3924931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman                "the --disable-output option is used.\n";
39386cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman  } else {
39486cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    // Default to standard output.
39586cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (OutputFilename.empty())
39686cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      OutputFilename = "-";
39786cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman
39886cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    std::string ErrorInfo;
399d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   sys::fs::F_None));
40186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (!ErrorInfo.empty()) {
40286cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      errs() << ErrorInfo << '\n';
40386cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      return 1;
404009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    }
40561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
40676d12299b5333d71bfc079614031f97c97aa5148Chris Lattner
40761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If the output is set to be emitted to standard out, and standard out is a
40861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // console, print out a warning message and refuse to do it.  We don't
40961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // impress anyone by spewing tons of binary goo to a terminal.
410b56bf581a3bd8feb3eb454b30ab171bc5131e17cDan Gohman  if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly)
411d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    if (CheckBitcodeOutputToConsole(Out->os(), !Quiet))
41261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      NoOutput = true;
41361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (PassPipeline.getNumOccurrences() > 0) {
41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OutputKind OK = OK_NoOutput;
41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!NoOutput)
41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      OK = OutputAssembly ? OK_OutputAssembly : OK_OutputBitcode;
41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VerifierKind VK = VK_VerifyInAndOut;
42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (NoVerify)
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      VK = VK_NoVerifier;
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else if (VerifyEach)
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      VK = VK_VerifyEachPass;
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // The user has asked to use the new pass manager and provided a pipeline
42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // string. Hand off the rest of the functionality to the new code for that
42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // layer.
42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return runPassPipeline(argv[0], Context, *M.get(), Out.get(), PassPipeline,
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           OK, VK)
43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               ? 0
43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               : 1;
43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a PassManager to hold and optimize the collection of passes we are
4352a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner  // about to build.
43661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  //
43761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  PassManager Passes;
43861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
4392a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner  // Add an appropriate TargetLibraryInfo pass for the module's triple.
440188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  TargetLibraryInfo *TLI = new TargetLibraryInfo(Triple(M->getTargetTriple()));
441a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
442188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  // The -disable-simplify-libcalls flag actually disables all builtin optzns.
443188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  if (DisableSimplifyLibCalls)
444188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner    TLI->disableAllFunctions();
445188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  Passes.add(TLI);
446a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
44760d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  // Add an appropriate DataLayout instance for this module.
44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const DataLayout *DL = M.get()->getDataLayout();
44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!DL && !DefaultDataLayout.empty()) {
45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    M->setDataLayout(DefaultDataLayout);
45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DL = M.get()->getDataLayout();
45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
45360d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher
45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (DL)
45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Passes.add(new DataLayoutPass(M.get()));
45661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
457b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem  Triple ModuleTriple(M->getTargetTriple());
458dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  TargetMachine *Machine = nullptr;
459b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem  if (ModuleTriple.getArch())
460b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem    Machine = GetTargetMachine(Triple(ModuleTriple));
46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<TargetMachine> TM(Machine);
462b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem
463aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  // Add internal analysis passes from the target machine.
464aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  if (TM.get())
465aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth    TM->addAnalysisPasses(Passes);
466cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<FunctionPassManager> FPasses;
4688bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
46952b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner    FPasses.reset(new FunctionPassManager(M.get()));
47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (DL)
47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      FPasses->add(new DataLayoutPass(M.get()));
47257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard    if (TM.get())
47357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard      TM->addAnalysisPasses(*FPasses);
47457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
47561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
476a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
477f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  if (PrintBreakpoints) {
478f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    // Default to standard output.
479f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    if (!Out) {
480f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      if (OutputFilename.empty())
481f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel        OutputFilename = "-";
482a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
483f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      std::string ErrorInfo;
484f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     sys::fs::F_None));
486f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      if (!ErrorInfo.empty()) {
487f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel        errs() << ErrorInfo << '\n';
488f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel        return 1;
489f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      }
490f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    }
49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Passes.add(createBreakpointPrinter(Out->os()));
492f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    NoOutput = true;
493f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  }
494f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
49561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If the -strip-debug command line option was specified, add it.  If
49661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // -std-compile-opts was also specified, it will handle StripDebug.
49761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StripDebug && !StandardCompileOpts)
49861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    addPass(Passes, createStripSymbolsPass(true));
49961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
50061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a new optimization pass for each one specified on the command line
50161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  for (unsigned i = 0; i < PassList.size(); ++i) {
50261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    // Check to see if -std-compile-opts was specified before this option.  If
50361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    // so, handle it.
50461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (StandardCompileOpts &&
50561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner        StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
5063dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner      AddStandardCompilePasses(Passes);
5073dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner      StandardCompileOpts = false;
508a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher    }
509fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
51061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (StandardLinkOpts &&
51161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner        StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
512adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddStandardLinkPasses(Passes);
513adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      StandardLinkOpts = false;
514a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher    }
515adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
51661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
5178bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 1, 0);
51861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO1 = false;
519adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5202d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
52161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
5228bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 0);
52361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO2 = false;
524adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5252d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
5268bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) {
5278bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 1);
5288bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      OptLevelOs = false;
5298bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    }
5308bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
5318bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) {
5328bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 2);
5338bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      OptLevelOz = false;
5348bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    }
5358bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
53661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
5378bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 3, 0);
53861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO3 = false;
539adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5402d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
54161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    const PassInfo *PassInf = PassList[i];
542dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Pass *P = nullptr;
54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (PassInf->getTargetMachineCtor())
54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      P = PassInf->getTargetMachineCtor()(TM.get());
54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else if (PassInf->getNormalCtor())
54661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      P = PassInf->getNormalCtor()();
54761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
54861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      errs() << argv[0] << ": cannot create pass: "
54961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner             << PassInf->getPassName() << "\n";
55061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (P) {
5513460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer      PassKind Kind = P->getPassKind();
55261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      addPass(Passes, P);
55361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
55461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      if (AnalyzeOnly) {
5553460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer        switch (Kind) {
556476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_BasicBlock:
55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createBasicBlockPassPrinter(PassInf, Out->os(), Quiet));
558476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
55965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser        case PT_Region:
56036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createRegionPassPrinter(PassInf, Out->os(), Quiet));
56165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser          break;
562476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Loop:
56336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createLoopPassPrinter(PassInf, Out->os(), Quiet));
564476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
565476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Function:
56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createFunctionPassPrinter(PassInf, Out->os(), Quiet));
567476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
568476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_CallGraphSCC:
56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createCallGraphPassPrinter(PassInf, Out->os(), Quiet));
570476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
571476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        default:
57236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet));
573476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
574476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        }
57561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      }
5762d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel    }
5772d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
57861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (PrintEachXForm)
57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(createPrintModulePass(errs()));
58061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
58122d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner
58261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If -std-compile-opts was specified at the end of the pass list, add them.
58361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StandardCompileOpts) {
58461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddStandardCompilePasses(Passes);
58561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    StandardCompileOpts = false;
58661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
587fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
58861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StandardLinkOpts) {
58961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddStandardLinkPasses(Passes);
59061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    StandardLinkOpts = false;
59161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
592009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
59361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO1)
5948bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 1, 0);
59561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
59661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO2)
5978bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 0);
5988bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
5998bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelOs)
6008bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 1);
6018bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
6028bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelOz)
6038bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 2);
604fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
60561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO3)
6068bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 3, 0);
60761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
6088bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
6093e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner    FPasses->doInitialization();
61052b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner    for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F)
61152b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner      FPasses->run(*F);
6123e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner    FPasses->doFinalization();
6133e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner  }
61461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
61561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Check that the module is well formed on completion of optimization
616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!NoVerify && !VerifyEach) {
61761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Passes.add(createVerifierPass());
618dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Passes.add(createDebugInfoVerifierPass());
619dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
62061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
6214931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  // Write bitcode or assembly to the output as the last step...
62261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (!NoOutput && !AnalyzeOnly) {
62361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OutputAssembly)
62436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(createPrintModulePass(Out->os()));
62561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
626d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman      Passes.add(createBitcodeWriterPass(Out->os()));
62761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
62861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
629ce96902d88d473697f05c0465952dae374be564eAndrew Trick  // Before executing passes, print the final values of the LLVM options.
630ce96902d88d473697f05c0465952dae374be564eAndrew Trick  cl::PrintOptionValues();
631ce96902d88d473697f05c0465952dae374be564eAndrew Trick
63261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Now that we have all of the passes ready, run them.
63361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  Passes.run(*M.get());
63461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
635d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  // Declare success.
636f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  if (!NoOutput || PrintBreakpoints)
637d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    Out->keep();
638d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman
63961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  return 0;
640009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
641