LLVMTargetMachine.cpp revision 9c04b5bd282bd5d03ab2114339d670ca95073664
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the LLVMTargetMachine class. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Target/TargetMachine.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/PassManager.h" 164c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall#include "llvm/Analysis/Passes.h" 173f2af1002249c8acc9ce17f1fc50324864feb8e1Eli Friedman#include "llvm/Analysis/Verifier.h" 18f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall#include "llvm/Assembly/PrintModulePass.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/CodeGen/AsmPrinter.h" 2031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner#include "llvm/CodeGen/MachineFunctionAnalysis.h" 21de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "llvm/CodeGen/MachineModuleInfo.h" 22c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "llvm/CodeGen/GCStrategy.h" 232b77ba8bc7a842829ad9193816dc1d7d5e9c5be6Anders Carlsson#include "llvm/CodeGen/Passes.h" 246a1e0eb557d47e85185e09bdf8721f53f4bf9c9cMike Stump#include "llvm/Target/TargetLowering.h" 257255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner#include "llvm/Target/TargetOptions.h" 264e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump#include "llvm/MC/MCAsmInfo.h" 277255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner#include "llvm/MC/MCStreamer.h" 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Target/TargetAsmInfo.h" 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Target/TargetData.h" 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Target/TargetRegistry.h" 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "llvm/Transforms/Scalar.h" 32d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall#include "llvm/ADT/OwningPtr.h" 33aac8705c046f01a264a4f82832895a5d9e695633Owen Anderson#include "llvm/Support/CommandLine.h" 34d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall#include "llvm/Support/Debug.h" 35ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall#include "llvm/Support/FormattedStream.h" 36f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallusing namespace llvm; 37ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 38f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace llvm { 392504941793b549323f9d29c62507cf21d865fadeJohn McCall bool EnableFastISel; 40150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall} 4183252dcfe61aaebcb6bc117e71dc12968729513fChris Lattner 4277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattnerstatic cl::opt<bool> DisablePostRA("disable-post-ra", cl::Hidden, 4377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner cl::desc("Disable Post Regalloc")); 444e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stumpstatic cl::opt<bool> DisableBranchFold("disable-branch-fold", cl::Hidden, 4577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner cl::desc("Disable branch folding")); 4677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattnerstatic cl::opt<bool> DisableTailDuplicate("disable-tail-duplicate", cl::Hidden, 4777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner cl::desc("Disable tail duplication")); 4877b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattnerstatic cl::opt<bool> DisableEarlyTailDup("disable-early-taildup", cl::Hidden, 49d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall cl::desc("Disable pre-register allocation tail duplication")); 5077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattnerstatic cl::opt<bool> DisableCodePlace("disable-code-place", cl::Hidden, 51d88ea5687968640ada2bc5a10211cbeb68a671ecMike Stump cl::desc("Disable code placement")); 529c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stumpstatic cl::opt<bool> DisableSSC("disable-ssc", cl::Hidden, 534c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall cl::desc("Disable Stack Slot Coloring")); 544111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnerstatic cl::opt<bool> DisableMachineLICM("disable-machine-licm", cl::Hidden, 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::desc("Disable Machine LICM")); 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm", 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::Hidden, 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::desc("Disable Machine LICM")); 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic cl::opt<bool> DisableMachineSink("disable-machine-sink", cl::Hidden, 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::desc("Disable Machine Sinking")); 618b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbarstatic cl::opt<bool> DisableLSR("disable-lsr", cl::Hidden, 628b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbar cl::desc("Disable Loop Strength Reduction Pass")); 638b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbarstatic cl::opt<bool> DisableCGP("disable-cgp", cl::Hidden, 648b1a343b6b360d63d5dc8a6beb841ce4414c1e00Daniel Dunbar cl::desc("Disable Codegen Prepare")); 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden, 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::desc("Print LLVM IR produced by the loop-reduce pass")); 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden, 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer cl::desc("Print LLVM IR input to isel pass")); 694111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnerstatic cl::opt<bool> PrintGCInfo("print-gc", cl::Hidden, 70e9d34dc7afe06c9adaacad7a678a0cbbf749ea75Anders Carlsson cl::desc("Dump garbage collector data")); 71d608cdb7c044365cf4e8764ade1e11e99c176078John McCallstatic cl::opt<bool> ShowMCEncoding("show-mc-encoding", cl::Hidden, 724111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner cl::desc("Show encoding in .s output")); 73391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnerstatic cl::opt<bool> ShowMCInst("show-mc-inst", cl::Hidden, 741c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar cl::desc("Show instruction structure in .s output")); 751c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbarstatic cl::opt<bool> EnableMCLogging("enable-mc-api-logging", cl::Hidden, 761c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar cl::desc("Enable MC API logging")); 771c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbarstatic cl::opt<bool> VerifyMachineCode("verify-machineinstrs", cl::Hidden, 781c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar cl::desc("Verify generated machine code"), 791c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar cl::init(getenv("LLVM_VERIFY_MACHINEINSTRS")!=NULL)); 801c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar 811c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbarstatic cl::opt<cl::boolOrDefault> 8296e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel DunbarAsmVerbose("asm-verbose", cl::desc("Add comments to directives."), 8396e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel Dunbar cl::init(cl::BOU_UNSET)); 84ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 85ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallstatic bool getVerboseAsm() { 86ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall switch (AsmVerbose) { 8796e18b05ea6b55aa92a1a576f29e9cee73a7e20bDaniel Dunbar default: 88ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall case cl::BOU_UNSET: return TargetMachine::getAsmVerbosityDefault(); 891c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar case cl::BOU_TRUE: return true; 901c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar case cl::BOU_FALSE: return false; 911c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar } 921c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar} 931c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar 941c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar// Enable or disable FastISel. Both options are needed, because 95ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// FastISel is enabled by default with -fast, and we wish to be 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// able to enable or disable fast-isel independently from -O0. 97ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallstatic cl::opt<cl::boolOrDefault> 98f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallEnableFastISelOption("fast-isel", cl::Hidden, 99ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall cl::desc("Enable the \"fast\" instruction selector")); 1001c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar 1011c1d6074f5a0296dd273362655b1b8f9057289e3Daniel DunbarLLVMTargetMachine::LLVMTargetMachine(const Target &T, 1021c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar const std::string &Triple) 103ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall : TargetMachine(T), TargetTriple(Triple) { 1041c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar AsmInfo = T.createAsmInfo(TargetTriple); 1051c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar} 1061c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar 1071c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar// Set the default code model for the JIT for a generic target. 108f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump// FIXME: Is small right here? or .is64Bit() ? Large : Small? 109f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stumpvoid LLVMTargetMachine::setCodeModelForJIT() { 110f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump setCodeModel(CodeModel::Small); 1111c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar} 112ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 113f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// Set the default code model for static compilation for a generic target. 114f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallvoid LLVMTargetMachine::setCodeModelForStatic() { 115f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall setCodeModel(CodeModel::Small); 116f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 117f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 118f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallbool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 119f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall formatted_raw_ostream &Out, 1201c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar CodeGenFileType FileType, 1211c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar CodeGenOpt::Level OptLevel, 122af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar bool DisableVerify) { 123391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Add common CodeGen passes. 124391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner MCContext *Context = 0; 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (addCommonCodeGenPasses(PM, OptLevel, DisableVerify, Context)) 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return true; 1271c1d6074f5a0296dd273362655b1b8f9057289e3Daniel Dunbar assert(Context != 0 && "Failed to get MCContext"); 128f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar 129a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar if (hasMCSaveTempLabels()) 130a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar Context->setAllowTemporaryLabels(false); 1317255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 132f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar const MCAsmInfo &MAI = *getMCAsmInfo(); 133e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson OwningPtr<MCStreamer> AsmStreamer; 134f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar 1355a6fbcfd8c15a2296f94a0473a68ec09d429827fDevang Patel switch (FileType) { 136f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar default: return true; 137f5bd45c8e6fa7519cdc17ec3ff4917e279c6a041Daniel Dunbar case CGFT_AssemblyFile: { 13835b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner MCInstPrinter *InstPrinter = 139cce3d4f9812182ed4e551b7cf0fc86576be8d9c5Mike Stump getTarget().createMCInstPrinter(*this, MAI.getAssemblerDialect(), MAI); 1405ca2084cf9b529563209429857f01fdae9dcdfa5Daniel Dunbar 141f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // Create a code emitter if asked to show the encoding. 142f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall MCCodeEmitter *MCE = 0; 143f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall TargetAsmBackend *TAB = 0; 144d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner if (ShowMCEncoding) { 145d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner MCE = getTarget().createCodeEmitter(*this, *Context); 146d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner TAB = getTarget().createAsmBackend(TargetTriple); 147d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner } 148d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner 149d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, 150d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner getVerboseAsm(), 151391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner hasMCUseLoc(), 152481769b5dc102b0256b35581e787909ad5edfab5Chris Lattner hasMCUseCFI(), 153391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner InstPrinter, 154481769b5dc102b0256b35581e787909ad5edfab5Chris Lattner MCE, TAB, 155d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner ShowMCInst); 156d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner AsmStreamer.reset(S); 157d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner break; 158d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner } 159d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner case CGFT_ObjectFile: { 160d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner // Create the code emitter for the target if it exists. If not, .o file 161d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner // emission fails. 162d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Context); 163d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple); 164d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner if (MCE == 0 || TAB == 0) 165f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall return true; 166ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 167f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall AsmStreamer.reset(getTarget().createObjectStreamer(TargetTriple, *Context, 168f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall *TAB, Out, MCE, 169f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall hasMCRelaxAll(), 170744016dde06fcffd50931e94a98c850f8b12cd87John McCall hasMCNoExecStack())); 171744016dde06fcffd50931e94a98c850f8b12cd87John McCall AsmStreamer.get()->InitSections(); 172744016dde06fcffd50931e94a98c850f8b12cd87John McCall break; 173c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner } 174c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner case CGFT_Null: 1757255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner // The Null output is intended for use for performance analysis and testing, 1767255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner // not real users. 1777255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner AsmStreamer.reset(createNullStreamer(*Context)); 1787255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner break; 1797255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner } 1807255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 1817255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner if (EnableMCLogging) 1827255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner AsmStreamer.reset(createLoggingStreamer(AsmStreamer.take(), errs())); 1837255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 1847255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 1857255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 1867255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner if (Printer == 0) 1877255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner return true; 1887255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 1898dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner // If successful, createAsmPrinter took ownership of AsmStreamer. 1907255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner AsmStreamer.take(); 1917255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 1927255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner PM.add(Printer); 1938dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner 194d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall // Make sure the code model is set. 1958dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner setCodeModelForStatic(); 1968dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner PM.add(createGCInfoDeleter()); 197d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall return false; 198d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall} 1997255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 2007255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2017255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// get machine code emitted. This uses a JITCodeEmitter object to handle 2027255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// actually outputting the machine code and resolving things like the address 20377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner/// of functions. This method should returns true if machine code emission is 2047255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// not supported. 2057255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner/// 2068dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattnerbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, 2078dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner JITCodeEmitter &JCE, 2088dab6571b2cab96f44d0a1d6e3edbfdb68b7ed6bChris Lattner CodeGenOpt::Level OptLevel, 2097255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner bool DisableVerify) { 2107255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner // Make sure the code model is set. 211be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky setCodeModelForJIT(); 212be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky 213be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky // Add common CodeGen passes. 214be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky MCContext *Ctx = 0; 215be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (addCommonCodeGenPasses(PM, OptLevel, DisableVerify, Ctx)) 216be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky return true; 217be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky 218be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky addCodeEmitter(PM, OptLevel, JCE); 219be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky PM.add(createGCInfoDeleter()); 2200ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson 2217c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar return false; // success! 2222284ac9ec80299fcdefae9a2787cf85105a0f203Daniel Dunbar} 2232284ac9ec80299fcdefae9a2787cf85105a0f203Daniel Dunbar 2240ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson/// addPassesToEmitMC - Add passes to the specified pass manager to get 2250ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson/// machine code emitted with the MCJIT. This method returns true if machine 2264cc1a4703363ff940b6273aeef9d96a87edeb04bAnders Carlsson/// code is not supported. It fills the MCContext Ctx pointer which can be 227b5437d238752dc297e42410e98d38d5250fe0463Chris Lattner/// used to build custom MCStreamer. 2287c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar/// 229bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MCContext *&Ctx, 231ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner raw_ostream &Out, 232a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen CodeGenOpt::Level OptLevel, 233a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen bool DisableVerify) { 234a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen // Add common CodeGen passes. 235a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen if (addCommonCodeGenPasses(PM, OptLevel, DisableVerify, Ctx)) 236a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen return true; 237a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen 238a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen if (hasMCSaveTempLabels()) 239a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen Ctx->setAllowTemporaryLabels(false); 240a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen 241a3fe2842e0cf953241ccc05809afdf84f13798e9Jakob Stoklund Olesen // Create the code emitter for the target if it exists. If not, .o file 24255e874299f2ad827646a4ca9ea38c402aaeb38c9Daniel Dunbar // emission fails. 2435ca2084cf9b529563209429857f01fdae9dcdfa5Daniel Dunbar MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Ctx); 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple); 24555352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner if (MCE == 0 || TAB == 0) 24655352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner return true; 24777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner 24877b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner OwningPtr<MCStreamer> AsmStreamer; 249f1466848dce9c4c75d96a6cabdc8db560e26aac8Chris Lattner AsmStreamer.reset(getTarget().createObjectStreamer(TargetTriple, *Ctx, 250f1466848dce9c4c75d96a6cabdc8db560e26aac8Chris Lattner *TAB, Out, MCE, 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump hasMCRelaxAll(), 252f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall hasMCNoExecStack())); 2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump AsmStreamer.get()->InitSections(); 25455352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner 2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 256af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 257e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson if (Printer == 0) 258e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return true; 259e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 260e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall // If successful, createAsmPrinter took ownership of AsmStreamer. 261e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall AsmStreamer.take(); 262e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 263e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall PM.add(Printer); 2642284ac9ec80299fcdefae9a2787cf85105a0f203Daniel Dunbar 2659c6c3a0e3ae09626d2d4b04e4ffa42c3d7cab32bDevang Patel // Make sure the code model is set. 266af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta setCodeModelForJIT(); 267af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta 268a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar return false; // success! 269a18652fe1e8233fbf8b67484945c7f7b2bf272beDaniel Dunbar} 2707255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 271be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divackystatic void printNoVerify(PassManagerBase &PM, const char *Banner) { 272be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (PrintMachineCode) 273be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky PM.add(createMachineFunctionPrinterPass(dbgs(), Banner)); 27488b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar} 27504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall 27604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic void printAndVerify(PassManagerBase &PM, 277264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola const char *Banner) { 278b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman if (PrintMachineCode) 279b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman PM.add(createMachineFunctionPrinterPass(dbgs(), Banner)); 280b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman 281b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman if (VerifyMachineCode) 282b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman PM.add(createMachineVerifierPass(Banner)); 283b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman} 284b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman 285647a1ec397fa13af176d07d9f5d071560a94c7a9Daniel Dunbar/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for both 286b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman/// emitting to assembly files or machine code output. 287b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman/// 288647a1ec397fa13af176d07d9f5d071560a94c7a9Daniel Dunbarbool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, 289b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman CodeGenOpt::Level OptLevel, 290b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman bool DisableVerify, 291cce3d4f9812182ed4e551b7cf0fc86576be8d9c5Mike Stump MCContext *&OutContext) { 29288b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar // Standard LLVM-Level Passes. 2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2944c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall // Basic AliasAnalysis support. 2954c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that 2962504941793b549323f9d29c62507cf21d865fadeJohn McCall // BasicAliasAnalysis wins if they disagree. This is intended to help 297751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson // support "obvious" type-punning idioms. 298751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson PM.add(createTypeBasedAliasAnalysisPass()); 299751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson PM.add(createBasicAliasAnalysisPass()); 300751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson 301751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson // Before running any passes, run the verifier to determine if the input 302751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson // coming from the front-end and/or optimizer is valid. 303751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson if (!DisableVerify) 304751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson PM.add(createVerifierPass()); 305751358ff73b155f5384e151e1d18aa3f6e7b061cAnders Carlsson 3067c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar // Run loop strength reduction before anything else. 307eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman if (OptLevel != CodeGenOpt::None && !DisableLSR) { 3089fc6a7774643a810c8501dae2323e863fefb623eJohn McCall PM.add(createLoopStrengthReducePass(getTargetLowering())); 3099fc6a7774643a810c8501dae2323e863fefb623eJohn McCall if (PrintLSR) 31006a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs())); 31106a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor } 312a355e07454463b19829ac92ffd115a097faff0e0John McCall 313a355e07454463b19829ac92ffd115a097faff0e0John McCall PM.add(createGCLoweringPass()); 31439dad53772c42eb36ebec1c81c56ba99d038fb94John McCall 31539dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // Make sure that no unreachable blocks are instruction selected. 31639dad53772c42eb36ebec1c81c56ba99d038fb94John McCall PM.add(createUnreachableBlockEliminationPass()); 31739dad53772c42eb36ebec1c81c56ba99d038fb94John McCall 318b3a29f132794f67108bccc9c7cc3795365e8a965John McCall // Turn exception handling constructs into something the code generators can 319b3a29f132794f67108bccc9c7cc3795365e8a965John McCall // handle. 320b3a29f132794f67108bccc9c7cc3795365e8a965John McCall switch (getMCAsmInfo()->getExceptionHandlingType()) { 321b3a29f132794f67108bccc9c7cc3795365e8a965John McCall case ExceptionHandling::SjLj: 32239dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both 32339dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise, 32439dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // catch info can get misplaced when a selector ends up more than one block 32539dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // removed from the parent invoke(s). This could happen when a landing 32639dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // pad is shared by multiple invokes and is also a target of a normal 32739dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // edge from elsewhere. 32839dad53772c42eb36ebec1c81c56ba99d038fb94John McCall PM.add(createSjLjEHPass(getTargetLowering())); 32939dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // FALLTHROUGH 33039dad53772c42eb36ebec1c81c56ba99d038fb94John McCall case ExceptionHandling::DwarfCFI: 331c997d4278d329e18891aac9698fb991b2d4622ebAnders Carlsson case ExceptionHandling::ARM: 3320ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson case ExceptionHandling::Win64: 3330ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson PM.add(createDwarfEHPass(this)); 334e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson break; 3351feade8e520be483293dbf55eb57a51720899589Mike Stump case ExceptionHandling::None: 336e896d98548b02223c7740d807a0aa6e20fba7079Anders Carlsson PM.add(createLowerInvokePass(getTargetLowering())); 3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3387c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar // The lower invoke pass may create unreachable code. Remove it. 3394c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall PM.add(createUnreachableBlockEliminationPass()); 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 3416a1e0eb557d47e85185e09bdf8721f53f4bf9c9cMike Stump } 3424c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 3434c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall if (OptLevel != CodeGenOpt::None && !DisableCGP) 3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PM.add(createCodeGenPreparePass(getTargetLowering())); 345eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman 346183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall PM.add(createStackProtectorPass(getTargetLowering())); 347eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman 3487c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar addPreISel(PM, OptLevel); 3497c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (PrintISelInput) 3517c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar PM.add(createPrintFunctionPass("\n\n" 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "*** Final LLVM Code input to ISel ***\n", 353af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar &dbgs())); 354a355e07454463b19829ac92ffd115a097faff0e0John McCall 355a355e07454463b19829ac92ffd115a097faff0e0John McCall // All passes which modify the LLVM IR are now complete; run the verifier 3564365bba95be15342575b4f030c6583a770a5da3dAnders Carlsson // to ensure that the IR is valid. 357a355e07454463b19829ac92ffd115a097faff0e0John McCall if (!DisableVerify) 3584c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall PM.add(createVerifierPass()); 3591851a12605bc6f1ea70d11974a315340ebaab6ebAnders Carlsson 360a355e07454463b19829ac92ffd115a097faff0e0John McCall // Standard Lower-Level Passes. 3619fc6a7774643a810c8501dae2323e863fefb623eJohn McCall 3629fc6a7774643a810c8501dae2323e863fefb623eJohn McCall // Install a MachineModuleInfo class, which is an immutable pass that holds 3639fc6a7774643a810c8501dae2323e863fefb623eJohn McCall // all the per-module stuff we're generating, including MCContext. 3649fc6a7774643a810c8501dae2323e863fefb623eJohn McCall TargetAsmInfo *TAI = new TargetAsmInfo(*this); 3659fc6a7774643a810c8501dae2323e863fefb623eJohn McCall MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(), TAI); 3669fc6a7774643a810c8501dae2323e863fefb623eJohn McCall PM.add(MMI); 367c33e4ba20304e222692e77f2c6ad26a5d8d32f83Anders Carlsson OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref. 368a355e07454463b19829ac92ffd115a097faff0e0John McCall 369a355e07454463b19829ac92ffd115a097faff0e0John McCall // Set up a MachineFunction for the rest of CodeGen to work on. 37039dad53772c42eb36ebec1c81c56ba99d038fb94John McCall PM.add(new MachineFunctionAnalysis(*this, OptLevel)); 37139dad53772c42eb36ebec1c81c56ba99d038fb94John McCall 37239dad53772c42eb36ebec1c81c56ba99d038fb94John McCall // Enable FastISel with -fast, but allow that to be overridden. 37339dad53772c42eb36ebec1c81c56ba99d038fb94John McCall if (EnableFastISelOption == cl::BOU_TRUE || 37439dad53772c42eb36ebec1c81c56ba99d038fb94John McCall (OptLevel == CodeGenOpt::None && EnableFastISelOption != cl::BOU_FALSE)) 3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EnableFastISel = true; 3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3770946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // Ask the target for an isel. 3780946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner if (addInstSelector(PM, OptLevel)) 3790946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner return true; 3800946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner 3810946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // Print the instruction selected machine code... 3820946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner printAndVerify(PM, "After Instruction Selection"); 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3840946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // Expand pseudo-instructions emitted by ISel. 3850946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner PM.add(createExpandISelPseudosPass()); 3860946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner 3870946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // Pre-ra tail duplication. 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (OptLevel != CodeGenOpt::None && !DisableEarlyTailDup) { 3890946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner PM.add(createTailDuplicatePass(true)); 3900946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner printAndVerify(PM, "After Pre-RegAlloc TailDuplicate"); 3910946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner } 3920946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Optimize PHIs before DCE: removing dead PHI cycles may make more 3940946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // instructions dead. 3950946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner if (OptLevel != CodeGenOpt::None) 3960946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner PM.add(createOptimizePHIsPass()); 3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3980946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // If the target requests it, assign local variables to stack slots relative 3997502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall // to one another and simplify frame index references where possible. 4000946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner PM.add(createLocalStackSlotAllocationPass()); 4010946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner 4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (OptLevel != CodeGenOpt::None) { 4030946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // With optimization, dead code should already be eliminated. However 4040946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // there is one known exception: lowered code for arguments that are only 4050946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner // used by tail calls, where the tail calls reuse the incoming stack 40631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll). 40731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createDeadMachineInstructionElimPass()); 40831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printAndVerify(PM, "After codegen DCE pass"); 40931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 41031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (!DisableMachineLICM) 41131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createMachineLICMPass()); 41236bc14c3a1cf63ee306df5687ac8e85f924f8639Daniel Dunbar PM.add(createMachineCSEPass()); 41336bc14c3a1cf63ee306df5687ac8e85f924f8639Daniel Dunbar if (!DisableMachineSink) 41464712f196bffd41fb0552c2643b07a25c3e45082Anders Carlsson PM.add(createMachineSinkingPass()); 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printAndVerify(PM, "After Machine LICM, CSE and Sinking passes"); 41664712f196bffd41fb0552c2643b07a25c3e45082Anders Carlsson 417ef5a66d8171eb95e948107f8ee7707b360aaff25Anders Carlsson PM.add(createPeepholeOptimizerPass()); 4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printAndVerify(PM, "After codegen peephole optimization pass"); 41931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner } 42031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Run pre-ra passes. 42264712f196bffd41fb0552c2643b07a25c3e45082Anders Carlsson if (addPreRegAlloc(PM, OptLevel)) 42331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printAndVerify(PM, "After PreRegAlloc passes"); 42431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 42531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Perform register allocation. 42631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createRegisterAllocator(OptLevel)); 42731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printAndVerify(PM, "After Register Allocation"); 42831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 42931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Perform stack slot coloring and post-ra machine LICM. 43031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (OptLevel != CodeGenOpt::None) { 43131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // FIXME: Re-enable coloring with register when it's capable of adding 43231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // kill markers. 43331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (!DisableSSC) 43431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createStackSlotColoringPass(false)); 4351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Run post-ra machine LICM to hoist reloads / remats. 43731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (!DisablePostRAMachineLICM) 4382de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall PM.add(createMachineLICMPass(false)); 43931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 44031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printAndVerify(PM, "After StackSlotColoring and postra Machine LICM"); 44131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner } 44231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 44331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Run post-ra passes. 44431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (addPostRegAlloc(PM, OptLevel)) 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printAndVerify(PM, "After PostRegAlloc passes"); 44631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 44731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createLowerSubregsPass()); 44831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printAndVerify(PM, "After LowerSubregs"); 44931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 45031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Insert prolog/epilog code. Eliminate abstract frame index references... 45131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createPrologEpilogCodeInserter()); 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printAndVerify(PM, "After PrologEpilogCodeInserter"); 45331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 45431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Run pre-sched2 passes. 4559615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar if (addPreSched2(PM, OptLevel)) 456150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall printAndVerify(PM, "After PreSched2 passes"); 457150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall 45831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Second pass scheduler. 45931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (OptLevel != CodeGenOpt::None && !DisablePostRA) { 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PM.add(createPostRAScheduler(OptLevel)); 46108e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson printAndVerify(PM, "After PostRAScheduler"); 462150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall } 46331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 464150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall // Branch folding must be run after regalloc and prolog/epilog insertion. 46508e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson if (OptLevel != CodeGenOpt::None && !DisableBranchFold) { 46631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 4672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall printNoVerify(PM, "After BranchFolding"); 46831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner } 46931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 47031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner // Tail duplication. 47131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (OptLevel != CodeGenOpt::None && !DisableTailDuplicate) { 47231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createTailDuplicatePass(false)); 47331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printNoVerify(PM, "After TailDuplicate"); 4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 47531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 47631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createGCMachineCodeAnalysisPass()); 47731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 47831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner if (PrintGCInfo) 47931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createGCInfoPrinter(dbgs())); 48031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (OptLevel != CodeGenOpt::None && !DisableCodePlace) { 48231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner PM.add(createCodePlacementOptPass()); 48331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printNoVerify(PM, "After CodePlacementOpt"); 4849615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar } 485150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall 486150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall if (addPreEmitPass(PM, OptLevel)) 48731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner printNoVerify(PM, "After PreEmit passes"); 48831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner 4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return false; 49008e9e453f40aff95a59bd67db49b8f050765e1f0Anders Carlsson} 491150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall