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"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/TargetLibraryInfo.h"
24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/TargetTransformInfo.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Bitcode/BitcodeWriterPass.h"
26f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/CodeGen/CommandFlags.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/IR/DebugInfo.h"
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h"
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LLVMContext.h"
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LegacyPassNameParser.h"
320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h"
347fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/IRReader/IRReader.h"
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/InitializePasses.h"
36446991dc348a1b6c12666d52449d2ca7a2e39a1aJakub Staszak#include "llvm/LinkAllIR.h"
3790230c84668269fbd53d163e398cd16486d5d414Chandler Carruth#include "llvm/LinkAllPasses.h"
38f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/MC/SubtargetFeature.h"
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/LegacyPassManager.h"
4008fc0d30267340ef46751615cf6978336a25d0f8David Greene#include "llvm/Support/Debug.h"
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h"
422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/Support/Host.h"
43c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
44551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h"
45c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
46f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/Signals.h"
477fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/Support/SourceMgr.h"
48551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/SystemUtils.h"
49cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/Support/TargetRegistry.h"
500873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem#include "llvm/Support/TargetSelect.h"
51f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/ToolOutputFile.h"
52f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Target/TargetMachine.h"
533d453ac1317f910b0589d87c061f056be29e36cdRafael Espindola#include "llvm/Transforms/IPO/PassManagerBuilder.h"
54c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner#include <algorithm>
55f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include <memory>
56d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace opt_tool;
5830af36808263fc256ead4fc50b639420b016a58dChris Lattner
59c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// The OptimizationList is automatically populated with registered Passes by the
60c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// PassNameParser.
61fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
627f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris Lattnerstatic cl::list<const PassInfo*, bool, PassNameParser>
637f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris LattnerPassList(cl::desc("Optimizations available:"));
64009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This flag specifies a textual description of the optimization pass pipeline
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// to run over the module. This flag switches opt to use the new pass manager
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// infrastructure, completely disabling all of the flags specific to the old
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// pass management.
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<std::string> PassPipeline(
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    "passes",
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    cl::desc("A textual description of the pass pipeline for optimizing"),
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    cl::Hidden);
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
74c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// Other command line options...
75fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
766c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
77a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherInputFilename(cl::Positional, cl::desc("<input bitcode file>"),
78fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    cl::init("-"), cl::value_desc("filename"));
795ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
806c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
815ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"),
8286cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman               cl::value_desc("filename"));
835ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
845ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
85baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals"));
865ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
875ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
885ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerPrintEachXForm("p", cl::desc("Print module after each transformation"));
895ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
905ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
91ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoOutput("disable-output",
92a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif         cl::desc("Do not write result bitcode file"), cl::Hidden);
93d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner
94d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattnerstatic cl::opt<bool>
9581b0b64298fb06f225a9544440bb7b230ccf3c35Duncan SandsOutputAssembly("S", cl::desc("Write output as LLVM assembly"));
968c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbar
978c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbarstatic cl::opt<bool>
98ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
99f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner
100f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattnerstatic cl::opt<bool>
10174ed997d527d35d27690feb5c648489c638947c9Reid SpencerVerifyEach("verify-each", cl::desc("Verify after each transform"));
10274ed997d527d35d27690feb5c648489c638947c9Reid Spencer
10374ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
10474ed997d527d35d27690feb5c648489c638947c9Reid SpencerStripDebug("strip-debug",
10574ed997d527d35d27690feb5c648489c638947c9Reid Spencer           cl::desc("Strip debugger symbol info from translation unit"));
10674ed997d527d35d27690feb5c648489c638947c9Reid Spencer
10774ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
10874ed997d527d35d27690feb5c648489c638947c9Reid SpencerDisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
10974ed997d527d35d27690feb5c648489c638947c9Reid Spencer
110a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
111a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherDisableOptimizations("disable-opt",
11274ed997d527d35d27690feb5c648489c638947c9Reid Spencer                     cl::desc("Do not run any optimization passes"));
11374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
114a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
115a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardLinkOpts("std-link-opts",
116adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                 cl::desc("Include the standard link time optimizations"));
117adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
118adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbarstatic cl::opt<bool>
1192d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO1("O1",
1208bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 1. Similar to clang -O1"));
1212d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1222d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1232d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO2("O2",
1248bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 2. Similar to clang -O2"));
1258bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
1268bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool>
1278bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOs("Os",
1288bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os"));
1298bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
1308bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruthstatic cl::opt<bool>
1318bc3434e68028263c42dd26bde3c16450cb146f4Chandler CarruthOptLevelOz("Oz",
1328bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Like -Os but reduces code size further. Similar to clang -Oz"));
1332d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1342d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1352d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO3("O3",
1368bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth           cl::desc("Optimization level 3. Similar to clang -O3"));
1372d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
138e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groffstatic cl::opt<std::string>
139e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe GroffTargetTriple("mtriple", cl::desc("Override target triple for module"));
140e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff
1412d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1422d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelUnitAtATime("funit-at-a-time",
14337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines            cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"),
1443472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands            cl::init(true));
1452d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1462d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
147435798e96a64738b55a01055dde1bc9a88a15191Hal FinkelDisableLoopUnrolling("disable-loop-unrolling",
148435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel                     cl::desc("Disable loop unrolling in all relevant passes"),
149435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel                     cl::init(false));
150b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendlingstatic cl::opt<bool>
151b84d18f57604b86ce2cae5a2447a5f879153bc0fBill WendlingDisableLoopVectorization("disable-loop-vectorization",
152b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                     cl::desc("Disable the loop vectorization pass"),
153b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                     cl::init(false));
154b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling
155b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendlingstatic cl::opt<bool>
156b84d18f57604b86ce2cae5a2447a5f879153bc0fBill WendlingDisableSLPVectorization("disable-slp-vectorization",
157b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                        cl::desc("Disable the slp vectorization pass"),
158b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling                        cl::init(false));
159b84d18f57604b86ce2cae5a2447a5f879153bc0fBill Wendling
160435798e96a64738b55a01055dde1bc9a88a15191Hal Finkel
161435798e96a64738b55a01055dde1bc9a88a15191Hal Finkelstatic cl::opt<bool>
1622d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelDisableSimplifyLibCalls("disable-simplify-libcalls",
163442b1aa94b4544555aceb9a5d5f2a72f2a9132c6Devang Patel                        cl::desc("Disable simplify-libcalls"));
1642d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1652d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1663153e4fc80badcd3f7f87d20df86027d20964469Chris LattnerQuiet("q", cl::desc("Obsolete option"), cl::Hidden);
1675ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
168ec7eb45926dc40a80534bad729be825bf129a126Reid Spencerstatic cl::alias
169ec7eb45926dc40a80534bad729be825bf129a126Reid SpencerQuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
170ec7eb45926dc40a80534bad729be825bf129a126Reid Spencer
171fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstatic cl::opt<bool>
172fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid SpencerAnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
173fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
174f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patelstatic cl::opt<bool>
175a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickPrintBreakpoints("print-breakpoints-for-testing",
176f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel                 cl::desc("Print select breakpoints location for testing"));
177f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
178d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattnerstatic cl::opt<std::string>
179a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew TrickDefaultDataLayout("default-data-layout",
180d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::desc("data layout string to use if not specified by module"),
181d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::value_desc("layout-string"), cl::init(""));
182d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner
1832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic cl::opt<bool> PreserveBitcodeUseListOrder(
1842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    "preserve-bc-uselistorder",
1852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    cl::desc("Preserve use-list order when writing LLVM bitcode."),
1862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    cl::init(true), cl::Hidden);
18728552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
1882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic cl::opt<bool> PreserveAssemblyUseListOrder(
1892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    "preserve-ll-uselistorder",
1902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    cl::desc("Preserve use-list order when writing LLVM assembly."),
1912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    cl::init(false), cl::Hidden);
192f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
193ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic inline void addPass(legacy::PassManagerBase &PM, Pass *P) {
19474ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // Add the pass to the pass manager...
19574ed997d527d35d27690feb5c648489c638947c9Reid Spencer  PM.add(P);
19674ed997d527d35d27690feb5c648489c638947c9Reid Spencer
19774ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // If we are verifying all of the intermediate steps, add the verifier...
1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (VerifyEach)
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    PM.add(createVerifierPass());
20074ed997d527d35d27690feb5c648489c638947c9Reid Spencer}
20174ed997d527d35d27690feb5c648489c638947c9Reid Spencer
20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// This routine adds optimization passes based on selected optimization level,
20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// OptLevel.
2042d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel///
2052d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// OptLevel - Optimization Level
206ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic void AddOptimizationPasses(legacy::PassManagerBase &MPM,
207ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                  legacy::FunctionPassManager &FPM,
2088bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth                                  unsigned OptLevel, unsigned SizeLevel) {
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  FPM.add(createVerifierPass()); // Verify that input 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
241ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic void AddStandardLinkPasses(legacy::PassManagerBase &PM) {
24252b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  PassManagerBuilder Builder;
24337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Builder.VerifyInput = true;
24437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (DisableOptimizations)
24537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Builder.OptLevel = 0;
24637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
24752b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner  if (!DisableInline)
24852b28896c8dfaa36f4b577b99fa57c5c412a5853Chris Lattner    Builder.Inliner = createFunctionInliningPass();
24937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Builder.populateLTOPassManager(PM);
250adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar}
251adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
252cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem//===----------------------------------------------------------------------===//
253cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// CodeGen-related helper functions.
254cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem//
255cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
2564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic CodeGenOpt::Level GetCodeGenOptLevel() {
257cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO1)
258cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Less;
259cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO2)
260cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Default;
261cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  if (OptLevelO3)
262cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    return CodeGenOpt::Aggressive;
263cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  return CodeGenOpt::None;
264cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem}
265cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
266cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// Returns the TargetMachine instance or zero if no triple is provided.
267b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotemstatic TargetMachine* GetTargetMachine(Triple TheTriple) {
268cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  std::string Error;
269cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
270cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                                         Error);
271b338d897f9063ed6f02ed52527722c61ef827d5aNadav Rotem  // Some modules don't specify a triple, and this is okay.
27260d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  if (!TheTarget) {
273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
27460d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  }
275cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
276cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  // Package up features to be passed to target/subtarget
277cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  std::string FeaturesStr;
2782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (MAttrs.size() || MCPU == "native") {
279cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    SubtargetFeatures Features;
2802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
2812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    // If user asked for the 'native' CPU, we need to autodetect features.
2822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    // This is necessary for x86 where the CPU might not support all the
2832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    // features the autodetected CPU name lists in the target. For example,
2842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    // not all Sandybridge processors support AVX.
2852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (MCPU == "native") {
2862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      StringMap<bool> HostFeatures;
2872c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (sys::getHostCPUFeatures(HostFeatures))
2882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        for (auto &F : HostFeatures)
2892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          Features.AddFeature(F.first(), F.second);
2902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    }
2912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
292cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    for (unsigned i = 0; i != MAttrs.size(); ++i)
293cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem      Features.AddFeature(MAttrs[i]);
294cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem    FeaturesStr = Features.getString();
295cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  }
296cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
2972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (MCPU == "native")
2982c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    MCPU = sys::getHostCPUName();
2992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
300cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem  return TheTarget->createTargetMachine(TheTriple.getTriple(),
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        MCPU, FeaturesStr,
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        InitTargetOptionsFromCodeGenFlags(),
303cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                        RelocModel, CMModel,
304cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem                                        GetCodeGenOptLevel());
305cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem}
306009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifdef LINK_POLLY_INTO_TOOLS
30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace polly {
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid initializePollyPasses(llvm::PassRegistry &Registry);
31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
313c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//===----------------------------------------------------------------------===//
314c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// main for opt
315c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//
3168f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) {
317c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  sys::PrintStackTraceOnErrorSignal();
318c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm::PrettyStackTraceProgram X(argc, argv);
319d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman
32008fc0d30267340ef46751615cf6978336a25d0f8David Greene  // Enable debug stream buffering.
32108fc0d30267340ef46751615cf6978336a25d0f8David Greene  EnableDebugBuffering = true;
32208fc0d30267340ef46751615cf6978336a25d0f8David Greene
323c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
3240d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson  LLVMContext &Context = getGlobalContext();
325a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
3260873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem  InitializeAllTargets();
3270873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem  InitializeAllTargetMCs();
328c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  InitializeAllAsmPrinters();
3290873bea3ed2d740208131f7f1706b0628c0aae09Nadav Rotem
330081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  // Initialize passes
331081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  PassRegistry &Registry = *PassRegistry::getPassRegistry();
332081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeCore(Registry);
333081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeScalarOpts(Registry);
33424c4898973a074713201fb9351d302b9f7733e92Michael Gottesman  initializeObjCARCOpts(Registry);
335de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel  initializeVectorization(Registry);
336081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeIPO(Registry);
337081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeAnalysis(Registry);
338081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeIPA(Registry);
339081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeTransformUtils(Registry);
340081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInstCombine(Registry);
341081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeInstrumentation(Registry);
342081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeTarget(Registry);
34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // For codegen passes, only passes that do IR to IR transformation are
344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // supported.
34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  initializeCodeGenPreparePass(Registry);
34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  initializeAtomicExpandPass(Registry);
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  initializeRewriteSymbolsPass(Registry);
348ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  initializeWinEHPreparePass(Registry);
349ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  initializeDwarfEHPreparePass(Registry);
35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifdef LINK_POLLY_INTO_TOOLS
35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  polly::initializePollyPasses(Registry);
35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
354a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
35561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  cl::ParseCommandLineOptions(argc, argv,
35661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    "llvm .bc -> .bc modular optimizer and analysis printer\n");
3571ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
3587593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser  if (AnalyzeOnly && NoOutput) {
3597593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser    errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
3607593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser    return 1;
3617593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser  }
3627593f34d67f1f88bd09960dd92041d89de85a873Tobias Grosser
36361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  SMDiagnostic Err;
3641ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
36561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Load the input module...
36637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context);
367a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
368ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (!M) {
369d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner    Err.print(argv[0], errs());
37061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    return 1;
37161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
372697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner
3732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Strip debug info before running the verifier.
3742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (StripDebug)
3752c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    StripDebugInfo(*M);
3762c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Immediately run the verifier to catch any problems before starting up the
3782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // pass pipelines.  Otherwise we can crash on broken code during
3792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // doInitialization().
3802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!NoVerify && verifyModule(*M, &errs())) {
3812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    errs() << argv[0] << ": " << InputFilename
3822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar           << ": error: input module is broken!\n";
3832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return 1;
3842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  }
3852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
386e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff  // If we are supposed to override the target triple, do so now.
38760d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  if (!TargetTriple.empty())
388e652b521f97ed0c60cb5ad533dfcf477863ac0b1Joe Groff    M->setTargetTriple(Triple::normalize(TargetTriple));
389f1216abf7ec0d37152a0aaaad5a238beca65ecb6Eric Christopher
39061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Figure out what stream we are supposed to write to...
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<tool_output_file> Out;
3924931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  if (NoOutput) {
39386cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (!OutputFilename.empty())
39486cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      errs() << "WARNING: The -o (output filename) option is ignored when\n"
3954931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman                "the --disable-output option is used.\n";
39686cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman  } else {
39786cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    // Default to standard output.
39886cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (OutputFilename.empty())
39986cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      OutputFilename = "-";
40086cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman
40137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    std::error_code EC;
40237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Out.reset(new tool_output_file(OutputFilename, EC, sys::fs::F_None));
40337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (EC) {
40437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      errs() << EC.message() << '\n';
40586cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      return 1;
406009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    }
40761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
40876d12299b5333d71bfc079614031f97c97aa5148Chris Lattner
409ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Triple ModuleTriple(M->getTargetTriple());
410ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetMachine *Machine = nullptr;
411ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ModuleTriple.getArch())
412ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Machine = GetTargetMachine(ModuleTriple);
413ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::unique_ptr<TargetMachine> TM(Machine);
414ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
41561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If the output is set to be emitted to standard out, and standard out is a
41661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // console, print out a warning message and refuse to do it.  We don't
41761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // impress anyone by spewing tons of binary goo to a terminal.
418b56bf581a3bd8feb3eb454b30ab171bc5131e17cDan Gohman  if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly)
419d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    if (CheckBitcodeOutputToConsole(Out->os(), !Quiet))
42061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      NoOutput = true;
42161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (PassPipeline.getNumOccurrences() > 0) {
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OutputKind OK = OK_NoOutput;
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!NoOutput)
42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      OK = OutputAssembly ? OK_OutputAssembly : OK_OutputBitcode;
42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VerifierKind VK = VK_VerifyInAndOut;
42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (NoVerify)
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      VK = VK_NoVerifier;
43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else if (VerifyEach)
43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      VK = VK_VerifyEachPass;
43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // The user has asked to use the new pass manager and provided a pipeline
43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // string. Hand off the rest of the functionality to the new code for that
43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // layer.
436ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return runPassPipeline(argv[0], Context, *M, TM.get(), Out.get(),
4372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                           PassPipeline, OK, VK, PreserveAssemblyUseListOrder,
4382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                           PreserveBitcodeUseListOrder)
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               ? 0
44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               : 1;
44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
44361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a PassManager to hold and optimize the collection of passes we are
4442a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner  // about to build.
44561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  //
446ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  legacy::PassManager Passes;
44761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
4482a66acafaf8d5ceedfef56c00526f6253ac176beChris Lattner  // Add an appropriate TargetLibraryInfo pass for the module's triple.
449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetLibraryInfoImpl TLII(ModuleTriple);
450a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
451188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  // The -disable-simplify-libcalls flag actually disables all builtin optzns.
452188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  if (DisableSimplifyLibCalls)
453ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    TLII.disableAllFunctions();
454ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Passes.add(new TargetLibraryInfoWrapperPass(TLII));
455a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
45660d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher  // Add an appropriate DataLayout instance for this module.
4574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const DataLayout &DL = M->getDataLayout();
4584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (DL.isDefault() && !DefaultDataLayout.empty()) {
45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    M->setDataLayout(DefaultDataLayout);
46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
46160d20a81fcf91818db6b52520dd2ce520ad57a42Eric Christopher
462aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  // Add internal analysis passes from the target machine.
463ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Passes.add(createTargetTransformInfoWrapperPass(TM ? TM->getTargetIRAnalysis()
464ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                                     : TargetIRAnalysis()));
465cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem
466ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::unique_ptr<legacy::FunctionPassManager> FPasses;
4678bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
468ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    FPasses.reset(new legacy::FunctionPassManager(M.get()));
469ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    FPasses->add(createTargetTransformInfoWrapperPass(
470ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis()));
47161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
472a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
473f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  if (PrintBreakpoints) {
474f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    // Default to standard output.
475f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    if (!Out) {
476f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      if (OutputFilename.empty())
477f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel        OutputFilename = "-";
478a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
47937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      std::error_code EC;
480ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      Out = llvm::make_unique<tool_output_file>(OutputFilename, EC,
481ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                                sys::fs::F_None);
48237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (EC) {
48337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        errs() << EC.message() << '\n';
484f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel        return 1;
485f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel      }
486f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    }
48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Passes.add(createBreakpointPrinter(Out->os()));
488f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel    NoOutput = true;
489f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  }
490f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel
49161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a new optimization pass for each one specified on the command line
49261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  for (unsigned i = 0; i < PassList.size(); ++i) {
49361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (StandardLinkOpts &&
49461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner        StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
495adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddStandardLinkPasses(Passes);
496adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      StandardLinkOpts = false;
497a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher    }
498adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
49961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
5008bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 1, 0);
50161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO1 = false;
502adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5032d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
50461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
5058bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 0);
50661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO2 = false;
507adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5082d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
5098bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) {
5108bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 1);
5118bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      OptLevelOs = false;
5128bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    }
5138bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
5148bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) {
5158bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 2, 2);
5168bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      OptLevelOz = false;
5178bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    }
5188bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
51961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
5208bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth      AddOptimizationPasses(Passes, *FPasses, 3, 0);
52161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO3 = false;
522adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5232d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
52461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    const PassInfo *PassInf = PassList[i];
525dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Pass *P = nullptr;
52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (PassInf->getTargetMachineCtor())
52736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      P = PassInf->getTargetMachineCtor()(TM.get());
52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else if (PassInf->getNormalCtor())
52961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      P = PassInf->getNormalCtor()();
53061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
53161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      errs() << argv[0] << ": cannot create pass: "
53261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner             << PassInf->getPassName() << "\n";
53361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (P) {
5343460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer      PassKind Kind = P->getPassKind();
53561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      addPass(Passes, P);
53661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
53761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      if (AnalyzeOnly) {
5383460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer        switch (Kind) {
539476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_BasicBlock:
54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createBasicBlockPassPrinter(PassInf, Out->os(), Quiet));
541476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
54265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser        case PT_Region:
54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createRegionPassPrinter(PassInf, Out->os(), Quiet));
54465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser          break;
545476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Loop:
54636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createLoopPassPrinter(PassInf, Out->os(), Quiet));
547476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
548476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Function:
54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createFunctionPassPrinter(PassInf, Out->os(), Quiet));
550476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
551476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_CallGraphSCC:
55236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createCallGraphPassPrinter(PassInf, Out->os(), Quiet));
553476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
554476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        default:
55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet));
556476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
557476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        }
55861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      }
5592d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel    }
5602d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
56161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (PrintEachXForm)
5622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      Passes.add(
5632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          createPrintModulePass(errs(), "", PreserveAssemblyUseListOrder));
56461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
56522d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner
56661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StandardLinkOpts) {
56761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddStandardLinkPasses(Passes);
56861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    StandardLinkOpts = false;
56961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
570009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
57161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO1)
5728bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 1, 0);
57361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
57461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO2)
5758bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 0);
5768bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
5778bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelOs)
5788bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 1);
5798bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth
5808bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelOz)
5818bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 2, 2);
582fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
58361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO3)
5848bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth    AddOptimizationPasses(Passes, *FPasses, 3, 0);
58561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
5868bc3434e68028263c42dd26bde3c16450cb146f4Chandler Carruth  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
5873e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner    FPasses->doInitialization();
588ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    for (Function &F : *M)
589ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      FPasses->run(F);
5903e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner    FPasses->doFinalization();
5913e8984a0c43b04d8a8fe88a9c187e9e338d169b4Chris Lattner  }
59261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
59361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Check that the module is well formed on completion of optimization
5944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!NoVerify && !VerifyEach)
59561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Passes.add(createVerifierPass());
59661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
5974931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  // Write bitcode or assembly to the output as the last step...
59861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (!NoOutput && !AnalyzeOnly) {
59961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OutputAssembly)
6002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      Passes.add(
6012c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          createPrintModulePass(Out->os(), "", PreserveAssemblyUseListOrder));
60261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
6032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      Passes.add(
6042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          createBitcodeWriterPass(Out->os(), PreserveBitcodeUseListOrder));
60561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
60661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
607ce96902d88d473697f05c0465952dae374be564eAndrew Trick  // Before executing passes, print the final values of the LLVM options.
608ce96902d88d473697f05c0465952dae374be564eAndrew Trick  cl::PrintOptionValues();
609ce96902d88d473697f05c0465952dae374be564eAndrew Trick
61061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Now that we have all of the passes ready, run them.
611ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Passes.run(*M);
61261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
613d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  // Declare success.
614f5f2300d2489ba1110b919abd18714ad707ec9a8Devang Patel  if (!NoOutput || PrintBreakpoints)
615d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    Out->keep();
616d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman
61761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  return 0;
618009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
619