https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69891
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- The problematic store is based on argp so it isn't killed by the memset, since only those based on sp or fp are: **scanning insn=20 mem: (symbol_ref:SI ("memset") [flags 0x41] <function_decl 0x7ffff6d1ee00 memset>) after canon_rtx address: (symbol_ref:SI ("memset") [flags 0x41] <function_decl 0x7ffff6d1ee00 memset>) gid=1 offset=0 processing const load gid=1[0..1) removing from active insn=19 has store removing from active insn=18 has store removing from active insn=17 has store memset call 20 It's apparently a small loophole in the PR middle-end/31150 enhancement. Index: dse.c =================================================================== --- dse.c (revision 233545) +++ dse.c (working copy) @@ -2528,6 +2528,10 @@ scan_insn (bb_info_t bb_info, rtx_insn * i_ptr = i_ptr->next_local_store; } + /* But a call to memset clobbers memory so invalidates stores. It's + not only an optimization issue (the previous stores may be dead) + but also a correctness issue since the previous stores cannot be + seen as the source of the current value of the locations. */ if (memset_call) { rtx args[3]; @@ -2556,6 +2560,8 @@ scan_insn (bb_info_t bb_info, rtx_insn * active_local_stores = insn_info; } } + else + add_non_frame_wild_read (bb_info); } } else if (SIBLING_CALL_P (insn) && reload_completed) Jakub, does this look good to you?