https://gcc.gnu.org/g:4fbe8f4438980082de9e01b6dcd339ea1d8e5d9f
commit r16-6229-g4fbe8f4438980082de9e01b6dcd339ea1d8e5d9f Author: H.J. Lu <[email protected]> Date: Wed Dec 17 12:18:15 2025 +0800 cse: Check volatile memory in cselib_redundant_set_p For h8300-elf, gcc.dg/pr114768.c fails when compiled with -O2 -msx since cselib_redundant_set_p returns true when called with (gdb) call debug (set) (set (mem:HI (reg/f:SI 0 r0 [orig:21 p ] [21]) [1 *p_3(D)+0 S2 A16]) (mem/v:HI (reg/f:SI 0 r0 [orig:21 p ] [21]) [1 MEM[(volatile int *)p_3(D)]+0 S2 A16])) (gdb) from reload_cse_regs. Update cselib_redundant_set_p to return false for volatile memory source or destination. gcc/ PR target/122343 * cselib.cc (cselib_redundant_set_p): Return false for volatile memory source or destination. gcc/testsuite/ PR target/122343 * gcc.dg/pr122343-1.c: New test. Signed-off-by: H.J. Lu <[email protected]> Diff: --- gcc/cselib.cc | 8 ++++++-- gcc/testsuite/gcc.dg/pr122343-1.c | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gcc/cselib.cc b/gcc/cselib.cc index 930357409bc5..5d78675c4ba2 100644 --- a/gcc/cselib.cc +++ b/gcc/cselib.cc @@ -1194,7 +1194,9 @@ cselib_redundant_set_p (rtx set) if (cselib_reg_set_mode (dest) != GET_MODE (dest)) return false; - if (!rtx_equal_for_cselib_p (dest, SET_SRC (set))) + rtx src = SET_SRC (set); + if ((MEM_P (src) && MEM_VOLATILE_P (src)) + || !rtx_equal_for_cselib_p (dest, src)) return false; while (GET_CODE (dest) == SUBREG @@ -1205,6 +1207,9 @@ cselib_redundant_set_p (rtx set) if (!flag_strict_aliasing || !MEM_P (dest)) return true; + if (MEM_VOLATILE_P (dest)) + return false; + /* For a store we need to check that suppressing it will not change the effective alias set. */ rtx dest_addr = XEXP (dest, 0); @@ -1242,7 +1247,6 @@ cselib_redundant_set_p (rtx set) /* We failed to find a recorded value in the cselib history, so try the source of this set; this catches cases such as *p = *q when p and q have the same value. */ - rtx src = SET_SRC (set); while (GET_CODE (src) == SUBREG) src = XEXP (src, 0); diff --git a/gcc/testsuite/gcc.dg/pr122343-1.c b/gcc/testsuite/gcc.dg/pr122343-1.c new file mode 100644 index 000000000000..b1fd0f0abc24 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr122343-1.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-rtl-final" } */ +/* { dg-final { scan-rtl-dump "\\\(mem/v:" "final" } } */ + +void +foo (int *p) +{ + *(volatile int *) p = *p; +}
