i386.c (ix86_address_cost): Lower cost for when address contains GOT register.
authorEvgeny Stupachenko <evstupac@gmail.com>
Mon, 13 Oct 2014 17:28:24 +0000 (17:28 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Mon, 13 Oct 2014 17:28:24 +0000 (17:28 +0000)
gcc/
* config/i386/i386.c (ix86_address_cost): Lower cost for
when address contains GOT register.

From-SVN: r216155

gcc/ChangeLog
gcc/config/i386/i386.c

index 66fecb931196e0731d4fa11f623b96d3f41c4b88..7dfd1b80bb0dcbf39b8e10f430a68e9e2e6f0899 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-13  Evgeny Stupachenko  <evstupac@gmail.com>
+
+       * config/i386/i386.c (ix86_address_cost): Lower cost for
+       when address contains GOT register.
+
 2014-10-13  Ilya Enkovich  <ilya.enkovich@intel.com>
            Vladimir Makarov  <vmakarov@redhat.com>
 
index 2a64d2d3611ce88901fcf1e2067d2cef426d21f3..1c38353cc9c22c0135f237b2030ea601d3bffb08 100644 (file)
@@ -12455,9 +12455,18 @@ ix86_address_cost (rtx x, enum machine_mode, addr_space_t, bool)
              || 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.  */
   if (parts.base
+      && (!pic_offset_table_rtx
+         || REGNO (pic_offset_table_rtx) != REGNO(parts.base))
       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
       && parts.index
+      && (!pic_offset_table_rtx
+         || REGNO (pic_offset_table_rtx) != REGNO(parts.index))
       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
       && parts.base != parts.index)
     cost++;