https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91954
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- GIMPLE testcase: struct A { float x, y; }; struct B { struct A t; }; float __GIMPLE (ssa,startwith("fre")) foo (float a, int i) { struct B D_2220[32]; float *_23; float _27; float _28; float _31; __BB(2): D_2220[i_14(D)].t.x = 1.0e+0f; D_2220[i_14(D)].t.y = a_11(D); _23 = &D_2220[i_14(D)]; _27 = __MEM <const float> ((float *)_23); _28 = __MEM <const float> ((float *)_23 + _Literal (float *) 4); _31 = _27 + _28; return _31; } note the issue isn't only ref matching but alias disambiguation of the second store against the first load. For first load we don't have an access path (VN has but it's representation is not the same the alias oracle uses...). Need to embrace a canonical decomposed form in ao_ref maybe.