LLVMTargetMachine.cpp revision dc756858f92a397ed30362ba8251fec56479735f
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.
59dc756858f92a397ed30362ba8251fec56479735fDan Gohmanstatic cl::opt<bool>
60dc756858f92a397ed30362ba8251fec56479735fDan GohmanEnableFastISelOption("fast-isel", cl::Hidden,
61dc756858f92a397ed30362ba8251fec56479735fDan Gohman  cl::desc("Enable the experimental \"fast\" instruction selector"));
62dc756858f92a397ed30362ba8251fec56479735fDan Gohmanstatic cl::opt<bool>
63dc756858f92a397ed30362ba8251fec56479735fDan GohmanDisableFastISelOption("disable-fast-isel", cl::Hidden,
64dc756858f92a397ed30362ba8251fec56479735fDan Gohman  cl::desc("Disable the experimental \"fast\" instruction selector"));
652c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman
6604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill WendlingFileModel::Model
67bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan GohmanLLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
68cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson                                       raw_ostream &Out,
6904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                       CodeGenFileType FileType,
7004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                       bool Fast) {
7102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Add common CodeGen passes.
7202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addCommonCodeGenPasses(PM, Fast))
7304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    return FileModel::Error;
7404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
759d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  // Fold redundant debug labels.
769d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  PM.add(createDebugLabelFoldingPass());
7702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
7802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)
7904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
8004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
8147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
8204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
8304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
843f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (!Fast && !OptimizeForSize)
85d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng    PM.add(createLoopAlignerPass());
86d703ed6aed98c8156829399efbafb13a3cca0b69Evan Cheng
8747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  switch (FileType) {
8804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  default:
8904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    break;
9004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  case TargetMachine::AssemblyFile:
9104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    if (addAssemblyEmitter(PM, Fast, Out))
9204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::Error;
9304523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    return FileModel::AsmFile;
9404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  case TargetMachine::ObjectFile:
9504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    if (getMachOWriterInfo())
9604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::MachOFile;
9704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    else if (getELFWriterInfo())
9804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling      return FileModel::ElfFile;
9947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  }
10004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
10104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  return FileModel::Error;
10204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling}
10302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
10404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// addPassesToEmitFileFinish - If the passes to emit the specified file had to
10504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// be split up (e.g., to add an object writer pass), this method can be used to
10604523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling/// finish up adding passes to emit the file, if necessary.
107bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM,
10804523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                                  MachineCodeEmitter *MCE,
10904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling                                                  bool Fast) {
11004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling  if (MCE)
1118bd6035750f1b290832a3b1c90766d9b45ed8d6bEvan Cheng    addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE);
11202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1135eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  PM.add(createGCInfoDeleter());
11404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
11547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Delete machine code for this function
11647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createMachineCodeDeleter());
11704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
11847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  return false; // success!
11947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
12047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
12147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
12247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// get machine code emitted.  This uses a MachineCodeEmitter object to handle
12347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// actually outputting the machine code and resolving things like the address
12447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// of functions.  This method should returns true if machine code emission is
12547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// not supported.
12647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner///
127bfae83139dcb4fffd50b939e1b1224b0126f04d4Dan Gohmanbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
12847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   MachineCodeEmitter &MCE,
12947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   bool Fast) {
13002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Add common CodeGen passes.
13102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addCommonCodeGenPasses(PM, Fast))
13202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman    return true;
13302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
13502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman    PM.add(createMachineFunctionPrinterPass(cerr));
13602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE);
13802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
13902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  PM.add(createGCInfoDeleter());
14002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
14102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Delete machine code for this function
14202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  PM.add(createMachineCodeDeleter());
14302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
14402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  return false; // success!
14502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman}
14602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
14702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
14802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman/// both emitting to assembly files or machine code output.
14902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman///
15002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohmanbool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, bool Fast) {
15147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Standard LLVM-Level Passes.
15202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
15347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run loop strength reduction before anything else.
154c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (!Fast) {
155c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    PM.add(createLoopStrengthReducePass(getTargetLowering()));
156c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    if (PrintLSR)
15762c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman      PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr));
158c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  }
15902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
16093f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  PM.add(createGCLoweringPass());
16102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1621532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen  if (!getTargetAsmInfo()->doesSupportExceptionHandling())
163b6d5b1439047609c050576f3dc52b722e76bd30bDale Johannesen    PM.add(createLowerInvokePass(getTargetLowering()));
16402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
16547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Make sure that no unreachable blocks are instruction selected.
16647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createUnreachableBlockEliminationPass());
16704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
168c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (!Fast)
169c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner    PM.add(createCodeGenPreparePass(getTargetLowering()));
170c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner
171c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner  if (PrintISelInput)
17262c7b8c3713f7178991fac299abcb04e3818ca65Dan Gohman    PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n",
173c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner                                 &cerr));
174c8d288f8fa9e46199a29e1954550c980f184bd1cChris Lattner
17502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Standard Lower-Level Passes.
17602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
177dc756858f92a397ed30362ba8251fec56479735fDan Gohman  // Enable FastISel with -fast, but allow that to be overridden.
178dc756858f92a397ed30362ba8251fec56479735fDan Gohman  assert((!EnableFastISelOption || !DisableFastISelOption) &&
179dc756858f92a397ed30362ba8251fec56479735fDan Gohman         "Both -fast-isel and -disable-fast-isel given!");
180dc756858f92a397ed30362ba8251fec56479735fDan Gohman  if (EnableFastISelOption ||
181dc756858f92a397ed30362ba8251fec56479735fDan Gohman      (Fast && !DisableFastISelOption))
182dc756858f92a397ed30362ba8251fec56479735fDan Gohman    EnableFastISel = true;
183dc756858f92a397ed30362ba8251fec56479735fDan Gohman
18447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Ask the target for an isel.
18547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addInstSelector(PM, Fast))
18647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    return true;
18704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
18847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Print the instruction selected machine code...
18947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
19004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
1910f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
1922c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman  // If we're using Fast-ISel, clean up the mess.
1932c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman  if (EnableFastISel)
1942c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman    PM.add(createDeadMachineInstructionElimPass());
1952c4bf119be8aa05cdc3dc88c57006353f07f0d2cDan Gohman
1963f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (EnableLICM)
197cc8f603f531c906782e4966107ae29667eb6632cBill Wendling    PM.add(createMachineLICMPass());
19802dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
1993c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner  if (EnableSinking)
2003c42f1211874665e8ea6eea55a45024b557afa61Chris Lattner    PM.add(createMachineSinkingPass());
2010f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
202b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov  // Run pre-ra passes.
203b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov  if (addPreRegAlloc(PM, Fast) && PrintMachineCode)
204b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov    PM.add(createMachineFunctionPrinterPass(cerr));
205b013f5094c3bdb36472da996d63d5c0f75b6d4d3Anton Korobeynikov
2063f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Perform register allocation.
20747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createRegisterAllocator());
2083f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
2093f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Perform stack slot coloring.
2109ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng  if (!Fast)
2119ef4c5302eb547936f6586ece880f31104d2f801Evan Cheng    PM.add(createStackSlotColoringPass());
2123f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
21302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)  // Print the register-allocated code
21404523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
21502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
2163f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  // Run post-ra passes.
2173f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
2183f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    PM.add(createMachineFunctionPrinterPass(cerr));
2193f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
22002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (PrintMachineCode)
2213f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    PM.add(createMachineFunctionPrinterPass(cerr));
22202dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
223ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb  PM.add(createLowerSubregsPass());
22402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
225ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb  if (PrintMachineCode)  // Print the subreg lowered code
226ada779fb11eb411536aa8219a176ca0ce4d58fd1Christopher Lamb    PM.add(createMachineFunctionPrinterPass(cerr));
22704523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
22847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Insert prolog/epilog code.  Eliminate abstract frame index references...
22947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createPrologEpilogCodeInserter());
23002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
2313f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  if (PrintMachineCode)
23204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling    PM.add(createMachineFunctionPrinterPass(cerr));
23302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
234e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen  // Second pass scheduler.
23502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  if (!Fast && !DisablePostRAScheduler)
23672f159640382a16e036b63dcb9c0b427e6d5dc0aDale Johannesen    PM.add(createPostRAScheduler());
237e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen
238e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  // Branch folding must be run after regalloc and prolog/epilog insertion.
239e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  if (!Fast)
240e6e435498c0e35d98644f868886d39c4665bb83aDale Johannesen    PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
2410f940c95d4506f8d04fa2aeda8a79cadb3105fe3Bill Wendling
24293f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  PM.add(createGCMachineCodeAnalysisPass());
2433f32d65912b4da23793dab618d981be2ce11c331Evan Cheng
24493f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  if (PrintMachineCode)
24593f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen    PM.add(createMachineFunctionPrinterPass(cerr));
24602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
24793f96d00bf10299246ea726956ce84dcb4b9a59eGordon Henriksen  if (PrintGCInfo)
2485eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    PM.add(createGCInfoPrinter(*cerr));
24904523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
25002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  return false;
25147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
252