LLVMTargetMachine.cpp revision 9ef4c5302eb547936f6586ece880f31104d2f801
147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// 247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// The LLVM Compiler Infrastructure 447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===// 947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 1047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// This file implements the LLVMTargetMachine class. 1147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 1247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===// 1347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetMachine.h" 1547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/PassManager.h" 1647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Pass.h" 1731442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Assembly/PrintModulePass.h" 180f54dcbf07c69e41ecaa6b4fbf0d94956d8e9ff5Devang Patel#include "llvm/Analysis/LoopPass.h" 1947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/CodeGen/Passes.h" 2093f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen#include "llvm/CodeGen/Collector.h" 2147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetOptions.h" 221532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen#include "llvm/Target/TargetAsmInfo.h" 2347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Transforms/Scalar.h" 2431442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 2547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm; 2647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2785ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden, 2885ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner cl::desc("Print LLVM IR produced by the loop-reduce pass")); 2985ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden, 3085ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner cl::desc("Print LLVM IR input to isel pass")); 318bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Chengstatic cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden, 328bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng cl::desc("Dump emitter generated instructions as assembly")); 3393f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksenstatic cl::opt<bool> PrintGCInfo("print-gc", cl::Hidden, 3493f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen cl::desc("Dump garbage collector data")); 3585ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner 36c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner// Hidden options to help debugging 37c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattnerstatic cl::opt<bool> 38c4ce73f666e7ab9a270982a575101df8aa6160d3Chris LattnerEnableSinking("enable-sinking", cl::init(false), cl::Hidden, 39c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner cl::desc("Perform sinking on machine code")); 40cc8f603f531c906782e4966107ae29667eb6632cBill Wendlingstatic cl::opt<bool> 413f32d65912b4da23793dab618d981be2ce11c331Evan ChengEnableLICM("machine-licm", 423f32d65912b4da23793dab618d981be2ce11c331Evan Cheng cl::init(false), cl::Hidden, 433f32d65912b4da23793dab618d981be2ce11c331Evan Cheng cl::desc("Perform loop-invariant code motion on machine code")); 44c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner 45459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner// When this works it will be on by default. 46459525df1e003597077197b5f802bd5d9cd7d94cChris Lattnerstatic cl::opt<bool> 47459525df1e003597077197b5f802bd5d9cd7d94cChris LattnerDisablePostRAScheduler("disable-post-RA-scheduler", 48459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner cl::desc("Disable scheduling after register allocation"), 49459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner cl::init(true)); 50459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner 5104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill WendlingFileModel::Model 52bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan GohmanLLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 5304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling std::ostream &Out, 5404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling CodeGenFileType FileType, 5504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling bool Fast) { 5647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Standard LLVM-Level Passes. 5747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 5847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run loop strength reduction before anything else. 5931442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner if (!Fast) { 6031442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner PM.add(createLoopStrengthReducePass(getTargetLowering())); 6131442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner if (PrintLSR) 6262c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr)); 6331442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner } 6447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 6593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createGCLoweringPass()); 66c3751600b7a5dee550c5e50cb83065630759467fDuncan Sands 671532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen if (!getTargetAsmInfo()->doesSupportExceptionHandling()) 68b6d5b1439047609c050576f3dc52b722e76bd30bDale Johannesen PM.add(createLowerInvokePass(getTargetLowering())); 69c3751600b7a5dee550c5e50cb83065630759467fDuncan Sands 7047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Make sure that no unreachable blocks are instruction selected. 7147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createUnreachableBlockEliminationPass()); 7204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 73c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) 74c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createCodeGenPreparePass(getTargetLowering())); 75c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 76c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintISelInput) 7762c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n", 78c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner &cerr)); 79c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 8047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Ask the target for an isel. 8147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addInstSelector(PM, Fast)) 8204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 8304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 8447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Print the instruction selected machine code... 8547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 8604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 870f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 883f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (EnableLICM) 89cc8f603f531c906782e4966107ae29667eb6632cBill Wendling PM.add(createMachineLICMPass()); 90c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner 91c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner if (EnableSinking) 92c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner PM.add(createMachineSinkingPass()); 930f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 94769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov // Run pre-ra passes. 95769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov if (addPreRegAlloc(PM, Fast) && PrintMachineCode) 96769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov PM.add(createMachineFunctionPrinterPass(cerr)); 97769b481e9f57b9fa2acf6c5fe0a94877520fcec3Anton Korobeynikov 9847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Perform register allocation to convert to a concrete x86 representation 9947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createRegisterAllocator()); 10047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1013f32d65912b4da23793dab618d981be2ce11c331Evan Cheng // Perform stack slot coloring. 1029ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng if (!Fast) 1039ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng PM.add(createStackSlotColoringPass()); 1043f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 1053f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (PrintMachineCode) // Print the register-allocated code 10604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 107ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 10847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run post-ra passes. 10947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 11004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 11104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 1123f32d65912b4da23793dab618d981be2ce11c331Evan Cheng PM.add(createLowerSubregsPass()); 1133f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 1143f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (PrintMachineCode) // Print the subreg lowered code 1153f32d65912b4da23793dab618d981be2ce11c331Evan Cheng PM.add(createMachineFunctionPrinterPass(cerr)); 1163f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 11747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Insert prolog/epilog code. Eliminate abstract frame index references... 11847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createPrologEpilogCodeInserter()); 11947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 1203f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (PrintMachineCode) 1213f32d65912b4da23793dab618d981be2ce11c331Evan Cheng PM.add(createMachineFunctionPrinterPass(cerr)); 1223f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 123e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen // Second pass scheduler. 124459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner if (!Fast && !DisablePostRAScheduler) 12572f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen PM.add(createPostRAScheduler()); 126e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen 1274a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner // Branch folding must be run after regalloc and prolog/epilog insertion. 12862d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey if (!Fast) 129e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 1300f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 13193f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createGCMachineCodeAnalysisPass()); 13293f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen if (PrintMachineCode) 13393f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createMachineFunctionPrinterPass(cerr)); 13493f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 13593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen if (PrintGCInfo) 13693f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createCollectorMetadataPrinter(*cerr)); 13793f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 1389d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Fold redundant debug labels. 1399d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey PM.add(createDebugLabelFoldingPass()); 1404a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner 14147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) // Print the register-allocated code 14204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 14304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 14447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPreEmitPass(PM, Fast) && PrintMachineCode) 14504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 14604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 1473f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (!Fast && !OptimizeForSize) 148d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng PM.add(createLoopAlignerPass()); 149d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng 15047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 15104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling default: 15204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling break; 15304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling case TargetMachine::AssemblyFile: 15404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (addAssemblyEmitter(PM, Fast, Out)) 15504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 15604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::AsmFile; 15704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling case TargetMachine::ObjectFile: 15804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (getMachOWriterInfo()) 15904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::MachOFile; 16004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling else if (getELFWriterInfo()) 16104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::ElfFile; 16247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 16304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 16404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 16504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling} 16604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 16704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// addPassesToEmitFileFinish - If the passes to emit the specified file had to 16804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// be split up (e.g., to add an object writer pass), this method can be used to 16904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// finish up adding passes to emit the file, if necessary. 170bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM, 17104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling MachineCodeEmitter *MCE, 17204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling bool Fast) { 17304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (MCE) 1748bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE); 17593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 17693f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createCollectorMetadataDeleter()); 17704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 17847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Delete machine code for this function 17947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createMachineCodeDeleter()); 18004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 18147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return false; // success! 18247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 18347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 18447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 18547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// get machine code emitted. This uses a MachineCodeEmitter object to handle 18647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// actually outputting the machine code and resolving things like the address 18747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// of functions. This method should returns true if machine code emission is 18847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// not supported. 18947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// 190bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, 19147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner MachineCodeEmitter &MCE, 19247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner bool Fast) { 19347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Standard LLVM-Level Passes. 19447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 19547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run loop strength reduction before anything else. 196c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) { 197c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createLoopStrengthReducePass(getTargetLowering())); 198c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintLSR) 19962c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr)); 200c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner } 20147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 20293f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createGCLoweringPass()); 20347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2041532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen if (!getTargetAsmInfo()->doesSupportExceptionHandling()) 205b6d5b1439047609c050576f3dc52b722e76bd30bDale Johannesen PM.add(createLowerInvokePass(getTargetLowering())); 20647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 20747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Make sure that no unreachable blocks are instruction selected. 20847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createUnreachableBlockEliminationPass()); 20904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 210c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) 211c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createCodeGenPreparePass(getTargetLowering())); 212c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 213c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintISelInput) 21462c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n", 215c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner &cerr)); 216c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 21747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Ask the target for an isel. 21847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addInstSelector(PM, Fast)) 21947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return true; 22004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 22147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Print the instruction selected machine code... 22247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 22304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 2240f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 2253f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (EnableLICM) 226cc8f603f531c906782e4966107ae29667eb6632cBill Wendling PM.add(createMachineLICMPass()); 2273c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner 2283c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner if (EnableSinking) 2293c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner PM.add(createMachineSinkingPass()); 2300f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 231b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov // Run pre-ra passes. 232b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov if (addPreRegAlloc(PM, Fast) && PrintMachineCode) 233b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov PM.add(createMachineFunctionPrinterPass(cerr)); 234b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov 2353f32d65912b4da23793dab618d981be2ce11c331Evan Cheng // Perform register allocation. 23647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createRegisterAllocator()); 2373f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 2383f32d65912b4da23793dab618d981be2ce11c331Evan Cheng // Perform stack slot coloring. 2399ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng if (!Fast) 2409ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng PM.add(createStackSlotColoringPass()); 2413f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 24247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 24304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 244ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 2453f32d65912b4da23793dab618d981be2ce11c331Evan Cheng // Run post-ra passes. 2463f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 2473f32d65912b4da23793dab618d981be2ce11c331Evan Cheng PM.add(createMachineFunctionPrinterPass(cerr)); 2483f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 2493f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (PrintMachineCode) // Print the register-allocated code 2503f32d65912b4da23793dab618d981be2ce11c331Evan Cheng PM.add(createMachineFunctionPrinterPass(cerr)); 2513f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 252ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createLowerSubregsPass()); 253ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 254ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb if (PrintMachineCode) // Print the subreg lowered code 255ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createMachineFunctionPrinterPass(cerr)); 25604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 25747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Insert prolog/epilog code. Eliminate abstract frame index references... 25847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createPrologEpilogCodeInserter()); 25947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2603f32d65912b4da23793dab618d981be2ce11c331Evan Cheng if (PrintMachineCode) 26104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 26247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 263e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen // Second pass scheduler. 26472f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen if (!Fast) 26572f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen PM.add(createPostRAScheduler()); 266e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen 267e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner // Branch folding must be run after regalloc and prolog/epilog insertion. 268e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner if (!Fast) 269e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 2700f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 27193f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createGCMachineCodeAnalysisPass()); 2723f32d65912b4da23793dab618d981be2ce11c331Evan Cheng 27393f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen if (PrintMachineCode) 27493f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createMachineFunctionPrinterPass(cerr)); 27593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 27693f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen if (PrintGCInfo) 27793f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createCollectorMetadataPrinter(*cerr)); 27893f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 27947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPreEmitPass(PM, Fast) && PrintMachineCode) 28004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 28104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 2828bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); 28347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 28493f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen PM.add(createCollectorMetadataDeleter()); 28593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen 28647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Delete machine code for this function 28747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createMachineCodeDeleter()); 28847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 28947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return false; // success! 29047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 291