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

llvm-svn: 268675
This commit is contained in:
Dehao Chen 2016-05-05 20:18:49 +00:00
parent 17d2e87e9f
commit e48b4ee98c
5 changed files with 45 additions and 45 deletions

View File

@ -39,6 +39,17 @@ public:
PreservedAnalyses run(Function &F, AnalysisManager<Function> &AM);
};
struct CFGSimplifyPass : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
unsigned BonusInstThreshold;
std::function<bool(const Function &)> PredicateFtor;
CFGSimplifyPass(int T = -1,
std::function<bool(const Function &)> Ftor = nullptr);
bool runOnFunction(Function &F) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
};
}
#endif

View File

@ -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<bool(const Function &)> PredicateFtor;
CFGSimplifyPass::CFGSimplifyPass(int T,
std::function<bool(const Function &)> Ftor)
: FunctionPass(ID), PredicateFtor(Ftor) {
BonusInstThreshold = (T == -1) ? UserBonusInstThreshold : unsigned(T);
initializeCFGSimplifyPassPass(*PassRegistry::getPassRegistry());
}
CFGSimplifyPass(int T = -1,
std::function<bool(const 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;
bool CFGSimplifyPass::runOnFunction(Function &F) {
if (PredicateFtor && !PredicateFtor(F))
return false;
AssumptionCache *AC =
&getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
const TargetTransformInfo &TTI =
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
return simplifyFunctionCFG(F, TTI, AC, BonusInstThreshold);
}
if (skipFunction(F))
return false;
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<AssumptionCacheTracker>();
AU.addRequired<TargetTransformInfoWrapperPass>();
AU.addPreserved<GlobalsAAWrapperPass>();
}
};
AssumptionCache *AC =
&getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
const TargetTransformInfo &TTI =
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
return simplifyFunctionCFG(F, TTI, AC, BonusInstThreshold);
}
void CFGSimplifyPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<AssumptionCacheTracker>();
AU.addRequired<TargetTransformInfoWrapperPass>();
AU.addPreserved<GlobalsAAWrapperPass>();
}
char CFGSimplifyPass::ID = 0;

View File

@ -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<CFGSimplifyPass>();
}
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)

View File

@ -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]]

View File

@ -21,27 +21,20 @@ define i32 @_Z3fooi(i32 %i) #0 !dbg !4 {
; <label>:5 ; preds = %0
%6 = load i32, i32* %2, align 4, !dbg !23, !tbaa !13
; CHECK: %6 = load i32, i32* %2, align 4, !dbg ![[THEN1:[0-9]+]],{{.*}}
%7 = icmp eq i32 %6, 5, !dbg !24
; CHECK: %7 = icmp eq i32 %6, 5, !dbg ![[THEN2:[0-9]+]]
br i1 %7, label %8, label %9, !dbg !25
; CHECK: br i1 %7, label %8, label %9, !dbg ![[THEN3:[0-9]+]]
; <label>:8 ; preds = %5, %0
store i32 100, i32* %1, align 4, !dbg !26
; CHECK: store i32 100, i32* %1, align 4, !dbg ![[ELSE:[0-9]+]]
; CHECK: store i32 100, i32* %1, align 4, !dbg ![[THEN:[0-9]+]]
br label %10, !dbg !26
; CHECK: br label %10, !dbg ![[ELSE]]
; <label>:9 ; preds = %5
store i32 99, i32* %1, align 4, !dbg !27
; CHECK: store i32 99, i32* %1, align 4, !dbg ![[COMBINE:[0-9]+]]
; CHECK: store i32 99, i32* %1, align 4, !dbg ![[ELSE:[0-9]+]]
br label %10, !dbg !27
; CHECK: br label %10, !dbg ![[COMBINE]]
; <label>:10 ; preds = %9, %8
%11 = load i32, i32* %1, align 4, !dbg !28
@ -87,11 +80,7 @@ attributes #1 = { nounwind readnone }
!27 = !DILocation(line: 2, column: 42, scope: !20)
!28 = !DILocation(line: 3, column: 1, scope: !4)
; CHECK: ![[THEN1]] = !DILocation(line: 2, column: 17, scope: ![[THENBLOCK:[0-9]+]])
; CHECK: ![[THEN]] = !DILocation(line: 2, column: 25, scope: ![[THENBLOCK:[0-9]+]])
; CHECK: ![[THENBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 1)
; CHECK: ![[THEN2]] = !DILocation(line: 2, column: 19, scope: ![[THENBLOCK]])
; CHECK: ![[THEN3]] = !DILocation(line: 2, column: 7, scope: ![[THENBLOCK]])
; CHECK: ![[ELSE]] = !DILocation(line: 2, column: 25, scope: ![[ELSEBLOCK:[0-9]+]])
; CHECK: ![[ELSE]] = !DILocation(line: 2, column: 42, scope: ![[ELSEBLOCK:[0-9]+]])
; CHECK: ![[ELSEBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 2)
; CHECK: ![[COMBINE]] = !DILocation(line: 2, column: 42, scope: ![[COMBINEBLOCK:[0-9]+]])
; CHECK: ![[COMBINEBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 3)