From 6e1b8128505711276a87e96f6bffb818b435cbd5 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Wed, 30 May 2012 00:17:12 +0000 Subject: [PATCH] Add an insertPass API to TargetPassConfig. Besides adding the new insertPass function, this patch uses it to enhance the existing -print-machineinstrs so that the MachineInstrs after a specific pass can be printed. Patch by Bin Zeng! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157655 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/Passes.h | 6 +++ include/llvm/InitializePasses.h | 1 + lib/CodeGen/CodeGen.cpp | 1 + lib/CodeGen/MachineFunctionPrinterPass.cpp | 6 +++ lib/CodeGen/Passes.cpp | 42 +++++++++++++++++++++ test/CodeGen/Generic/print-machineinstrs.ll | 14 +++++++ tools/llc/llc.cpp | 6 --- 7 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 test/CodeGen/Generic/print-machineinstrs.ll diff --git a/include/llvm/CodeGen/Passes.h b/include/llvm/CodeGen/Passes.h index e76fe992572..567a9f7d7be 100644 --- a/include/llvm/CodeGen/Passes.h +++ b/include/llvm/CodeGen/Passes.h @@ -101,6 +101,9 @@ public: /// point where StadardID is expected, add TargetID in its place. void substitutePass(char &StandardID, char &TargetID); + /// Insert InsertedPassID pass after TargetPassID pass. + void insertPass(const char &TargetPassID, const char &InsertedPassID); + /// Allow the target to enable a specific standard pass by default. void enablePass(char &ID) { substitutePass(ID, ID); } @@ -342,6 +345,9 @@ namespace llvm { /// branches. extern char &BranchFolderPassID; + /// MachineFunctionPrinterPass - This pass prints out MachineInstr's. + extern char &MachineFunctionPrinterPassID; + /// TailDuplicate - Duplicate blocks with unconditional branches /// into tails of their predecessors. extern char &TailDuplicateID; diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index df696b1814c..3b9b59fe9ee 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -252,6 +252,7 @@ void initializeInstSimplifierPass(PassRegistry&); void initializeUnpackMachineBundlesPass(PassRegistry&); void initializeFinalizeMachineBundlesPass(PassRegistry&); void initializeBBVectorizePass(PassRegistry&); +void initializeMachineFunctionPrinterPassPass(PassRegistry&); } #endif diff --git a/lib/CodeGen/CodeGen.cpp b/lib/CodeGen/CodeGen.cpp index a81bb5cc556..65487136e8c 100644 --- a/lib/CodeGen/CodeGen.cpp +++ b/lib/CodeGen/CodeGen.cpp @@ -66,6 +66,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeUnreachableMachineBlockElimPass(Registry); initializeVirtRegMapPass(Registry); initializeLowerIntrinsicsPass(Registry); + initializeMachineFunctionPrinterPassPass(Registry); } void LLVMInitializeCodeGen(LLVMPassRegistryRef R) { diff --git a/lib/CodeGen/MachineFunctionPrinterPass.cpp b/lib/CodeGen/MachineFunctionPrinterPass.cpp index 2aaa798a02c..dbda93e4fd9 100644 --- a/lib/CodeGen/MachineFunctionPrinterPass.cpp +++ b/lib/CodeGen/MachineFunctionPrinterPass.cpp @@ -15,6 +15,7 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Debug.h" using namespace llvm; @@ -28,6 +29,7 @@ struct MachineFunctionPrinterPass : public MachineFunctionPass { raw_ostream &OS; const std::string Banner; + MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { } MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner) : MachineFunctionPass(ID), OS(os), Banner(banner) {} @@ -48,6 +50,10 @@ struct MachineFunctionPrinterPass : public MachineFunctionPass { char MachineFunctionPrinterPass::ID = 0; } +char &MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID; +INITIALIZE_PASS(MachineFunctionPrinterPass, "print-machineinstrs", + "Machine Function Printer", false, false) + namespace llvm { /// Returns a newly-created MachineFunction Printer pass. The /// default banner is empty. diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 490547bbb87..feac061ffd7 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -80,6 +80,10 @@ static cl::opt PrintGCInfo("print-gc", cl::Hidden, static cl::opt VerifyMachineCode("verify-machineinstrs", cl::Hidden, cl::desc("Verify generated machine code"), cl::init(getenv("LLVM_VERIFY_MACHINEINSTRS")!=NULL)); +static cl::opt +PrintMachineInstrs("print-machineinstrs", cl::ValueOptional, + cl::desc("Print machine instrs"), + cl::value_desc("pass-name"), cl::init("option-unspecified")); /// Allow standard passes to be disabled by command line options. This supports /// simple binary flags that either suppress the pass or do nothing. @@ -196,6 +200,10 @@ public: // default by substituting NoPass, and the user may still enable that standard // pass with an explicit command line option. DenseMap TargetPasses; + + /// Store the pairs of of which the second pass + /// is inserted after each instance of the first one. + SmallVector, 4> InsertedPasses; }; } // namespace llvm @@ -225,6 +233,14 @@ TargetPassConfig::TargetPassConfig(TargetMachine *tm, PassManagerBase &pm) substitutePass(MachineSchedulerID, NoPassID); } +/// Insert InsertedPassID pass after TargetPassID. +void TargetPassConfig::insertPass(const char &TargetPassID, + const char &InsertedPassID) { + assert(&TargetPassID != &InsertedPassID && "Insert a pass after itself!"); + std::pair P(&TargetPassID, &InsertedPassID); + Impl->InsertedPasses.push_back(P); +} + /// createPassConfig - Create a pass configuration object to be used by /// addPassToEmitX methods for generating a pipeline of CodeGen passes. /// @@ -270,6 +286,17 @@ AnalysisID TargetPassConfig::addPass(char &ID) { if (!P) llvm_unreachable("Pass ID not registered"); PM->add(P); + // Add the passes after the pass P if there is any. + for (SmallVector, 4>::iterator + I = Impl->InsertedPasses.begin(), E = Impl->InsertedPasses.end(); + I != E; ++I) { + if ((*I).first == &ID) { + assert((*I).second && "Illegal Pass ID!"); + Pass *NP = Pass::createPass((*I).second); + assert(NP && "Pass ID not registered"); + PM->add(NP); + } + } return FinalID; } @@ -352,6 +379,21 @@ void TargetPassConfig::addMachinePasses() { // Print the instruction selected machine code... printAndVerify("After Instruction Selection"); + // Insert a machine instr printer pass after the specified pass. + // If -print-machineinstrs specified, print machineinstrs after all passes. + if (StringRef(PrintMachineInstrs.getValue()).equals("")) + TM->Options.PrintMachineCode = true; + else if (!StringRef(PrintMachineInstrs.getValue()) + .equals("option-unspecified")) { + const PassRegistry *PR = PassRegistry::getPassRegistry(); + const PassInfo *TPI = PR->getPassInfo(PrintMachineInstrs.getValue()); + const PassInfo *IPI = PR->getPassInfo(StringRef("print-machineinstrs")); + assert (TPI && IPI && "Pass ID not registered!"); + const char *TID = (char *)(TPI->getTypeInfo()); + const char *IID = (char *)(IPI->getTypeInfo()); + insertPass(*TID, *IID); + } + // Expand pseudo-instructions emitted by ISel. addPass(ExpandISelPseudosID); diff --git a/test/CodeGen/Generic/print-machineinstrs.ll b/test/CodeGen/Generic/print-machineinstrs.ll new file mode 100644 index 00000000000..75b4cd14fff --- /dev/null +++ b/test/CodeGen/Generic/print-machineinstrs.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs=branch-folder -o /dev/null |& FileCheck %s +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs -o /dev/null |& FileCheck %s +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs= -o /dev/null |& FileCheck %s + +define i64 @foo(i64 %a, i64 %b) nounwind { +; CHECK: -branch-folder -print-machineinstrs +; CHECK: Control Flow Optimizer +; CHECK-NEXT: MachineFunction Printer +; CHECK: Machine code for function foo: + %c = add i64 %a, %b + %d = trunc i64 %c to i32 + %e = zext i32 %d to i64 + ret i64 %e +} diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 9f4ab70ba70..35275d79187 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -145,11 +145,6 @@ EnableFPMAD("enable-fp-mad", cl::desc("Enable less precise MAD instructions to be generated"), cl::init(false)); -static cl::opt -PrintCode("print-machineinstrs", - cl::desc("Print generated machine code"), - cl::init(false)); - static cl::opt DisableFPElim("disable-fp-elim", cl::desc("Disable frame pointer elimination optimization"), @@ -403,7 +398,6 @@ int main(int argc, char **argv) { TargetOptions Options; Options.LessPreciseFPMADOption = EnableFPMAD; - Options.PrintMachineCode = PrintCode; Options.NoFramePointerElim = DisableFPElim; Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf; Options.NoExcessFPPrecision = DisableExcessPrecision; -- 2.34.1