https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68786
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- For normal vectorized stores, the alignment is preserved through the MEM_REF/TARGET_MEM_REF type, e.g. 5991 TREE_TYPE (data_ref) 5992 = build_aligned_type (TREE_TYPE (data_ref), 5993 align * BITS_PER_UNIT); but for masked loads/stores we don't have that available, all we record is the pointer (what we put as TREE_OPERAND (mem_ref, 0)), which can have arbitrary type, and the aliasing pointer (with always zero constant). The alignment info we record through: set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign); Unfortunately, it seems that this way we rely on the optimizers not to lose the alignment in the points to info, otherwise get_object_alignment_2 assumes the pointer is fully aligned. In *.vect it is still preserved: # PT = nonlocal escaped # ALIGN = 8, MISALIGN = 0 vectp_pretmp.14_77 = vectp_pretmp.14_74 + 32; # USE = anything # CLB = anything MASK_STORE (vectp_pretmp.14_77, 0B, mask__ifc__37.13_72, vect_cst__73); but then comes ivopts and turns that into: _36 = ivtmp.32_7 + 32; # PT = nonlocal escaped _37 = (vector(4) double *) _36; # PT = nonlocal escaped # ALIGN = 8, MISALIGN = 0 vectp_pretmp.14_77 = _37; # USE = anything # CLB = anything MASK_STORE (vectp_pretmp.14_77, 0B, mask__ifc__37.13_72, vect_cst__73); and then dom3 turns this into: _36 = ivtmp.32_7 + 32; # PT = nonlocal escaped _37 = (vector(4) double *) _36; # PT = nonlocal escaped # ALIGN = 8, MISALIGN = 0 vectp_pretmp.14_77 = _37; # USE = anything # CLB = anything MASK_STORE (_37, 0B, mask__36.12_70, { 1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0 }); and the points to info is there already only on a SSA_NAME that has zero uses. So, I think that we need to store the original alignment from the vectorization time somewhere else, so it is not an optimization to have that info preserved. As the second argument of MASK_{LOAD,STORE} ifn is always 0, and all it matters is the type on it, perhaps we could stick the alignment in that argument in there? I.e. call get_object_alignment for the original load/store during tree-if-conversion.c, in the vectorizer store: misalign ? misalign & -misalign : align as INTEGER_CST with the type we were using on the 0 pointer now, and then during expansion use build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0) instead of gimple_call_arg (stmt, 1), and the actual value use to build_aligned_type from the rhs type. Richard, are you ok with that representation? And then of course is the optimization question, that it is bad that the points to / alignment info is lost due to what ivopts and following optimization passes perform. Should we have some late ccp pass that recomputes it, or teach ivopts to to add alignment/points to info to the stuff it creates, or teach some optimizations that if they replace one pointer with another defined in the same bb and the old one has more precise points to info (or similarly for integers and value ranges) that it could stick that better info onto the other SSA_NAME?