re PR target/65103 ([i386] GOTOFF relocation is not propagated into address expression)
authorIlya Enkovich <ilya.enkovich@intel.com>
Thu, 12 Mar 2015 09:53:36 +0000 (09:53 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Thu, 12 Mar 2015 09:53:36 +0000 (09:53 +0000)
gcc/

PR target/65103
* config/i386/i386.c (ix86_address_cost): Fix cost of a PIC
register.

gcc/testsuite/

PR target/65103
* gcc.target/i386/pr65103-1.c: New.

From-SVN: r221380

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr65103-1.c [new file with mode: 0644]

index 3a913208208f4f8b8211d3c9e0ce1e5316e840a1..43d67175732b78c762e7c74857ade38c79babff6 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-12  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR target/65103
+       * config/i386/i386.c (ix86_address_cost): Fix cost of a PIC
+       register.
+
 2015-03-12  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        PR target/65044
index ab8f03acdc615f2739ad7e70831ce19327fc8f00..47deda7ce50f44839d33ba9964cd3d7f7e7de751 100644 (file)
@@ -12931,30 +12931,26 @@ ix86_address_cost (rtx x, machine_mode, addr_space_t, bool)
   if (parts.index && GET_CODE (parts.index) == SUBREG)
     parts.index = SUBREG_REG (parts.index);
 
-  /* Attempt to minimize number of registers in the address.  */
-  if ((parts.base
-       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
-      || (parts.index
-         && (!REG_P (parts.index)
-             || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
-    cost++;
-
-  /* When address base or index is "pic_offset_table_rtx" we don't increase
-     address cost.  When a memopt with "pic_offset_table_rtx" is not invariant
-     itself it most likely means that base or index is not invariant.
-     Therefore only "pic_offset_table_rtx" could be hoisted out, which is not
-     profitable for x86.  */
+  /* Attempt to minimize number of registers in the address by increasing
+     address cost for each used register.  We don't increase address cost
+     for "pic_offset_table_rtx".  When a memopt with "pic_offset_table_rtx"
+     is not invariant itself it most likely means that base or index is not
+     invariant.  Therefore only "pic_offset_table_rtx" could be hoisted out,
+     which is not profitable for x86.  */
   if (parts.base
-      && (current_pass->type == GIMPLE_PASS
-         || (!pic_offset_table_rtx
-             || REGNO (pic_offset_table_rtx) != REGNO(parts.base)))
       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
-      && parts.index
       && (current_pass->type == GIMPLE_PASS
-         || (!pic_offset_table_rtx
-             || REGNO (pic_offset_table_rtx) != REGNO(parts.index)))
+         || !pic_offset_table_rtx
+         || !REG_P (parts.base)
+         || REGNO (pic_offset_table_rtx) != REGNO (parts.base)))
+    cost++;
+
+  if (parts.index
       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
-      && parts.base != parts.index)
+      && (current_pass->type == GIMPLE_PASS
+         || !pic_offset_table_rtx
+         || !REG_P (parts.index)
+         || REGNO (pic_offset_table_rtx) != REGNO (parts.index)))
     cost++;
 
   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
index 485a3f8c3020190df0e51562cbfc964ccac6e9b7..4bd7f0e7211223429bc4f732292f6ac3763b33ff 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-12  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR target/65103
+       * gcc.target/i386/pr65103-1.c: New.
+
 2015-03-12  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        PR target/65044
diff --git a/gcc/testsuite/gcc.target/i386/pr65103-1.c b/gcc/testsuite/gcc.target/i386/pr65103-1.c
new file mode 100644 (file)
index 0000000..4e3a7a3
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-require-effective-target pie } */
+/* { dg-options "-O2 -fPIE" } */
+/* { dg-final { scan-assembler-not "GOTOFF," } } */
+
+typedef struct S
+{
+  int a;
+  int sum;
+  int delta;
+} S;
+
+S gs;
+int global_opt (int max)
+{
+  while (gs.sum < max)
+    gs.sum += gs.delta;
+  return gs.a;
+}