https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127185
--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Kyrylo Tkachov <[email protected]>: https://gcc.gnu.org/g:1bcce941ebbb9ad97997a86432da88c8a9117d4b commit r17-4243-g1bcce941ebbb9ad97997a86432da88c8a9117d4b Author: Kyrylo Tkachov <[email protected]> Date: Tue Sep 8 11:05:32 2026 +0200 middle-end: Use conservative store semantics for MEM_NOTRAP [PR127185] set_mem_attributes derives MEM_NOTRAP from tree_could_trap_p. That predicate describes a load. A store to readonly or otherwise unwritable memory can therefore be marked as nontrapping. RTL exception analysis can then omit an edge for a store that can raise a non-call exception. For example, the asm output in the test was marked nontrapping: (set (mem/u/c:SI (...) [ output+0 ]) ...) Use store trap semantics for it instead: (set (mem/u:SI (...) [ output+0 ]) ...) Add MAY_STORE_P to the memory attribute setters and use lhs_could_trap_p when it is true. Default MAY_STORE_P to true so that an unclassified caller cannot create an unsafe nontrapping claim. EXPAND_NORMAL is the only expand modifier that guarantees that a memory reference describes a load. Treat the other modifiers conservatively. This includes EXPAND_STACK_PARM and the direction-neutral EXPAND_MEMORY. Recompute MEM_NOTRAP on copied declaration RTL so that a normal load keeps the nontrapping form: (mem/u/c:SI (...) [ output+0 ]) This can lose MEM_NOTRAP precision for loads expanded with a direction-neutral modifier. Later patches restore that precision for get_memory_rtx, memory-only inline-assembly inputs, partial loads, and STRUB watermark loads. Bootstrapped and tested on aarch64-unknown-linux-gnu. Tested on x86_64-pc-linux-gnu. PR middle-end/127185 gcc/ChangeLog: * emit-rtl.cc (set_mem_attributes_minus_bitpos): Add MAY_STORE_P. Use lhs_could_trap_p when it is true. (set_mem_attributes): Add MAY_STORE_P and pass it through. * emit-rtl.h (set_mem_attributes): Add MAY_STORE_P with a conservative default. (set_mem_attributes_minus_bitpos): Likewise. * expr.cc (expand_assignment): Mark the destination as a store. (expand_expr_real_1): Treat only EXPAND_NORMAL as a known load. Set MEM_NOTRAP from the access direction. gcc/testsuite/ChangeLog: * g++.dg/eh/noncall-store-2.C: New test. * g++.dg/opt/mem-notrap-store-asm.C: New test. Signed-off-by: Kyrylo Tkachov <[email protected]>
