From 602f79275dcb5a65a0bd0e5917763b4f5b1eb904 Mon Sep 17 00:00:00 2001 From: Mike Aizatsky Date: Mon, 21 Mar 2016 23:08:16 +0000 Subject: [PATCH] [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 llvm-svn: 264003 --- .../Instrumentation/SanitizerCoverage.cpp | 27 ++++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index ac78591..9f00897 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -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); + } + + // 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 false; + return !(DominatesAll || PreDominatesAll); } bool SanitizerCoverageModule::runOnFunction(Function &F) { @@ -349,10 +353,13 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) { SmallVector CmpTraceTargets; SmallVector SwitchTraceTargets; - DominatorTree DT; - DT.recalculate(F); + const DominatorTree *DT = + &getAnalysis(F).getDomTree(); + const PostDominatorTree *PDT = + &getAnalysis(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) { -- 2.7.4