From: Dehao Chen Date: Thu, 5 May 2016 20:18:49 +0000 (+0000) Subject: Simplify CFG before assigning discriminator. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8200288f55bdc89524ee05ef91581ccf32bf88d8;p=llvm Simplify CFG before assigning discriminator. Summary: We need to clean up CFG before assigning discriminator to minimize the impact of optimization on debug info. Reviewers: davidxl, dblaikie, dnovillo Subscribers: dnovillo, danielcdh, llvm-commits Differential Revision: http://reviews.llvm.org/D19926 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268675 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Transforms/Scalar/SimplifyCFG.h b/include/llvm/Transforms/Scalar/SimplifyCFG.h index 53f427a7d19..96b18a12558 100644 --- a/include/llvm/Transforms/Scalar/SimplifyCFG.h +++ b/include/llvm/Transforms/Scalar/SimplifyCFG.h @@ -39,6 +39,17 @@ public: PreservedAnalyses run(Function &F, AnalysisManager &AM); }; +struct CFGSimplifyPass : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + unsigned BonusInstThreshold; + std::function PredicateFtor; + + CFGSimplifyPass(int T = -1, + std::function Ftor = nullptr); + bool runOnFunction(Function &F) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override; +}; } #endif diff --git a/lib/Transforms/Scalar/SimplifyCFGPass.cpp b/lib/Transforms/Scalar/SimplifyCFGPass.cpp index e6933336947..97c5f183dcb 100644 --- a/lib/Transforms/Scalar/SimplifyCFGPass.cpp +++ b/lib/Transforms/Scalar/SimplifyCFGPass.cpp @@ -196,35 +196,31 @@ PreservedAnalyses SimplifyCFGPass::run(Function &F, return PreservedAnalyses::all(); } -namespace { -struct CFGSimplifyPass : public FunctionPass { - static char ID; // Pass identification, replacement for typeid - unsigned BonusInstThreshold; - std::function PredicateFtor; - - CFGSimplifyPass(int T = -1, - std::function Ftor = nullptr) - : FunctionPass(ID), PredicateFtor(Ftor) { - BonusInstThreshold = (T == -1) ? UserBonusInstThreshold : unsigned(T); - initializeCFGSimplifyPassPass(*PassRegistry::getPassRegistry()); - } - bool runOnFunction(Function &F) override { - if (skipFunction(F) || (PredicateFtor && !PredicateFtor(F))) - return false; - - AssumptionCache *AC = - &getAnalysis().getAssumptionCache(F); - const TargetTransformInfo &TTI = - getAnalysis().getTTI(F); - return simplifyFunctionCFG(F, TTI, AC, BonusInstThreshold); - } +CFGSimplifyPass::CFGSimplifyPass(int T, + std::function Ftor) + : FunctionPass(ID), PredicateFtor(Ftor) { + BonusInstThreshold = (T == -1) ? UserBonusInstThreshold : unsigned(T); + initializeCFGSimplifyPassPass(*PassRegistry::getPassRegistry()); +} - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired(); - AU.addRequired(); - AU.addPreserved(); - } -}; +bool CFGSimplifyPass::runOnFunction(Function &F) { + if (PredicateFtor && !PredicateFtor(F)) + return false; + + if (skipFunction(F)) + return false; + + AssumptionCache *AC = + &getAnalysis().getAssumptionCache(F); + const TargetTransformInfo &TTI = + getAnalysis().getTTI(F); + return simplifyFunctionCFG(F, TTI, AC, BonusInstThreshold); +} + +void CFGSimplifyPass::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + AU.addRequired(); + AU.addPreserved(); } char CFGSimplifyPass::ID = 0; diff --git a/lib/Transforms/Utils/AddDiscriminators.cpp b/lib/Transforms/Utils/AddDiscriminators.cpp index 2a6b6eb1b0b..6c4db99efe3 100644 --- a/lib/Transforms/Utils/AddDiscriminators.cpp +++ b/lib/Transforms/Utils/AddDiscriminators.cpp @@ -67,6 +67,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/SimplifyCFG.h" using namespace llvm; @@ -79,6 +80,10 @@ struct AddDiscriminators : public FunctionPass { initializeAddDiscriminatorsPass(*PassRegistry::getPassRegistry()); } + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired(); + } + bool runOnFunction(Function &F) override; }; } // end anonymous namespace @@ -86,6 +91,7 @@ struct AddDiscriminators : public FunctionPass { char AddDiscriminators::ID = 0; INITIALIZE_PASS_BEGIN(AddDiscriminators, "add-discriminators", "Add DWARF path discriminators", false, false) +INITIALIZE_PASS_DEPENDENCY(CFGSimplifyPass) INITIALIZE_PASS_END(AddDiscriminators, "add-discriminators", "Add DWARF path discriminators", false, false) diff --git a/test/Transforms/AddDiscriminators/multiple.ll b/test/Transforms/AddDiscriminators/multiple.ll index bacef89756b..c7306dc8f2e 100644 --- a/test/Transforms/AddDiscriminators/multiple.ll +++ b/test/Transforms/AddDiscriminators/multiple.ll @@ -21,20 +21,18 @@ entry: if.then: ; preds = %entry %1 = load i32, i32* %i.addr, align 4, !dbg !10 -; CHECK: %1 = load i32, i32* %i.addr, align 4, !dbg ![[THEN:[0-9]+]] store i32 %1, i32* %x, align 4, !dbg !10 -; CHECK: store i32 %1, i32* %x, align 4, !dbg ![[THEN]] +; CHECK: store i32 %1, i32* %x, align 4, !dbg ![[THEN:[0-9]+]] br label %if.end, !dbg !10 ; CHECK: br label %if.end, !dbg ![[THEN]] if.else: ; preds = %entry %2 = load i32, i32* %i.addr, align 4, !dbg !10 -; CHECK: %2 = load i32, i32* %i.addr, align 4, !dbg ![[ELSE:[0-9]+]] %sub = sub nsw i32 0, %2, !dbg !10 -; CHECK: %sub = sub nsw i32 0, %2, !dbg ![[ELSE]] +; CHECK: %sub = sub nsw i32 0, %1, !dbg ![[ELSE:[0-9]+]] store i32 %sub, i32* %x, align 4, !dbg !10 ; CHECK: store i32 %sub, i32* %x, align 4, !dbg ![[ELSE]] diff --git a/test/Transforms/AddDiscriminators/oneline.ll b/test/Transforms/AddDiscriminators/oneline.ll index f07fa09ce0e..f0ac5a8d86d 100644 --- a/test/Transforms/AddDiscriminators/oneline.ll +++ b/test/Transforms/AddDiscriminators/oneline.ll @@ -21,27 +21,20 @@ define i32 @_Z3fooi(i32 %i) #0 !dbg !4 { ;