From: Xinliang David Li Date: Wed, 15 Jun 2016 21:51:30 +0000 (+0000) Subject: [PM] Port Add discriminator pass to new PM X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=438355c7b4e191a945452bf528dc6046116d3a37;p=llvm [PM] Port Add discriminator pass to new PM git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272847 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 3ce3a01a17e..fe4b9bd9ce9 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -58,7 +58,7 @@ void initializeTarget(PassRegistry&); void initializeAAEvalLegacyPassPass(PassRegistry&); void initializeAAResultsWrapperPassPass(PassRegistry &); void initializeADCELegacyPassPass(PassRegistry&); -void initializeAddDiscriminatorsPass(PassRegistry&); +void initializeAddDiscriminatorsLegacyPassPass(PassRegistry&); void initializeAddressSanitizerModulePass(PassRegistry&); void initializeAddressSanitizerPass(PassRegistry&); void initializeAliasSetPrinterPass(PassRegistry&); diff --git a/include/llvm/Transforms/Utils/AddDiscriminators.h b/include/llvm/Transforms/Utils/AddDiscriminators.h new file mode 100644 index 00000000000..6096d21cb01 --- /dev/null +++ b/include/llvm/Transforms/Utils/AddDiscriminators.h @@ -0,0 +1,30 @@ +//===- AddDiscriminators.h -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This pass adds DWARF discriminators to the IR. Path discriminators are used +// to decide what CFG path was taken inside sub-graphs whose instructions share +// the same line and column number information. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_UTILS_ADDDISCRIMINATORS_H +#define LLVM_TRANSFORMS_UTILS_ADDDISCRIMINATORS_H + +#include "llvm/IR/PassManager.h" + +namespace llvm { + +/// Converts loops into loop-closed SSA form. +class AddDiscriminatorsPass : public PassInfoMixin { +public: + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; +} // end namespace llvm + +#endif // LLVM_TRANSFORMS_UTILS_LCSSA_H diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index a38b0dd6aa2..fff2c0152f2 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -90,6 +90,7 @@ #include "llvm/Transforms/Scalar/SROA.h" #include "llvm/Transforms/Scalar/SimplifyCFG.h" #include "llvm/Transforms/Scalar/Sink.h" +#include "llvm/Transforms/Utils/AddDiscriminators.h" #include "llvm/Transforms/Scalar/SLPVectorizer.h" #include "llvm/Transforms/Utils/LCSSA.h" #include "llvm/Transforms/Utils/Mem2Reg.h" diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index b36699cdd1e..e84f3933db8 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -119,6 +119,7 @@ FUNCTION_ALIAS_ANALYSIS("type-based-aa", TypeBasedAA()) #endif FUNCTION_PASS("aa-eval", AAEvaluator()) FUNCTION_PASS("adce", ADCEPass()) +FUNCTION_PASS("add-discriminators", AddDiscriminatorsPass()) FUNCTION_PASS("alignment-from-assumptions", AlignmentFromAssumptionsPass()) FUNCTION_PASS("bdce", BDCEPass()) FUNCTION_PASS("dce", DCEPass()) diff --git a/lib/Transforms/Utils/AddDiscriminators.cpp b/lib/Transforms/Utils/AddDiscriminators.cpp index 2a6b6eb1b0b..baf65b628b6 100644 --- a/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/lib/Transforms/Utils/AddDiscriminators.cpp @@ -52,6 +52,7 @@ // http://wiki.dwarfstd.org/index.php?title=Path_Discriminators //===----------------------------------------------------------------------===// +#include "llvm/Transforms/Utils/AddDiscriminators.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include "llvm/IR/BasicBlock.h" @@ -73,20 +74,22 @@ using namespace llvm; #define DEBUG_TYPE "add-discriminators" namespace { -struct AddDiscriminators : public FunctionPass { +// The legacy pass of AddDiscriminators. +struct AddDiscriminatorsLegacyPass : public FunctionPass { static char ID; // Pass identification, replacement for typeid - AddDiscriminators() : FunctionPass(ID) { - initializeAddDiscriminatorsPass(*PassRegistry::getPassRegistry()); + AddDiscriminatorsLegacyPass() : FunctionPass(ID) { + initializeAddDiscriminatorsLegacyPassPass(*PassRegistry::getPassRegistry()); } bool runOnFunction(Function &F) override; }; + } // end anonymous namespace -char AddDiscriminators::ID = 0; -INITIALIZE_PASS_BEGIN(AddDiscriminators, "add-discriminators", +char AddDiscriminatorsLegacyPass::ID = 0; +INITIALIZE_PASS_BEGIN(AddDiscriminatorsLegacyPass, "add-discriminators", "Add DWARF path discriminators", false, false) -INITIALIZE_PASS_END(AddDiscriminators, "add-discriminators", +INITIALIZE_PASS_END(AddDiscriminatorsLegacyPass, "add-discriminators", "Add DWARF path discriminators", false, false) // Command line option to disable discriminator generation even in the @@ -96,8 +99,9 @@ static cl::opt NoDiscriminators( "no-discriminators", cl::init(false), cl::desc("Disable generation of discriminator information.")); +// Create the legacy AddDiscriminatorsPass. FunctionPass *llvm::createAddDiscriminatorsPass() { - return new AddDiscriminators(); + return new AddDiscriminatorsLegacyPass(); } /// \brief Assign DWARF discriminators. @@ -151,7 +155,7 @@ FunctionPass *llvm::createAddDiscriminatorsPass() { /// lexical block for I2 and all the instruction in B2 that share the same /// file and line location as I2. This new lexical block will have a /// different discriminator number than I1. -bool AddDiscriminators::runOnFunction(Function &F) { +bool addDiscriminators(Function &F) { // If the function has debug information, but the user has disabled // discriminators, do nothing. // Simlarly, if the function has no debug info, do nothing. @@ -240,3 +244,13 @@ bool AddDiscriminators::runOnFunction(Function &F) { } return Changed; } + +bool AddDiscriminatorsLegacyPass::runOnFunction(Function &F) { + return addDiscriminators(F); +} +PreservedAnalyses AddDiscriminatorsPass::run(Function &F, + AnalysisManager &AM) { + addDiscriminators(F); + // Only modifies debug info. + return PreservedAnalyses::all(); +} diff --git a/lib/Transforms/Utils/Utils.cpp b/lib/Transforms/Utils/Utils.cpp index 60cb635aae5..e363dd40da7 100644 --- a/lib/Transforms/Utils/Utils.cpp +++ b/lib/Transforms/Utils/Utils.cpp @@ -21,7 +21,7 @@ using namespace llvm; /// initializeTransformUtils - Initialize all passes in the TransformUtils /// library. void llvm::initializeTransformUtils(PassRegistry &Registry) { - initializeAddDiscriminatorsPass(Registry); + initializeAddDiscriminatorsLegacyPassPass(Registry); initializeBreakCriticalEdgesPass(Registry); initializeInstNamerPass(Registry); initializeLCSSAWrapperPassPass(Registry); diff --git a/test/Transforms/AddDiscriminators/basic.ll b/test/Transforms/AddDiscriminators/basic.ll index f8cda5c6643..801eda2b066 100644 --- a/test/Transforms/AddDiscriminators/basic.ll +++ b/test/Transforms/AddDiscriminators/basic.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Basic DWARF discriminator test. All the instructions in block ; 'if.then' should have a different discriminator value than diff --git a/test/Transforms/AddDiscriminators/call-nested.ll b/test/Transforms/AddDiscriminators/call-nested.ll index a613c74a6a4..481d6f26004 100644 --- a/test/Transforms/AddDiscriminators/call-nested.ll +++ b/test/Transforms/AddDiscriminators/call-nested.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Discriminator support for calls that are defined in one line: ; #1 int foo(int, int); diff --git a/test/Transforms/AddDiscriminators/call.ll b/test/Transforms/AddDiscriminators/call.ll index 36ff18aca7e..6844a9851ec 100644 --- a/test/Transforms/AddDiscriminators/call.ll +++ b/test/Transforms/AddDiscriminators/call.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Discriminator support for calls that are defined in one line: ; #1 void bar(); diff --git a/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll b/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll index ca5eb1732ee..bc2328f4a42 100644 --- a/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll +++ b/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll @@ -1,4 +1,5 @@ ; RUN: opt -S -add-discriminators < %s | FileCheck %s +; RUN: opt -S -passes=add-discriminators < %s | FileCheck %s declare void @llvm.dbg.declare(metadata, metadata, metadata) diff --git a/test/Transforms/AddDiscriminators/diamond.ll b/test/Transforms/AddDiscriminators/diamond.ll index 70a05eb83d7..b3afe728547 100644 --- a/test/Transforms/AddDiscriminators/diamond.ll +++ b/test/Transforms/AddDiscriminators/diamond.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Discriminator support for diamond-shaped CFG.: ; #1 void bar(int); diff --git a/test/Transforms/AddDiscriminators/first-only.ll b/test/Transforms/AddDiscriminators/first-only.ll index 95d6149b92e..1bd8dae5d05 100644 --- a/test/Transforms/AddDiscriminators/first-only.ll +++ b/test/Transforms/AddDiscriminators/first-only.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Test that the only instructions that receive a new discriminator in ; the block 'if.then' are those that share the same line number as diff --git a/test/Transforms/AddDiscriminators/multiple.ll b/test/Transforms/AddDiscriminators/multiple.ll index bacef89756b..387689caddf 100644 --- a/test/Transforms/AddDiscriminators/multiple.ll +++ b/test/Transforms/AddDiscriminators/multiple.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Discriminator support for multiple CFG paths on the same line. ; diff --git a/test/Transforms/AddDiscriminators/no-discriminators.ll b/test/Transforms/AddDiscriminators/no-discriminators.ll index 552d8e6db17..5fd8b0fa5a2 100644 --- a/test/Transforms/AddDiscriminators/no-discriminators.ll +++ b/test/Transforms/AddDiscriminators/no-discriminators.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; We should not generate discriminators for DWARF versions prior to 4. ; diff --git a/test/Transforms/AddDiscriminators/oneline.ll b/test/Transforms/AddDiscriminators/oneline.ll index f07fa09ce0e..72d7a6eadbf 100644 --- a/test/Transforms/AddDiscriminators/oneline.ll +++ b/test/Transforms/AddDiscriminators/oneline.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -add-discriminators -S | FileCheck %s +; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s ; Discriminator support for code that is written in one line: ; #1 int foo(int i) {