From 02dae4ba06a05d28b24b3c1b39d54de751271c95 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 25 Sep 2008 00:37:07 +0000 Subject: [PATCH] Refactor the code that adds standard LLVM codegen passes into a separate function, eliminating duplication between the add-passes-for-file and add-passes-for-machine-code code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56599 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetMachine.h | 8 +- lib/CodeGen/LLVMTargetMachine.cpp | 153 ++++++++-------------------- 2 files changed, 51 insertions(+), 110 deletions(-) diff --git a/include/llvm/Target/TargetMachine.h b/include/llvm/Target/TargetMachine.h index 93c46ae28ea..38e377d1002 100644 --- a/include/llvm/Target/TargetMachine.h +++ b/include/llvm/Target/TargetMachine.h @@ -239,7 +239,13 @@ public: /// class LLVMTargetMachine : public TargetMachine { protected: // Can only create subclasses. - LLVMTargetMachine() { } + LLVMTargetMachine() { } + + /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for + /// both emitting to assembly files or machine code output. + /// + bool addCommonCodeGenPasses(PassManagerBase &, bool /*Fast*/); + public: /// addPassesToEmitFile - Add passes to the specified pass manager to get the diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index fb918f35ec1..60925f31ddf 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -54,92 +54,14 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, raw_ostream &Out, CodeGenFileType FileType, bool Fast) { - // Standard LLVM-Level Passes. - - // Run loop strength reduction before anything else. - if (!Fast) { - PM.add(createLoopStrengthReducePass(getTargetLowering())); - if (PrintLSR) - PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr)); - } - - PM.add(createGCLoweringPass()); - - if (!getTargetAsmInfo()->doesSupportExceptionHandling()) - PM.add(createLowerInvokePass(getTargetLowering())); - - // Make sure that no unreachable blocks are instruction selected. - PM.add(createUnreachableBlockEliminationPass()); - - if (!Fast) - PM.add(createCodeGenPreparePass(getTargetLowering())); - - if (PrintISelInput) - PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n", - &cerr)); - - // Ask the target for an isel. - if (addInstSelector(PM, Fast)) + // Add common CodeGen passes. + if (addCommonCodeGenPasses(PM, Fast)) return FileModel::Error; - // Print the instruction selected machine code... - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - - if (EnableLICM) - PM.add(createMachineLICMPass()); - - if (EnableSinking) - PM.add(createMachineSinkingPass()); - - // Run pre-ra passes. - if (addPreRegAlloc(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - - // Perform register allocation to convert to a concrete x86 representation - PM.add(createRegisterAllocator()); - - // Perform stack slot coloring. - if (!Fast) - PM.add(createStackSlotColoringPass()); - - if (PrintMachineCode) // Print the register-allocated code - PM.add(createMachineFunctionPrinterPass(cerr)); - - // Run post-ra passes. - if (addPostRegAlloc(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - - PM.add(createLowerSubregsPass()); - - if (PrintMachineCode) // Print the subreg lowered code - PM.add(createMachineFunctionPrinterPass(cerr)); - - // Insert prolog/epilog code. Eliminate abstract frame index references... - PM.add(createPrologEpilogCodeInserter()); - - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - - // Second pass scheduler. - if (!Fast && !DisablePostRAScheduler) - PM.add(createPostRAScheduler()); - - // Branch folding must be run after regalloc and prolog/epilog insertion. - if (!Fast) - PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); - - PM.add(createGCMachineCodeAnalysisPass()); - if (PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - - if (PrintGCInfo) - PM.add(createGCInfoPrinter(*cerr)); - // Fold redundant debug labels. PM.add(createDebugLabelFoldingPass()); - - if (PrintMachineCode) // Print the register-allocated code + + if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); if (addPreEmitPass(PM, Fast) && PrintMachineCode) @@ -164,7 +86,7 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, return FileModel::Error; } - + /// addPassesToEmitFileFinish - If the passes to emit the specified file had to /// be split up (e.g., to add an object writer pass), this method can be used to /// finish up adding passes to emit the file, if necessary. @@ -173,7 +95,7 @@ bool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM, bool Fast) { if (MCE) addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE); - + PM.add(createGCInfoDeleter()); // Delete machine code for this function @@ -191,20 +113,41 @@ bool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM, bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, MachineCodeEmitter &MCE, bool Fast) { + // Add common CodeGen passes. + if (addCommonCodeGenPasses(PM, Fast)) + return true; + + if (addPreEmitPass(PM, Fast) && PrintMachineCode) + PM.add(createMachineFunctionPrinterPass(cerr)); + + addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); + + PM.add(createGCInfoDeleter()); + + // Delete machine code for this function + PM.add(createMachineCodeDeleter()); + + return false; // success! +} + +/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for +/// both emitting to assembly files or machine code output. +/// +bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, bool Fast) { // Standard LLVM-Level Passes. - + // Run loop strength reduction before anything else. if (!Fast) { PM.add(createLoopStrengthReducePass(getTargetLowering())); if (PrintLSR) PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr)); } - + PM.add(createGCLoweringPass()); - + if (!getTargetAsmInfo()->doesSupportExceptionHandling()) PM.add(createLowerInvokePass(getTargetLowering())); - + // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); @@ -215,6 +158,8 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n", &cerr)); + // Standard Lower-Level Passes. + // Ask the target for an isel. if (addInstSelector(PM, Fast)) return true; @@ -225,7 +170,7 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, if (EnableLICM) PM.add(createMachineLICMPass()); - + if (EnableSinking) PM.add(createMachineSinkingPass()); @@ -240,29 +185,29 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, if (!Fast) PM.add(createStackSlotColoringPass()); - if (PrintMachineCode) + if (PrintMachineCode) // Print the register-allocated code PM.add(createMachineFunctionPrinterPass(cerr)); - + // Run post-ra passes. if (addPostRegAlloc(PM, Fast) && PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); - if (PrintMachineCode) // Print the register-allocated code + if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); - + PM.add(createLowerSubregsPass()); - + if (PrintMachineCode) // Print the subreg lowered code PM.add(createMachineFunctionPrinterPass(cerr)); // Insert prolog/epilog code. Eliminate abstract frame index references... PM.add(createPrologEpilogCodeInserter()); - + if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); - + // Second pass scheduler. - if (!Fast) + if (!Fast && !DisablePostRAScheduler) PM.add(createPostRAScheduler()); // Branch folding must be run after regalloc and prolog/epilog insertion. @@ -273,19 +218,9 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(cerr)); - + if (PrintGCInfo) PM.add(createGCInfoPrinter(*cerr)); - - if (addPreEmitPass(PM, Fast) && PrintMachineCode) - PM.add(createMachineFunctionPrinterPass(cerr)); - addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); - - PM.add(createGCInfoDeleter()); - - // Delete machine code for this function - PM.add(createMachineCodeDeleter()); - - return false; // success! + return false; }