From: H.J. Lu Date: Wed, 17 Dec 2025 04:18:15 +0000 (+0800) Subject: cse: Check volatile memory in cselib_redundant_set_p X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4fbe8f4438980082de9e01b6dcd339ea1d8e5d9f;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cselib.cc b/gcc/cselib.cc index 930357409bc..5d78675c4ba 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 00000000000..b1fd0f0abc2 --- /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; +}