https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127185
--- Comment #2 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:740f6ebc5c61bef4c7dd9b9c6addc1946181f047 commit r17-4244-g740f6ebc5c61bef4c7dd9b9c6addc1946181f047 Author: Kyrylo Tkachov <[email protected]> Date: Tue Sep 8 11:06:06 2026 +0200 builtins: Pass access direction to get_memory_rtx [PR127185] get_memory_rtx creates memory operands for both sources and destinations of string operations. The memory attribute setter cannot infer the access direction from the address expression. Its conservative default therefore loses nontrapping information for known loads. An inline memcmp source changes from: (mem:QI (...) [ this ]) to: (mem/c:QI (...) [ this ]) Add a required STORE_P argument to get_memory_rtx. Mark destinations as stores and sources as loads at every caller. This keeps precise nontrapping information for loads without using it for stores. Bootstrapped and tested on aarch64-unknown-linux-gnu. Tested on x86_64-pc-linux-gnu. PR middle-end/127185 gcc/ChangeLog: * builtins.cc (get_memory_rtx): Add STORE_P. Pass it to set_mem_attributes. (expand_builtin_memory_copy_args): Mark the destination as a store and the source as a load. (expand_movstr): Likewise. (expand_builtin_strncpy): Mark the destination as a store. (expand_builtin_memset_args): Likewise. (expand_builtin_memcmp): Mark both memory operands as loads. (expand_builtin_strcmp): Likewise. (expand_builtin_strncmp): Likewise. (inline_string_cmp): Mark the memory operand as a load. * builtins.h (get_memory_rtx): Add STORE_P. * internal-fn.cc (expand_RAWMEMCHR): Mark the memory operand as a load. gcc/testsuite/ChangeLog: * g++.dg/opt/mem-notrap-load-builtin.C: New test. Signed-off-by: Kyrylo Tkachov <[email protected]>
