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