https://llvm.org/bugs/show_bug.cgi?id=23525

            Bug ID: 23525
           Summary: Incorrect block frequency generated for entries of
                    irregular loops
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected]
    Classification: Unclassified

Created attachment 14329
  --> https://llvm.org/bugs/attachment.cgi?id=14329&action=edit
Test case

Normally the frequency of a basic block other than the function entry should be
equal to the sum of its incoming edge frequencies. However, this may not hold
for CFGs with irregular loops which have more than one loop entry. LLVM
incorrectly assigns the same frequency to those loop entries for the same loop.

To reproduce this issue, compile the given test case below using the following
instructions:


clang test.C -O2 -fprofile-instr-generate
./a.out
llvm-profdata merge -output=profdata default.profraw
clang test.C -O2 -fprofile-instr-use=profdata -emit-llvm -S
opt -analyze -block-freq -S test.ll


The output is:


Printing analysis 'Block Frequency Analysis' for function '_Z8hot_loopi':
block-frequency-info: _Z8hot_loopi
 - entry: float = 1.0, int = 8
 - for.cond: float = 25.52, int = 204
 - for.body: float = 24.52, int = 196
 - if.then4: float = 12.26499796, int = 98
 - Next: float = 25.52, int = 204
 - for.inc: float = 25.52, int = 204
 - for.end: float = 1.0, int = 8

Printing analysis 'Block Frequency Analysis' for function 'main':
block-frequency-info: main
 - entry: float = 1.0, int = 8
 - for.body: float = 51.0, int = 407
 - for.end: float = 1.0, int = 8


Note that in hot_loop(), Next shares the same frequency as for.inc, which is
incorrect. Next should have less frequency.

The test case:


int g;

__attribute__((noinline)) int hot_loop(int n) {
  int i = n / 2;

  if (n % 2 == 0) {
    goto Next;
  }

  #pragma nounroll
  for (; i < n; i++) {
    if (i % 2 == 0) {
      g *= 2;
    } else {
Next:
      g += n;
    }
  }

  return g;
}

int main() {
  for (int i = 1; i < 100; ++i)
    hot_loop(i);
  return 0;
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to