https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65310
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jamborm at gcc dot gnu.org
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
It's early SRA dropping alignment info.
- # .MEM_48 = VDEF <.MEM_47>
- # lhs access alignment 128+0
- D.2264.theX = _31;
- # .MEM_49 = VDEF <.MEM_48>
- # lhs access alignment 128+32
- D.2264.theY = _34;
- # .MEM_50 = VDEF <.MEM_49>
- # lhs access alignment 128+64
- D.2264.theZ = _37;
- # .MEM_51 = VDEF <.MEM_50>
- # lhs access alignment 128+96
- D.2264.theT = _40;
- # .MEM_52 = VDEF <.MEM_51>
- # lhs access alignment 128+0
- # rhs access alignment 128+0
- *res_7(D) = D.2264;
- # .MEM_9 = VDEF <.MEM_52>
+ SR.22_44 = _31;
+ SR.23_43 = _34;
+ SR.24_42 = _37;
+ SR.25_41 = _40;
+ # .MEM_8 = VDEF <.MEM_1(D)>
+ # lhs access alignment 32+0
+ MEM[(struct LorentzVector *)res_7(D)] = SR.22_44;
+ # .MEM_53 = VDEF <.MEM_8>
+ # lhs access alignment 32+0
+ MEM[(struct LorentzVector *)res_7(D) + 4B] = SR.23_43;
+ # .MEM_54 = VDEF <.MEM_53>
+ # lhs access alignment 32+0
+ MEM[(struct LorentzVector *)res_7(D) + 8B] = SR.24_42;
+ # .MEM_55 = VDEF <.MEM_54>
+ # lhs access alignment 32+0
+ MEM[(struct LorentzVector *)res_7(D) + 12B] = SR.25_41;
+ # .MEM_9 = VDEF <.MEM_55>
of course as it splits up the aggregate store and we can't represent
align + known misalignment with the type used on the MEM_REF we are
somewhat lost here. We can do better for the first and the third
store though:
# .MEM_8 = VDEF <.MEM_1(D)>
# lhs access alignment 128+0
MEM[(struct LorentzVector *)res_7(D)] = SR.22_44;
# .MEM_53 = VDEF <.MEM_8>
# lhs access alignment 32+0
MEM[(struct LorentzVector *)res_7(D) + 4B] = SR.23_43;
# .MEM_54 = VDEF <.MEM_53>
# lhs access alignment 64+0
MEM[(struct LorentzVector *)res_7(D) + 8B] = SR.24_42;
# .MEM_55 = VDEF <.MEM_54>
# lhs access alignment 32+0
MEM[(struct LorentzVector *)res_7(D) + 12B] = SR.25_41;
that seems to be enough here as the vectorizer is clever enough to only
care about the first ref alignment of a group access. Phew ;)
Testing
Index: gcc/tree-sra.c
===================================================================
--- gcc/tree-sra.c (revision 221324)
+++ gcc/tree-sra.c (working copy)
@@ -1597,7 +1597,7 @@ build_ref_for_offset (location_t loc, tr
misalign = (misalign + offset) & (align - 1);
if (misalign != 0)
align = (misalign & -misalign);
- if (align < TYPE_ALIGN (exp_type))
+ if (align != TYPE_ALIGN (exp_type))
exp_type = build_aligned_type (exp_type, align);
mem_ref = fold_build2_loc (loc, MEM_REF, exp_type, base, off);