LLVMTargetMachine.cpp revision 3c42f1211874665e8ea6eea55a45024b557afa61
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" 2047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetOptions.h" 2147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Transforms/Scalar.h" 2231442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 2347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm; 2447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 2585ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden, 2685ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner cl::desc("Print LLVM IR produced by the loop-reduce pass")); 2785ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden, 2885ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner cl::desc("Print LLVM IR input to isel pass")); 298bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Chengstatic cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden, 308bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng cl::desc("Dump emitter generated instructions as assembly")); 3185ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner 32c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner// Hidden options to help debugging 33c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattnerstatic cl::opt<bool> 34c4ce73f666e7ab9a270982a575101df8aa6160d3Chris LattnerEnableSinking("enable-sinking", cl::init(false), cl::Hidden, 35c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner cl::desc("Perform sinking on machine code")); 36cc8f603f531c906782e4966107ae29667eb6632cBill Wendlingstatic cl::opt<bool> 37cc8f603f531c906782e4966107ae29667eb6632cBill WendlingPerformLICM("machine-licm", 38cc8f603f531c906782e4966107ae29667eb6632cBill Wendling cl::init(false), cl::Hidden, 39cc8f603f531c906782e4966107ae29667eb6632cBill Wendling cl::desc("Perform loop-invariant code motion on machine code")); 40c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner 4104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill WendlingFileModel::Model 4204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill WendlingLLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM, 4304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling std::ostream &Out, 4404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling CodeGenFileType FileType, 4504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling bool Fast) { 4647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Standard LLVM-Level Passes. 4747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 4847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run loop strength reduction before anything else. 4931442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner if (!Fast) { 5031442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner PM.add(createLoopStrengthReducePass(getTargetLowering())); 5131442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner if (PrintLSR) 5231442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr)); 5331442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner } 5447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 5547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // FIXME: Implement efficient support for garbage collection intrinsics. 5647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createLowerGCPass()); 57c3751600b7a5dee550c5e50cb83065630759467fDuncan Sands 58a4e7cd947e378aa3ffe633be227138d8f859c9e3Jim Laskey if (!ExceptionHandling) 59a4e7cd947e378aa3ffe633be227138d8f859c9e3Jim Laskey PM.add(createLowerInvokePass(getTargetLowering())); 60c3751600b7a5dee550c5e50cb83065630759467fDuncan Sands 6147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Make sure that no unreachable blocks are instruction selected. 6247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createUnreachableBlockEliminationPass()); 6304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 64c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) 65c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createCodeGenPreparePass(getTargetLowering())); 66c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 67c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintISelInput) 68c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n", 69c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner &cerr)); 70c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 7147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Ask the target for an isel. 7247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addInstSelector(PM, Fast)) 7304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 7404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 7547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Print the instruction selected machine code... 7647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 7704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 780f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 79cc8f603f531c906782e4966107ae29667eb6632cBill Wendling if (PerformLICM) 80cc8f603f531c906782e4966107ae29667eb6632cBill Wendling PM.add(createMachineLICMPass()); 81c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner 82c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner if (EnableSinking) 83c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner PM.add(createMachineSinkingPass()); 840f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 8547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Perform register allocation to convert to a concrete x86 representation 8647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createRegisterAllocator()); 8747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 8847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 8904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 90ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 91ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createLowerSubregsPass()); 92ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 93ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb if (PrintMachineCode) // Print the subreg lowered code 94ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createMachineFunctionPrinterPass(cerr)); 9504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 9647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run post-ra passes. 9747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 9804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 9904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 10047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Insert prolog/epilog code. Eliminate abstract frame index references... 10147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createPrologEpilogCodeInserter()); 10247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 103e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen // Second pass scheduler. 10472f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen if (!Fast) 10572f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen PM.add(createPostRAScheduler()); 106e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen 1074a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner // Branch folding must be run after regalloc and prolog/epilog insertion. 10862d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey if (!Fast) 109e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 1100f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 1119d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Fold redundant debug labels. 1129d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey PM.add(createDebugLabelFoldingPass()); 1134a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner 11447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) // Print the register-allocated code 11504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 11604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 11747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPreEmitPass(PM, Fast) && PrintMachineCode) 11804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 11904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 12047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 12104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling default: 12204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling break; 12304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling case TargetMachine::AssemblyFile: 12404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (addAssemblyEmitter(PM, Fast, Out)) 12504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 12604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::AsmFile; 12704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling case TargetMachine::ObjectFile: 12804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (getMachOWriterInfo()) 12904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::MachOFile; 13004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling else if (getELFWriterInfo()) 13104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::ElfFile; 13247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 13304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 13404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling return FileModel::Error; 13504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling} 13604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 13704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// addPassesToEmitFileFinish - If the passes to emit the specified file had to 13804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// be split up (e.g., to add an object writer pass), this method can be used to 13904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// finish up adding passes to emit the file, if necessary. 14004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendlingbool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM, 14104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling MachineCodeEmitter *MCE, 14204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling bool Fast) { 14304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling if (MCE) 1448bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE); 14504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 14647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Delete machine code for this function 14747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createMachineCodeDeleter()); 14804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 14947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return false; // success! 15047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 15147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 15247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 15347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// get machine code emitted. This uses a MachineCodeEmitter object to handle 15447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// actually outputting the machine code and resolving things like the address 15547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// of functions. This method should returns true if machine code emission is 15647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// not supported. 15747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// 15847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerbool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM, 15947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner MachineCodeEmitter &MCE, 16047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner bool Fast) { 16147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Standard LLVM-Level Passes. 16247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 16347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run loop strength reduction before anything else. 164c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) { 165c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createLoopStrengthReducePass(getTargetLowering())); 166c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintLSR) 167c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr)); 168c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner } 16947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 17047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // FIXME: Implement efficient support for garbage collection intrinsics. 17147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createLowerGCPass()); 17247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 17347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // FIXME: Implement the invoke/unwind instructions! 1742a0013f59fb3b23010c0509fab8bf509eb30fb36Duraid Madina PM.add(createLowerInvokePass(getTargetLowering())); 17547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 17647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Make sure that no unreachable blocks are instruction selected. 17747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createUnreachableBlockEliminationPass()); 17804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 179c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (!Fast) 180c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(createCodeGenPreparePass(getTargetLowering())); 181c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 182c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner if (PrintISelInput) 183c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n", 184c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner &cerr)); 185c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner 18647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Ask the target for an isel. 18747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addInstSelector(PM, Fast)) 18847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return true; 18904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 19047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Print the instruction selected machine code... 19147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 19204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 1930f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 194cc8f603f531c906782e4966107ae29667eb6632cBill Wendling if (PerformLICM) 195cc8f603f531c906782e4966107ae29667eb6632cBill Wendling PM.add(createMachineLICMPass()); 1963c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner 1973c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner if (EnableSinking) 1983c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner PM.add(createMachineSinkingPass()); 1990f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 20047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Perform register allocation to convert to a concrete x86 representation 20147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createRegisterAllocator()); 20247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 20347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) 20404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 205ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 206ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createLowerSubregsPass()); 207ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb 208ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb if (PrintMachineCode) // Print the subreg lowered code 209ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb PM.add(createMachineFunctionPrinterPass(cerr)); 21004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 21147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Run post-ra passes. 21247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 21304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 21404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 21547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Insert prolog/epilog code. Eliminate abstract frame index references... 21647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createPrologEpilogCodeInserter()); 21747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 21847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (PrintMachineCode) // Print the register-allocated code 21904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 22047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 221e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen // Second pass scheduler. 22272f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen if (!Fast) 22372f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen PM.add(createPostRAScheduler()); 224e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen 225e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner // Branch folding must be run after regalloc and prolog/epilog insertion. 226e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner if (!Fast) 227e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 2280f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling 22947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner if (addPreEmitPass(PM, Fast) && PrintMachineCode) 23004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling PM.add(createMachineFunctionPrinterPass(cerr)); 23104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 2328bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); 23347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 23447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner // Delete machine code for this function 23547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner PM.add(createMachineCodeDeleter()); 23647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 23747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner return false; // success! 23847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner} 239