]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cse: Check volatile memory in cselib_redundant_set_p
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 17 Dec 2025 04:18:15 +0000 (12:18 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 17 Dec 2025 23:02:48 +0000 (07:02 +0800)
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 <hjl.tools@gmail.com>
gcc/cselib.cc
gcc/testsuite/gcc.dg/pr122343-1.c [new file with mode: 0644]

index 930357409bc54d38d5fbb954d440b16cea513155..5d78675c4ba2984543ff4f9567bb977de4af31cc 100644 (file)
@@ -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 (file)
index 0000000..b1fd0f0
--- /dev/null
@@ -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;
+}