https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66142
--- Comment #17 from Richard Biener <rguenth at gcc dot gnu.org> --- Ok, so even with PR63916 rudimentary fixed we hit the issue that in _9 = &D.3665[_11].org; MEM[(struct vec_ *)_9] = 1.0e+0; MEM[(struct vec_ *)_9 + 4B] = _8; ... _24 = MEM[(const struct Ray *)&D.3665][_11].org.x; the store to MEM[(struct vec_ *)_9 + 4B] aliases MEM[(const struct Ray *)&D.3665][_11].org.x. And the rudimentary fix for PR63916 doesn't allow for the forwarding to succeed into MEM[(struct vec_ *)_9 + 4B] either. Without SRA we get D.3665[_11].org = p; D.3665[_11].dir.x = x_12; D.3665[_11].dir.y = y_13; D.3664[_11].t = 1.0e+10; D.3664[_11].h = 0; _25 = MEM[(const struct Ray *)&D.3665][_11].org.x; and the look-through-aggregate-copy code bails out at /* See if the assignment kills REF. */ base2 = ao_ref_base (&lhs_ref); offset2 = lhs_ref.offset; size2 = lhs_ref.size; maxsize2 = lhs_ref.max_size; if (maxsize2 == -1 || (base != base2 && (TREE_CODE (base) != MEM_REF || TREE_CODE (base2) != MEM_REF || TREE_OPERAND (base, 0) != TREE_OPERAND (base2, 0) || !tree_int_cst_equal (TREE_OPERAND (base, 1), TREE_OPERAND (base2, 1)))) || offset2 > offset || offset2 + size2 < offset + maxsize) return (void *)-1; stmt_kills_ref_p fails to compare MEM[(const struct Ray *)&D.3665][_15].org and D.3665[_15].org equal via operand_equal_p.