[LLVMdev] Loss of precision with very large branch weights
Diego Novillo
dnovillo at google.com
Fri Apr 24 11:18:50 PDT 2015
In PR 22718, we are looking at issues with long running applications
producing non-representative frequencies. For example, in these two loops:
int g = 0;
__attribute__((noinline)) void bar() {
g++;
}
extern int printf(const char*, ...);
int main()
{
int i, j, k;
for (i = 0; i < 1000000; i++)
bar();
printf ("g = %d\n", g);
g = 0;
for (i = 0; i < 500000; i++)
bar();
printf ("g = %d\n", g);
}
I expect the loop body frequency for the second loop to be about half of
the first one. This holds fine for this test case:
$ bin/opt -analyze -block-freq -S unbiased-branches.ll
Printing analysis 'Block Frequency Analysis' for function 'bar':
block-frequency-info: bar
- entry: float = 1.0, int = 8
Printing analysis 'Block Frequency Analysis' for function 'main':
block-frequency-info: main
- entry: float = 1.0, int = 8
- for.cond: float = 500001.5, int = 4000011
- for.body: float = 500000.5, int = 4000003
- for.inc: float = 500000.5, int = 4000003
- for.end: float = 1.0, int = 8
- for.cond1: float = 250001.5, int = 2000011
- for.body3: float = 250000.5, int = 2000003
- for.inc4: float = 250000.5, int = 2000003
- for.end6: float = 1.0, int = 8
But if I manually modify the frequencies of both to get close to MAX_INT32,
the ratios between the frequencies do not reflect reality. For example, if
I change branch_weights in both loops to be 4,294,967,295 and 2,147,483,647
$ bin/opt -analyze -block-freq -S unbiased-branches.ll
Printing analysis 'Block Frequency Analysis' for function 'bar':
block-frequency-info: bar
- entry: float = 1.0, int = 8
Printing analysis 'Block Frequency Analysis' for function 'main':
block-frequency-info: main
- entry: float = 1.0, int = 8
- for.cond: float = 1073741824.4, int = 8589934595
- for.body: float = 1073741823.4, int = 8589934587
- for.inc: float = 1073741823.4, int = 8589934587
- for.end: float = 1.0, int = 8
- for.cond1: float = 1073741824.4, int = 8589934595
- for.body3: float = 1073741823.4, int = 8589934587
- for.inc4: float = 1073741823.4, int = 8589934587
- for.end6: float = 1.0, int = 8
Now both loops are considered equally hot.
Duncan, I think that if I were to make branch_weights a 64-bit integer,
this would not be an issue. But I'm not sure if I'm not missing something
else here.
Thanks. Diego.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150424/d2dfbaa7/attachment.html>
More information about the llvm-dev
mailing list