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.