This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: PR target/52146: [x32] - Wrong code to access addresses 0x80000000 to 0xFFFFFFFF


Hi,

Since constant address in x32 is signed extended to 64bit, negative
displacement without base nor index is out of range.  OK for trunk?

Thanks.


H.J.
---
gcc/

2012-02-10  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/52146
	* config/i386/i386.c (ix86_legitimate_address_p): Disallow
	negative constant address for x32.

gcc/testsuite/

2012-02-10  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/52146
	* gcc.target/i386/pr52146.c: New.

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 009dd53..0bb94a7 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -12107,6 +12107,15 @@ ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
 		   || !ix86_legitimate_constant_p (Pmode, disp)))
 	/* Displacement is not constant.  */
 	return false;
+      else if (TARGET_X32
+	       && !base
+	       && !index
+	       && CONST_INT_P (disp)
+	       && INTVAL (disp) < 0)
+	/* Since constant address in x32 is signed extended to 64bit,
+	   negative displacement without base nor index is out of
+	   range.  */
+	return false;
       else if (TARGET_64BIT
 	       && !x86_64_immediate_operand (disp, VOIDmode))
 	/* Displacement is out of range.  */
diff --git a/gcc/testsuite/gcc.target/i386/pr52146.c b/gcc/testsuite/gcc.target/i386/pr52146.c
new file mode 100644
index 0000000..68bdeff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr52146.c
@@ -0,0 +1,17 @@
+/* { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } && { ! { ia32 } } } } } */
+/* { dg-options "-O2 -mx32" } */
+
+void test1() {
+  int* apic_tpr_addr = (int *)0xfee00080;
+  *apic_tpr_addr += 4;
+}
+void test2() {
+  volatile int* apic_tpr_addr = (int *)0xfee00080;
+  *apic_tpr_addr = 0;
+}
+void test3() {
+  volatile int* apic_tpr_addr = (int *)0x7fffffff;
+  *apic_tpr_addr = 0;
+}
+
+/* { dg-final { scan-assembler-not "-18874240" } } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]