<div dir="ltr"><br><div>In PR 22718, we are looking at issues with long running applications producing non-representative frequencies.  For example, in these two loops:</div><div><br></div><div><div><font face="monospace, monospace">int g = 0;<br></font></div><div><font face="monospace, monospace">__attribute__((noinline)) void bar() {</font></div><div><font face="monospace, monospace"> g++;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">extern int printf(const char*, ...);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int main()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">  int i, j, k;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  for (i = 0; i < 1000000; i++)</font></div><div><font face="monospace, monospace">    bar();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  printf ("g = %d\n", g);</font></div><div><font face="monospace, monospace">  g = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  for (i = 0; i < 500000; i++)</font></div><div><font face="monospace, monospace">    bar();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  printf ("g = %d\n", g);</font></div><div><font face="monospace, monospace">}</font></div></div><div><br></div><div>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:</div><div><br></div><div><div><font face="monospace, monospace">$ bin/opt -analyze -block-freq -S unbiased-branches.ll </font></div><div><font face="monospace, monospace">Printing analysis 'Block Frequency Analysis' for function 'bar':</font></div><div><font face="monospace, monospace">block-frequency-info: bar</font></div><div><font face="monospace, monospace"> - entry: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Printing analysis 'Block Frequency Analysis' for function 'main':</font></div><div><font face="monospace, monospace">block-frequency-info: main</font></div><div><font face="monospace, monospace"> - entry: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"> - for.cond: float = 500001.5, int = 4000011</font></div><div><font face="monospace, monospace"> - for.body: float = 500000.5, int = 4000003</font></div><div><font face="monospace, monospace"> - for.inc: float = 500000.5, int = 4000003</font></div><div><font face="monospace, monospace"> - for.end: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"> - for.cond1: float = 250001.5, int = 2000011</font></div><div><font face="monospace, monospace"> - for.body3: float = 250000.5, int = 2000003</font></div><div><font face="monospace, monospace"> - for.inc4: float = 250000.5, int = 2000003</font></div><div><font face="monospace, monospace"> - for.end6: float = 1.0, int = 8</font></div></div><div><br></div><div><br></div><div>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</div><div><br></div><div><div><font face="monospace, monospace">$ bin/opt -analyze -block-freq -S unbiased-branches.ll </font></div><div><font face="monospace, monospace">Printing analysis 'Block Frequency Analysis' for function 'bar':</font></div><div><font face="monospace, monospace">block-frequency-info: bar</font></div><div><font face="monospace, monospace"> - entry: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Printing analysis 'Block Frequency Analysis' for function 'main':</font></div><div><font face="monospace, monospace">block-frequency-info: main</font></div><div><font face="monospace, monospace"> - entry: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"> - for.cond: float = 1073741824.4, int = 8589934595</font></div><div><font face="monospace, monospace"> - for.body: float = 1073741823.4, int = 8589934587</font></div><div><font face="monospace, monospace"> - for.inc: float = 1073741823.4, int = 8589934587</font></div><div><font face="monospace, monospace"> - for.end: float = 1.0, int = 8</font></div><div><font face="monospace, monospace"> - for.cond1: float = 1073741824.4, int = 8589934595</font></div><div><font face="monospace, monospace"> - for.body3: float = 1073741823.4, int = 8589934587</font></div><div><font face="monospace, monospace"> - for.inc4: float = 1073741823.4, int = 8589934587</font></div><div><font face="monospace, monospace"> - for.end6: float = 1.0, int = 8</font></div></div><div><br></div><div>Now both loops are considered equally hot.</div><div><br></div><div>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.</div><div><br></div><div><br></div><div>Thanks.  Diego.</div></div>