https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103282
--- Comment #8 from Jan Hubicka <hubicka at gcc dot gnu.org> --- OK, the difference seems to be that on x86_64 even with -m32 we vectorize kill_me: __attribute__((noinline)) void kill_me (struct a * a) { int * vectp.6; vector(2) int * vectp_a.5; <bb 2> [local count: 1073741824]: MEM <vector(2) int> [(int *)a_2(D)] = { 0, 0 }; a_2(D)->c = 0; return; } which leads different modref summary: Limits: 32 bases, 16 refs Base 0: alias set 1 Ref 0: alias set 1 access: Parm 0 param offset:0 offset:0 size:64 max_size:64 Base 1: alias set 2 Ref 0: alias set 1 access: Parm 0 param offset:0 offset:64 size:32 max_size:32 kills: Parm 0 param offset:0 offset:0 size:96 max_size:96 Try dse parm 0 flags: no_indirect_clobber no_direct_escape no_indirect_escape no_direct_read no_indirect_read compared to: loads: Limits: 32 bases, 16 refs stores: Limits: 32 bases, 16 refs Base 0: alias set 2 Ref 0: alias set 1 access: Parm 0 param offset:0 offset:0 size:32 max_size:96 kills: Parm 0 param offset:0 offset:0 size:96 max_size:96 Try dse parm 0 flags: no_indirect_clobber no_direct_escape no_indirect_escape no_direct_read no_indirect_read Both summaries are correct and I wonder why bytewise DSE does not like the second.