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

            Bug ID: 113879
           Summary: missed optimization - not exploiting known range of
                    integers
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: muecker at gwdg dot de
  Target Milestone: ---

This is similar to PR105855 but without sanitizer.

In the following example the loop is not vectorized because  the overflow check
(which is not needed) is not removed.  It works when adding the first check
before the loop.  But the information about j < INT_MAX can be derived directly
from j < i + 4. 

void f(int i, float * restrict a, float * restrict b) 
{   
#if 0
    if (INT_MAX - 4 < i)
        __builtin_unreachable();
#endif
    for (int j = i; j < i + 4; ) {
        a[j] = b[j] + 1.;
#if 1
        if (INT_MAX - 1 < j)
            __builtin_trap();
#endif 
        j++;
    }
}

https://godbolt.org/z/xnEbh5zfv

Reply via email to