LLVMTargetMachine.cpp revision 3988226d5d4559c6518793c6aeb25b12c89dac47
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//                     The LLVM Compiler Infrastructure
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file is distributed under the University of Illinois Open Source
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// License. See LICENSE.TXT for details.
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner//===----------------------------------------------------------------------===//
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file implements the LLVMTargetMachine class.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===//
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Target/TargetMachine.h"
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/PassManager.h"
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Pass.h"
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Assembly/PrintModulePass.h"
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Analysis/LoopPass.h"
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/CodeGen/Passes.h"
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Target/TargetOptions.h"
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Transforms/Scalar.h"
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Support/CommandLine.h"
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing namespace llvm;
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden,
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    cl::desc("Print LLVM IR produced by the loop-reduce pass"));
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden,
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    cl::desc("Print LLVM IR input to isel pass"));
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden,
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    cl::desc("Dump emitter generated instructions as assembly"));
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Hidden options to help debugging
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic cl::opt<bool>
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerEnableSinking("enable-sinking", cl::init(false), cl::Hidden,
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner              cl::desc("Perform sinking on machine code"));
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFileModel::Model
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectLLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM,
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                       std::ostream &Out,
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                       CodeGenFileType FileType,
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                       bool Fast) {
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Standard LLVM-Level Passes.
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Run loop strength reduction before anything else.
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (!Fast) {
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createLoopStrengthReducePass(getTargetLowering()));
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (PrintLSR)
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr));
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // FIXME: Implement efficient support for garbage collection intrinsics.
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createLowerGCPass());
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (!ExceptionHandling)
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createLowerInvokePass(getTargetLowering()));
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Make sure that no unreachable blocks are instruction selected.
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createUnreachableBlockEliminationPass());
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (!Fast)
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createCodeGenPreparePass(getTargetLowering()));
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintISelInput)
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n",
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                 &cerr));
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Ask the target for an isel.
695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (addInstSelector(PM, Fast))
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return FileModel::Error;
715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Print the instruction selected machine code...
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createMachineLICMPass());
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (EnableSinking)
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineSinkingPass());
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Perform register allocation to convert to a concrete x86 representation
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createRegisterAllocator());
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createLowerSubregsPass());
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)  // Print the subreg lowered code
905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createMachineFunctionPrinterPass(cerr));
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Run post-ra passes.
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Insert prolog/epilog code.  Eliminate abstract frame index references...
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createPrologEpilogCodeInserter());
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Second pass scheduler.
1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (!Fast)
1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createPostRAScheduler());
1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Branch folding must be run after regalloc and prolog/epilog insertion.
1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (!Fast)
1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Fold redundant debug labels.
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createDebugLabelFoldingPass());
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)  // Print the register-allocated code
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  switch (FileType) {
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  default:
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    break;
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  case TargetMachine::AssemblyFile:
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (addAssemblyEmitter(PM, Fast, Out))
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return FileModel::Error;
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return FileModel::AsmFile;
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  case TargetMachine::ObjectFile:
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (getMachOWriterInfo())
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return FileModel::MachOFile;
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else if (getELFWriterInfo())
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return FileModel::ElfFile;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  return FileModel::Error;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// addPassesToEmitFileFinish - If the passes to emit the specified file had to
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// be split up (e.g., to add an object writer pass), this method can be used to
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// finish up adding passes to emit the file, if necessary.
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM,
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                                  MachineCodeEmitter *MCE,
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                                  bool Fast) {
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (MCE)
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE);
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Delete machine code for this function
1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  PM.add(createMachineCodeDeleter());
1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  return false; // success!
1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// get machine code emitted.  This uses a MachineCodeEmitter object to handle
1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// actually outputting the machine code and resolving things like the address
1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// of functions.  This method should returns true if machine code emission is
1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// not supported.
1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner///
1545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
1555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                                   MachineCodeEmitter &MCE,
1565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                                   bool Fast) {
1575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Standard LLVM-Level Passes.
1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Run loop strength reduction before anything else.
1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (!Fast) {
1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createLoopStrengthReducePass(getTargetLowering()));
1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (PrintLSR)
1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner      PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr));
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  }
1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // FIXME: Implement efficient support for garbage collection intrinsics.
1675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  PM.add(createLowerGCPass());
1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // FIXME: Implement the invoke/unwind instructions!
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createLowerInvokePass(getTargetLowering()));
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Make sure that no unreachable blocks are instruction selected.
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createUnreachableBlockEliminationPass());
1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (!Fast)
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createCodeGenPreparePass(getTargetLowering()));
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintISelInput)
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n",
1805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                 &cerr));
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Ask the target for an isel.
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (addInstSelector(PM, Fast))
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return true;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Print the instruction selected machine code...
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createMachineLICMPass());
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Perform register allocation to convert to a concrete x86 representation
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createRegisterAllocator());
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createLowerSubregsPass());
1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)  // Print the subreg lowered code
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Run post-ra passes.
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Insert prolog/epilog code.  Eliminate abstract frame index references...
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PM.add(createPrologEpilogCodeInserter());
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (PrintMachineCode)  // Print the register-allocated code
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PM.add(createMachineFunctionPrinterPass(cerr));
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Second pass scheduler.
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  if (!Fast)
2155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createPostRAScheduler());
2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Branch folding must be run after regalloc and prolog/epilog insertion.
2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (!Fast)
2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    PM.add(createMachineFunctionPrinterPass(cerr));
2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE);
2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Delete machine code for this function
2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  PM.add(createMachineCodeDeleter());
2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  return false; // success!
2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner