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

            Bug ID: 84433
           Summary: gcc 7 and before miscompile loop and remove exit due
                    to incorrect range calculation
           Product: gcc
           Version: 7.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acsawdey at gcc dot gnu.org
                CC: segher at gcc dot gnu.org, wschmidt at gcc dot gnu.org
  Target Milestone: ---
            Target: ppc64le

Created attachment 43446
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43446&action=edit
test case for range error bug

An incorrect range calculation results in the cunroll pass thinking that the
loop exit conditional branch can never happen:

Analyzing # of iterations of loop 1
  exit condition [15, + , 4294967295] != 0
  bounds on difference of bases: -15 ... -15
  result:
    # of iterations 15, bounded by 15
Loop 1 iterates 15 times.
Loop 1 iterates at most 14 times.
Loop 1 likely iterates at most 14 times.
Analyzing # of iterations of loop 1
  exit condition [15, + , 4294967295] != 0
  bounds on difference of bases: -15 ... -15
  result:
    # of iterations 15, bounded by 15
Removed pointless exit: if (ivtmp_24 != 0)

As a result gcc 7 and below (I've also tested 5.4.0 and 6.4.1) generate an
infinite loop here with -O2 or -O3. -O1 generates working code.

It appears this is fixed in gcc 8 as trunk does not have this failure. Not sure
if this can be fixed in 7 or 6 but I think I will see if this little test case
can go into the testsuite to make sure we don't run into this again.

Reply via email to