https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- Note that we do it correctly even - forcing a TBAA type of just 'int' and thus disabling path-based disambiguation. So doing this won't help you, it just will generate larger trees: void f(V&, V&) (struct V & v, struct V & w) { int * _3; int * _6; int * _7; int * _8; <bb 2>: _3 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_start; MEM[(int * &)w_2(D)].D.14881._M_impl._M_start = 0B; _6 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish; MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish = 0B; _7 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage; MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage = 0B; _8 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_start; MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = _3; MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = _6; MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = _7; ... void g(V&, V&) (struct V & v, struct V & w) { int * __tmp.0_5; int * _6; int * __tmp.0_7; int * _8; int * __tmp.0_9; int * _10; <bb 2>: __tmp.0_5 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_start; MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = 0B; MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = 0B; MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = 0B; _6 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_start; MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = _6; MEM[(int * &)w_2(D)].D.14881._M_impl._M_start = 0B; __tmp.0_7 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish; _8 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish; MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = _8; MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish = __tmp.0_7; __tmp.0_9 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage; _10 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage; MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = _10; MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage = __tmp.0_9; they are still all plain int * accesses.