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

            Bug ID: 113581
           Summary: Ignoring GCC unroll loop annotation for loops with
                    increment in condition
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janschultke at googlemail dot com
  Target Milestone: ---

Code to reproduce (https://godbolt.org/z/r6EcW7ocW)
===================================================

template <typename T>
int times_three(T x) {
    int sum = 0;
    #pragma GCC unroll 16
    for (int i = 0; i++ < 3;) {
        sum += x;
    }
    return sum;
}

int main() {
    times_three(123u);
}

Output
======

> <source>: In function 'int times_three(T) [with T = unsigned int]':
> <source>:5:19: warning: ignoring loop annotation
>     5 |     for (int i = 0; i++ < 3;) {
>       |                   ^


Explanation
===========

It looks like GCC doesn't like loops that have an increment in the condition.
Changing the loop to the following solves this issue:

> for (int i = 0; i < 3; i++)

For increment, this is perhaps not a big deal. I've run into this bug when
working with a loop of the form:

> for (int i = N; i-- > N;)

This is a popular idiom for decrementing with i in range [0, N).

Reply via email to