https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106716

            Bug ID: 106716
           Summary: Identical Code Folding (-fipa-icf) confuses between
                    functions with different [[likely]] attributes
           Product: gcc
           Version: 12.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tomerv at gmail dot com
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

I have 2 functions that are almost identical, except that they have different
attributes: one with [[likely]] and the other with [[unlikely]]:

bool is_prime_unlikely(int n)
{
    for (int i = 2; i * i < n; ++i) {
        if (n % i == 0) {
            [[unlikely]]
            return false;
        }
    }
    return true;
}

bool is_prime_likely(int n)
{
    for (int i = 2; i * i < n; ++i) {
        if (n % i == 0) {
            [[likely]]
            return false;
        }
    }
    return true;
}

Running g++ with -fipa-icf (which is default for -O2) causes them to merge into
a single function, as can be seen either with assembly output, or ipa dump:

g++ -c snippet.cpp -O1 -fipa-icf -S -fdump-ipa-all -masm=intel


snippet.s:

_Z15is_prime_likelyi:
.LFB3:
        .cfi_startproc
        endbr64
        jmp     _Z17is_prime_unlikelyi
        .cfi_endproc


snippet.cpp.077i.icf:

bool is_prime_likely (int n)
{
  bool retval.2;

  <bb 2> [local count: 972273221]:
  retval.2_2 = is_prime_unlikely (n_1(D)); [tail call]
  return retval.2_2;

}


Can also be seen in Compiler Explorer: https://godbolt.org/z/jz11a3xx8

Reply via email to