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