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

            Bug ID: 64183
           Summary: [5.0 Regression] Complete unroll doesn't happen for a
                    while-loop
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: enkovich.gnu at gmail dot com

Created attachment 34189
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34189&action=edit
Reproducer

There is a performance regression in DENMark after r218142.  Regression happens
because complete unroll computes max number of iterations for a while-loop in a
different way.

Reduced reproducer:

int bits;
unsigned int size;
int max_code;

void
test ()
{
 int code = 0;

 while (code < max_code)
   code |= ((unsigned int) (size >> (--bits)));

 while (bits < (unsigned int)25)
   bits += 8;
}

Compilation string:

gcc -std=c90 -m32 -O3 test.c -c -fdump-tree-cunroll-details

Dump before r218142:

Analyzing # of iterations of loop 2
  exit condition [(unsigned int) (prephitmp_33 + 8), + , 8] <= 24
  bounds on difference of bases: -4294967271 ... 24
...
Loop 2 iterates at most 4 times.

Dump after r218142:

Analyzing # of iterations of loop 2
  exit condition [(unsigned int) (prephitmp_36 + 8), + , 8] <= 24
  bounds on difference of bases: -4294967271 ... 24
...
Loop 2 iterates at most 536870911 times.

While-loop condition has signed/unsigned comparison.  But I believe the
original estimation of 4 iterations is correct.

Reply via email to