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

--- Comment #4 from amker at gcc dot gnu.org ---
Hmm, with expansion, IVOPTs can find address type uses as:
Group 0:
  Type: ADDRESS
  Use 0.0:
    At stmt:    _25 = *_6;
    At pos:     *_6
    IV struct:
      Type:     const __m128i_u * {ref-all}
      Base:     (const __m128i_u * {ref-all}) src_15(D)
      Step:     32
      Object:   (void *) src_15(D)
      Biv:      N
      Overflowness wrto loop niter:     Overflow
Group 1:
  Type: ADDRESS
  Use 1.0:
    At stmt:    *dstu.2_9 = _23;
    At pos:     *dstu.2_9
    IV struct:
      Type:     __m128i_u * {ref-all}
      Base:     (__m128i_u * {ref-all}) dst_12(D)
      Step:     16
      Object:   (void *) dst_12(D)
      Biv:      N
      Overflowness wrto loop niter:     Overflow
Group 2:
  Type: COMPARE
  Use 2.0:
    At stmt:    if (end_dst_14 > dstu_22)
    At pos:     dstu_22
    IV struct:
      Type:     uintptr_t
      Base:     (uintptr_t) dst_12(D) + 16
      Step:     16
      Biv:      Y
      Overflowness wrto loop niter:     Overflow
Group 3:
  Type: ADDRESS
  Use 3.0:
    At stmt:    _24 = *_8;
    At pos:     *_8
    IV struct:
      Type:     const __m128i_u * {ref-all}
      Base:     (const __m128i_u * {ref-all}) (src_15(D) + 16)
      Step:     32
      Object:   (void *) src_15(D)
      Biv:      N
      Overflowness wrto loop niter:     Overflow

But it's less likely to express all address type uses with dstu because they
have different base object.  In general, we don't allow expressing reference to
one base object using pointer pointing to different base object.  This case is
a bit tricky because the addresses are computed and casted from uintptr_t,
which means we can assume result pointers are valid to point to any address?

Even it's valid to rewrite load like MEM[src_dst_offset + dstu << 1], it's hard
to do so in current IVOPTs because it's implemented on the basis of
base_object.

Richi, any comments?

Thanks,
bin

Reply via email to