Since stack can only be accessed by GPR, check GENERAL_REG_P, instead of
REG_P, in ix86_find_all_reg_use_1.

gcc/

PR target/118936
* config/i386/i386.cc (ix86_find_all_reg_use_1): Replace REG_P
with GENERAL_REG_P.

gcc/testsuite/

PR target/118936
* gcc.target/i386/pr118936.c: New test.

OK for master?

Thanks.

-- 
H.J.
From 30d6c36b86030712c1f243a3440502baa5c56f87 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.to...@gmail.com>
Date: Wed, 19 Feb 2025 19:48:07 +0800
Subject: [PATCH] x86: Check GENERAL_REG_P for stack access

Since stack can only be accessed by GPR, check GENERAL_REG_P, instead of
REG_P, in ix86_find_all_reg_use_1.

gcc/

	PR target/118936
	* config/i386/i386.cc (ix86_find_all_reg_use_1): Replace REG_P
	with GENERAL_REG_P.

gcc/testsuite/

	PR target/118936
	* gcc.target/i386/pr118936.c: New test.

Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
---
 gcc/config/i386/i386.cc                  |  2 +-
 gcc/testsuite/gcc.target/i386/pr118936.c | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr118936.c

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 560e6525b56..f5d46296570 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -8494,7 +8494,7 @@ ix86_find_all_reg_use_1 (rtx set, HARD_REG_SET &stack_slot_access,
 			 auto_bitmap &worklist)
 {
   rtx dest = SET_DEST (set);
-  if (!REG_P (dest))
+  if (!GENERAL_REG_P (dest))
     return;
 
   rtx src = SET_SRC (set);
diff --git a/gcc/testsuite/gcc.target/i386/pr118936.c b/gcc/testsuite/gcc.target/i386/pr118936.c
new file mode 100644
index 00000000000..22eed881f0f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr118936.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-omit-frame-pointer -fno-toplevel-reorder" } */
+
+struct S1
+{
+  signed int f1 : 17;
+  signed int f2 : 23;
+  signed int f3 : 11;
+  signed int f4: 31;
+  unsigned int f6;
+};
+short g_1611;
+volatile struct S1 **g_1680;
+volatile struct S1 ***g_1679[8][8];
+void
+func_40 (struct S1 p_41, short *l_2436)
+{
+  char __trans_tmp_3;
+  __trans_tmp_3 = p_41.f6;
+  *l_2436 ^= __trans_tmp_3;
+  g_1611 = 0;
+  for (; g_1611 < 8; g_1611 += 1)
+    g_1679[1][g_1611] = &g_1680;
+}
-- 
2.48.1

Reply via email to