LLVMTargetMachine.cpp revision 3b0da26e202cbbeb22508231f4278bda8e995391
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"
205a29c9eed157af51a8d338b5a225b146881819e8Gordon Henriksen#include "llvm/CodeGen/GCStrategy.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"
25cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/Support/raw_ostream.h"
2647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm;
2747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
282c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohmannamespace llvm {
292c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman  bool EnableFastISel;
302c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman}
312c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman
3285ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden,
3385ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner    cl::desc("Print LLVM IR produced by the loop-reduce pass"));
3485ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattnerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden,
3585ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner    cl::desc("Print LLVM IR input to isel pass"));
368bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Chengstatic cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden,
378bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng    cl::desc("Dump emitter generated instructions as assembly"));
3893f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksenstatic cl::opt<bool> PrintGCInfo("print-gc", cl::Hidden,
3993f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen    cl::desc("Dump garbage collector data"));
4085ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner
41c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner// Hidden options to help debugging
42c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattnerstatic cl::opt<bool>
43c4ce73f666e7ab9a270982a575101df8aa6160d3Chris LattnerEnableSinking("enable-sinking", cl::init(false), cl::Hidden,
44c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner              cl::desc("Perform sinking on machine code"));
45cc8f603f531c906782e4966107ae29667eb6632cBill Wendlingstatic cl::opt<bool>
463f32d65912b4da23793dab618d981be2ce11c331Evan ChengEnableLICM("machine-licm",
473f32d65912b4da23793dab618d981be2ce11c331Evan Cheng           cl::init(false), cl::Hidden,
483f32d65912b4da23793dab618d981be2ce11c331Evan Cheng           cl::desc("Perform loop-invariant code motion on machine code"));
49c4ce73f666e7ab9a270982a575101df8aa6160d3Chris Lattner
50459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner// When this works it will be on by default.
51459525df1e003597077197b5f802bd5d9cd7d94cChris Lattnerstatic cl::opt<bool>
52459525df1e003597077197b5f802bd5d9cd7d94cChris LattnerDisablePostRAScheduler("disable-post-RA-scheduler",
53459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner                       cl::desc("Disable scheduling after register allocation"),
54459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner                       cl::init(true));
55459525df1e003597077197b5f802bd5d9cd7d94cChris Lattner
56dc756858f92a397ed30362ba8251fec56479735fDan Gohman// Enable or disable FastISel. Both options are needed, because
57dc756858f92a397ed30362ba8251fec56479735fDan Gohman// FastISel is enabled by default with -fast, and we wish to be
58dc756858f92a397ed30362ba8251fec56479735fDan Gohman// able to enable or disable fast-isel independently from -fast.
59eb0d6abee36c274cf081948795f4675d8f33fc6fDan Gohmanstatic cl::opt<cl::boolOrDefault>
60dc756858f92a397ed30362ba8251fec56479735fDan GohmanEnableFastISelOption("fast-isel", cl::Hidden,
61dc756858f92a397ed30362ba8251fec56479735fDan Gohman  cl::desc("Enable the experimental \"fast\" instruction selector"));
622c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman
6304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill WendlingFileModel::Model
64bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan GohmanLLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
65cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson                                       raw_ostream &Out,
6604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                       CodeGenFileType FileType,
6704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                       bool Fast) {
6802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Add common CodeGen passes.
6902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addCommonCodeGenPasses(PM, Fast))
7004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    return FileModel::Error;
7104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
729d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  // Fold redundant debug labels.
739d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  PM.add(createDebugLabelFoldingPass());
7402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
7502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)
7604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
7704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
7847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
7904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
8004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
814ae641f4d12c60ee1aaca5e42b6de231c6a02c40Devang Patel  if (!Fast)
82d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng    PM.add(createLoopAlignerPass());
83d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng
8447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  switch (FileType) {
8504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  default:
8604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    break;
8704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  case TargetMachine::AssemblyFile:
8804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    if (addAssemblyEmitter(PM, Fast, Out))
8904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::Error;
9004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    return FileModel::AsmFile;
9104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  case TargetMachine::ObjectFile:
9204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    if (getMachOWriterInfo())
9304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::MachOFile;
9404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    else if (getELFWriterInfo())
9504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::ElfFile;
9647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  }
9704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
9804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  return FileModel::Error;
9904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling}
10002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
10104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// addPassesToEmitFileFinish - If the passes to emit the specified file had to
10204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// be split up (e.g., to add an object writer pass), this method can be used to
10304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// finish up adding passes to emit the file, if necessary.
104bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM,
10504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                                  MachineCodeEmitter *MCE,
10604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                                  bool Fast) {
10704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  if (MCE)
1088bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng    addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE);
10902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1105eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  PM.add(createGCInfoDeleter());
11104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
11247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Delete machine code for this function
11347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createMachineCodeDeleter());
11404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
11547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  return false; // success!
11647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
11747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
11847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
11947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// get machine code emitted.  This uses a MachineCodeEmitter object to handle
12047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// actually outputting the machine code and resolving things like the address
12147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// of functions.  This method should returns true if machine code emission is
12247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// not supported.
12347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner///
124bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
12547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   MachineCodeEmitter &MCE,
12647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   bool Fast) {
12702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Add common CodeGen passes.
12802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addCommonCodeGenPasses(PM, Fast))
12902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman    return true;
13002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
13202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman    PM.add(createMachineFunctionPrinterPass(cerr));
13302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE);
13502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  PM.add(createGCInfoDeleter());
13702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Delete machine code for this function
13902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  PM.add(createMachineCodeDeleter());
14002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
14102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  return false; // success!
14202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman}
14302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
14402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
14502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman/// both emitting to assembly files or machine code output.
14602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman///
14702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohmanbool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, bool Fast) {
14847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Standard LLVM-Level Passes.
14902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
15047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run loop strength reduction before anything else.
151c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (!Fast) {
152c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    PM.add(createLoopStrengthReducePass(getTargetLowering()));
153c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    if (PrintLSR)
1543b0da26e202cbbeb22508231f4278bda8e995391Daniel Dunbar      PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &errs()));
155c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  }
15602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
15793f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  PM.add(createGCLoweringPass());
15802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1591532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen  if (!getTargetAsmInfo()->doesSupportExceptionHandling())
160b6d5b1439047609c050576f3dc52b722e76bd30bDale Johannesen    PM.add(createLowerInvokePass(getTargetLowering()));
16102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
16247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Make sure that no unreachable blocks are instruction selected.
16347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createUnreachableBlockEliminationPass());
16404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
165c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (!Fast)
166c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    PM.add(createCodeGenPreparePass(getTargetLowering()));
167c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner
168c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (PrintISelInput)
169f4db3a51c7d806f7dcef5d9625e7cdf7f122dca9Daniel Dunbar    PM.add(createPrintFunctionPass("\n\n"
170f4db3a51c7d806f7dcef5d9625e7cdf7f122dca9Daniel Dunbar                                   "*** Final LLVM Code input to ISel ***\n",
1713b0da26e202cbbeb22508231f4278bda8e995391Daniel Dunbar                                   &errs()));
172c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner
17302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Standard Lower-Level Passes.
17402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
175dc756858f92a397ed30362ba8251fec56479735fDan Gohman  // Enable FastISel with -fast, but allow that to be overridden.
176eb0d6abee36c274cf081948795f4675d8f33fc6fDan Gohman  if (EnableFastISelOption == cl::BOU_TRUE ||
177eb0d6abee36c274cf081948795f4675d8f33fc6fDan Gohman      (Fast && EnableFastISelOption != cl::BOU_FALSE))
178dc756858f92a397ed30362ba8251fec56479735fDan Gohman    EnableFastISel = true;
179dc756858f92a397ed30362ba8251fec56479735fDan Gohman
18047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Ask the target for an isel.
18147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addInstSelector(PM, Fast))
18247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    return true;
18304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
18447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Print the instruction selected machine code...
18547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
18604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
1870f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
1882c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman  // If we're using Fast-ISel, clean up the mess.
1892c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman  if (EnableFastISel)
1902c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman    PM.add(createDeadMachineInstructionElimPass());
1912c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman
1923f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (EnableLICM)
193cc8f603f531c906782e4966107ae29667eb6632cBill Wendling    PM.add(createMachineLICMPass());
19402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1953c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner  if (EnableSinking)
1963c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner    PM.add(createMachineSinkingPass());
1970f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
198b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov  // Run pre-ra passes.
199b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov  if (addPreRegAlloc(PM, Fast) && PrintMachineCode)
200b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov    PM.add(createMachineFunctionPrinterPass(cerr));
201b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov
2023f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Perform register allocation.
20347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createRegisterAllocator());
2043f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
2053f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Perform stack slot coloring.
2069ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng  if (!Fast)
2079ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng    PM.add(createStackSlotColoringPass());
2083f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
20902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)  // Print the register-allocated code
21004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
21102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
2123f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Run post-ra passes.
2133f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
2143f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    PM.add(createMachineFunctionPrinterPass(cerr));
2153f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
21602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)
2173f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    PM.add(createMachineFunctionPrinterPass(cerr));
21802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
219ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb  PM.add(createLowerSubregsPass());
22002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
221ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb  if (PrintMachineCode)  // Print the subreg lowered code
222ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb    PM.add(createMachineFunctionPrinterPass(cerr));
22304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
22447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Insert prolog/epilog code.  Eliminate abstract frame index references...
22547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createPrologEpilogCodeInserter());
22602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
2273f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (PrintMachineCode)
22804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
22902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
230e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen  // Second pass scheduler.
23102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (!Fast && !DisablePostRAScheduler)
23272f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen    PM.add(createPostRAScheduler());
233e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen
234e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  // Branch folding must be run after regalloc and prolog/epilog insertion.
235e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  if (!Fast)
236e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen    PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
2370f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
23893f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  PM.add(createGCMachineCodeAnalysisPass());
2393f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
24093f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  if (PrintMachineCode)
24193f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen    PM.add(createMachineFunctionPrinterPass(cerr));
24202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
24393f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  if (PrintGCInfo)
2445eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    PM.add(createGCInfoPrinter(*cerr));
24504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
24602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  return false;
24747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
248