mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-07 04:21:39 +00:00
[sancov] do not instrument nodes that are full pre-dominators
Summary: Without tree pruning clang has 2,667,552 points. Wiht only dominators pruning: 1,515,586. With both dominators & predominators pruning: 1,340,534. Resubmit of r262103. Differential Revision: http://reviews.llvm.org/D18341 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264003 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9dd6a5392f
commit
668a12461d
@ -315,20 +315,24 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool shouldInstrumentBlock(const BasicBlock *BB,
|
||||
const DominatorTree *DT) {
|
||||
static bool shouldInstrumentBlock(const BasicBlock *BB, const DominatorTree *DT,
|
||||
const PostDominatorTree *PDT) {
|
||||
if (!ClPruneBlocks)
|
||||
return true;
|
||||
if (succ_begin(BB) == succ_end(BB))
|
||||
return true;
|
||||
|
||||
// Check if BB dominates all its successors.
|
||||
bool DominatesAll = succ_begin(BB) != succ_end(BB);
|
||||
for (const BasicBlock *SUCC : make_range(succ_begin(BB), succ_end(BB))) {
|
||||
if (!DT->dominates(BB, SUCC))
|
||||
return true;
|
||||
DominatesAll &= DT->dominates(BB, SUCC);
|
||||
}
|
||||
|
||||
return false;
|
||||
// Check if BB pre-dominates all predecessors.
|
||||
bool PreDominatesAll = pred_begin(BB) != pred_end(BB);
|
||||
for (const BasicBlock *PRED : make_range(pred_begin(BB), pred_end(BB))) {
|
||||
PreDominatesAll &= PDT->dominates(BB, PRED);
|
||||
}
|
||||
|
||||
return !(DominatesAll || PreDominatesAll);
|
||||
}
|
||||
|
||||
bool SanitizerCoverageModule::runOnFunction(Function &F) {
|
||||
@ -349,10 +353,13 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) {
|
||||
SmallVector<Instruction *, 8> CmpTraceTargets;
|
||||
SmallVector<Instruction *, 8> SwitchTraceTargets;
|
||||
|
||||
DominatorTree DT;
|
||||
DT.recalculate(F);
|
||||
const DominatorTree *DT =
|
||||
&getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
|
||||
const PostDominatorTree *PDT =
|
||||
&getAnalysis<PostDominatorTreeWrapperPass>(F).getPostDomTree();
|
||||
|
||||
for (auto &BB : F) {
|
||||
if (shouldInstrumentBlock(&BB, &DT))
|
||||
if (shouldInstrumentBlock(&BB, DT, PDT))
|
||||
BlocksToInstrument.push_back(&BB);
|
||||
for (auto &Inst : BB) {
|
||||
if (Options.IndirectCalls) {
|
||||
|
Loading…
Reference in New Issue
Block a user