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