[llvm-dev] InductiveRangeCheckElimination and BranchProbabilityInfo

Fedor Sergeev via llvm-dev llvm-dev at lists.llvm.org
Tue Apr 10 09:49:10 PDT 2018



On 04/09/2018 06:06 PM, Sam Parker via llvm-dev wrote:
> Hi,
>
> extractRangeChecksFromBranch uses BranchProbabilityInfo to decide 
> whether its worth trying the InductiveRangeCheckElimination 
> transformation. For the following example:
>
> void split() {
>   for (int i = 0; i < 100; ++i) {
>     if (i < 99)
>       do_something()
>     else
>       do_something_else()
>   }
> }
>
> But the reported BPI is reported as 50/50 to whether do_something will 
> be called, but we can see with our human eyes that this should be 99%.
Human eyes are all-seeing, machinery needs to help itself with tricks. :-)

If you compile this with PGO:
] cat split.c
extern int printf(const char*, ...);
static void do_something(int i) { printf("%d\n", i); }
static void do_something_else(int i) { printf("%d\n", -i); }

void split() {
   for (int i = 0; i < 100; ++i) {
     if (i < 99)
       do_something(i);
     else
       do_something_else(i);
   }
}
int main() {
   split();
}
] clang -fprofile-instr-generate split.c
] ./a.out >/dev/null
] llvm-profdata merge -output=default.profdata default.profraw
] clang -fprofile-instr-use split.c -emit-llvm -S -o - | bin/opt 
-branch-prob -print-bpi

---- Branch Probabilities ----
   edge  ->  probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
   edge  ->  probability is 0x7d83ba68 / 0x80000000 = 98.06% [HOT edge]
   edge  ->  probability is 0x027c4598 / 0x80000000 = 1.94%
   edge  ->  probability is 0x7d7d7d7d / 0x80000000 = 98.04% [HOT edge]
   edge  ->  probability is 0x02828283 / 0x80000000 = 1.96%
   edge  ->  probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
   edge  ->  probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
   edge  ->  probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
   edge  ->  probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
---- Branch Probabilities ----
---- Branch Probabilities ----
---- Branch Probabilities ----
]

See how it manages to find two cold edges instead of one.

regards,
   Fedor.

>
> So two questions:
> - why is BPI used to enable the transformation?
> - would it not be more useful for BPI to use something like inductive 
> range analyis to calculate the probability? And if so, what else could 
> make use of it? To me, InductiveRangeCheckElimination feels like it 
> should be separated out into an analysis and the transformation.
> - or have I misunderstood how and what BPI does?
>
> Thanks,
> sam
>
> Sam Parker
>
> Compilation Tools Engineer | Arm
>
> . . . . . . . . . . . . . . . . . . . . . . . . . . .
>
> Arm.com
>
> IMPORTANT NOTICE: The contents of this email and any attachments are 
> confidential and may also be privileged. If you are not the intended 
> recipient, please notify the sender immediately and do not disclose 
> the contents to any other person, use it for any purpose, or store or 
> copy the information in any medium. Thank you.
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list