Patchwork RFC: PR rtl-optimization/47958: [x32] reload generates invalid address reference

login
register
mail settings
Submitter H.J. Lu
Date March 2, 2011, 5:29 p.m.
Message ID <20110302172921.GA2302@intel.com>
Download mbox | patch
Permalink /patch/85113/
State New
Headers show

Comments

H.J. Lu - March 2, 2011, 5:29 p.m.
Hi,

When we force a symbol reference in the constant pool, it should be
in ptr_mode even if symbol is in Pmode.  This patch does it.  Does
it make any senses?

Thanks.


H.J.
---

Patch

diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32
index 497866d..628841d 100644
--- a/gcc/ChangeLog.x32
+++ b/gcc/ChangeLog.x32
@@ -1,3 +1,9 @@ 
+2011-03-02  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR rtl-optimization/47958
+	* varasm.c (force_const_mem): Force symbol reference in
+	ptr_mode.
+
 2011-03-01  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR target/47744
diff --git a/gcc/testsuite/ChangeLog.x32 b/gcc/testsuite/ChangeLog.x32
index c57f5ca..22345df 100644
--- a/gcc/testsuite/ChangeLog.x32
+++ b/gcc/testsuite/ChangeLog.x32
@@ -1,3 +1,8 @@ 
+2011-03-02  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR rtl-optimization/47958
+	* gcc.dg/torture/pr47958-1.c: New.
+
 2011-03-01  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR target/47744
diff --git a/gcc/testsuite/gcc.dg/torture/pr47958-1.c b/gcc/testsuite/gcc.dg/torture/pr47958-1.c
new file mode 100644
index 0000000..9fdf142
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr47958-1.c
@@ -0,0 +1,13 @@ 
+/* { dg-do assemble } */
+
+void (*foo[6][6]) (int);
+void bar (hdR)
+    int hdR;
+{ }
+void xxx ()
+{
+    unsigned int i, j;
+    for (i = 0; i < 6; ++i)
+	for (j = 0; j < 6; ++j)
+            foo [i][j] = bar;
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 9887fe4..b4e29f6 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -3511,6 +3511,13 @@  force_const_mem (enum machine_mode mode, rtx x)
   if (targetm.cannot_force_const_mem (x))
     return NULL_RTX;
 
+  /* Symbol reference in the constant pool must be in ptr_mode.  */
+  if (Pmode != ptr_mode
+      && mode == Pmode
+      && GET_MODE (x) == Pmode
+      && GET_CODE (x) == SYMBOL_REF)
+    mode = ptr_mode;
+
   /* Record that this function has used a constant pool entry.  */
   crtl->uses_const_pool = 1;