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