[Bug tree-optimization/78189] [5/6/7 Regression] movaps generated for unaligned store in aligned struct, when struct is referenced via unaligned member.
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Nov 3 09:26:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78189
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2016-11-03
Known to work| |4.9.4
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org
Target Milestone|--- |5.5
Summary|movaps generated for |[5/6/7 Regression] movaps
|unaligned store in aligned |generated for unaligned
|struct, when struct is |store in aligned struct,
|referenced via unaligned |when struct is referenced
|member. |via unaligned member.
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Mine. Looks like we are confused by the MEM_REF offset:
MEM[(struct B *)misalignedPtr_1(D) + -8B].a.a
DR_BASE_ADDRESS is misalignedPtr_1, DR_INIT (used as 'misalign') is 16(OVF)
and DR_ALIGNED_TO is 128. That looks good but then we go:
/* To look at alignment of the base we have to preserve an inner MEM_REF
as that carries alignment information of the actual access. */
base = ref;
while (handled_component_p (base))
base = TREE_OPERAND (base, 0);
if (TREE_CODE (base) == MEM_REF)
base = build2 (MEM_REF, TREE_TYPE (base), base_addr,
build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)), 0));
unsigned int base_alignment = get_object_alignment (base);
and that computes an aligned base (but doesn't factor in the misalignment
from the MEM_REF offset we just stripped).
More information about the Gcc-bugs
mailing list