[PATCH] Optionally disable the BadCFGConflict check in MachineBlockPlacement.cpp
Chandler Carruth
chandlerc at gmail.com
Wed Jan 14 12:20:29 PST 2015
Thanks for this!
I've committed this with an added flag and more tests.
On Wed, Jan 14, 2015 at 8:36 AM, Daniel Jasper <djasper at google.com> wrote:
> Hi chandlerc,
>
> Some benchmarks have shown that this could lead to a potential performance
> benefit.
>
> A possible explanation. In diamond-shaped CFGs (A followed by either B or
> C both followed by D), putting B and C both in between A and D leads to the
> code being less dense than it could be. Always either B or C have to be
> skipped increasing the chance of cache misses etc. Moving either B or C to
> after D might be beneficial on average.
>
> In the long run, but we should probably do a better job of analyzing the
> basic block and branch probabilities to move the correct one of B or C to
> after D. But even if we don't use this in the long run, it is a good
> baseline for benchmarking.
>
> http://reviews.llvm.org/D6969
>
> Files:
> lib/CodeGen/MachineBlockPlacement.cpp
> test/CodeGen/X86/code_placement_bad_cfg_check.ll
>
> Index: lib/CodeGen/MachineBlockPlacement.cpp
> ===================================================================
> --- lib/CodeGen/MachineBlockPlacement.cpp
> +++ lib/CodeGen/MachineBlockPlacement.cpp
> @@ -60,6 +60,12 @@
> "blocks in the
> function."),
> cl::init(0), cl::Hidden);
>
> +static cl::opt<bool> NoBadCFGConflictCheck(
> + "no-bad-cfg-conflict-check",
> + cl::desc("Don't check whether a hot successor has a more important "
> + "predecessor."),
> + cl::init(false), cl::Hidden);
> +
> // FIXME: Find a good default for this flag and remove the flag.
> static cl::opt<unsigned>
> ExitBlockBias("block-placement-exit-block-bias",
> @@ -374,29 +380,31 @@
> continue;
> }
>
> - // Make sure that a hot successor doesn't have a globally more
> important
> - // predecessor.
> - BlockFrequency CandidateEdgeFreq
> - = MBFI->getBlockFreq(BB) * SuccProb * HotProb.getCompl();
> - bool BadCFGConflict = false;
> - for (MachineBasicBlock::pred_iterator PI = (*SI)->pred_begin(),
> - PE = (*SI)->pred_end();
> - PI != PE; ++PI) {
> - if (*PI == *SI || (BlockFilter && !BlockFilter->count(*PI)) ||
> - BlockToChain[*PI] == &Chain)
> + if (!NoBadCFGConflictCheck) {
> + // Make sure that a hot successor doesn't have a globally more
> important
> + // predecessor.
> + BlockFrequency CandidateEdgeFreq =
> + MBFI->getBlockFreq(BB) * SuccProb * HotProb.getCompl();
> + bool BadCFGConflict = false;
> + for (MachineBasicBlock::pred_iterator PI = (*SI)->pred_begin(),
> + PE = (*SI)->pred_end();
> + PI != PE; ++PI) {
> + if (*PI == *SI || (BlockFilter && !BlockFilter->count(*PI)) ||
> + BlockToChain[*PI] == &Chain)
> + continue;
> + BlockFrequency PredEdgeFreq =
> + MBFI->getBlockFreq(*PI) * MBPI->getEdgeProbability(*PI,
> *SI);
> + if (PredEdgeFreq >= CandidateEdgeFreq) {
> + BadCFGConflict = true;
> + break;
> + }
> + }
> + if (BadCFGConflict) {
> + DEBUG(dbgs() << " " << getBlockName(*SI) << " -> " <<
> SuccProb
> + << " (prob) (non-cold CFG conflict)\n");
> continue;
> - BlockFrequency PredEdgeFreq
> - = MBFI->getBlockFreq(*PI) * MBPI->getEdgeProbability(*PI, *SI);
> - if (PredEdgeFreq >= CandidateEdgeFreq) {
> - BadCFGConflict = true;
> - break;
> }
> }
> - if (BadCFGConflict) {
> - DEBUG(dbgs() << " " << getBlockName(*SI) << " -> " << SuccProb
> - << " (prob) (non-cold CFG conflict)\n");
> - continue;
> - }
> }
>
> DEBUG(dbgs() << " " << getBlockName(*SI) << " -> " << SuccProb
> Index: test/CodeGen/X86/code_placement_bad_cfg_check.ll
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/X86/code_placement_bad_cfg_check.ll
> @@ -0,0 +1,25 @@
> +; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -no-bad-cfg-conflict-check
> < %s | FileCheck %s
> +
> +;CHECK: callq h
> +;CHECK: ret
> +;CHECK: callq
> +define void @foo(i32 %t) nounwind readnone ssp uwtable {
> + %cmp = icmp eq i32 %t, 0
> + br i1 %cmp, label %if.then, label %if.else
> +
> +if.then:
> + call void @f()
> + br label %if.end
> +
> +if.else:
> + call void @g()
> + br label %if.end
> +
> +if.end:
> + call void @h()
> + ret void
> +}
> +
> +declare void @f()
> +declare void @g()
> +declare void @h()
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150114/6df10cf8/attachment.html>
More information about the llvm-commits
mailing list