]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/52698 (-maddress-mode=long doesn't work)
authorUros Bizjak <ubizjak@gmail.com>
Thu, 29 Mar 2012 19:59:36 +0000 (21:59 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 29 Mar 2012 19:59:36 +0000 (21:59 +0200)
Backported from mainline
2012-03-27  Uros Bizjak  <ubizjak@gmail.com>

PR target/52698
* config/i386/i386-protos.h (ix86_legitimize_reload_address):
New prototype.
* config/i386/i386.h (LEGITIMIZE_RELOAD_ADDRESS): New define.
* config/i386/i386.c: Include reload.h.
(ix86_legitimize_reload_address): New function.

From-SVN: r185975

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h

index 7e92423998bc44ad1957669d9b9e9823f0e95ddf..bdbbe760bb47fca3569cb0ac752e11a60c19ceb7 100644 (file)
@@ -1,3 +1,15 @@
+2012-03-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backported from mainline
+       2012-03-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/52698
+       * config/i386/i386-protos.h (ix86_legitimize_reload_address):
+       New prototype.
+       * config/i386/i386.h (LEGITIMIZE_RELOAD_ADDRESS): New define.
+       * config/i386/i386.c: Include reload.h.
+       (ix86_legitimize_reload_address): New function.
+
 2012-03-28  Martin Jambor  <mjambor@suse.cz>
 
        Backported from mainline
index 998436e9354880f06939c112a7946c07a16c29e4..f3fe9831147c8923bfba3230a5880b4e18f3c61b 100644 (file)
@@ -57,7 +57,8 @@ extern bool legitimate_constant_p (rtx);
 extern bool constant_address_p (rtx);
 extern bool legitimate_pic_operand_p (rtx);
 extern int legitimate_pic_address_disp_p (rtx);
-
+extern bool ix86_legitimize_reload_address (rtx, enum machine_mode,
+                                           int, int, int);
 extern void print_reg (rtx, int, FILE*);
 extern void print_operand (FILE*, rtx, int);
 extern void print_operand_address (FILE*, rtx);
index dc89207689525430e943a4f64a33bd3305bb61ff..9b29d5b7d6204f248abb29a496cad65159315ab5 100644 (file)
@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "target.h"
 #include "target-def.h"
 #include "langhooks.h"
+#include "reload.h"
 #include "cgraph.h"
 #include "gimple.h"
 #include "dwarf2.h"
@@ -9875,6 +9876,64 @@ legitimate_pic_address_disp_p (rtx disp)
   return 0;
 }
 
+/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
+   replace the input X, or the original X if no replacement is called for.
+   The output parameter *WIN is 1 if the calling macro should goto WIN,
+   0 if it should not.  */
+
+bool
+ix86_legitimize_reload_address (rtx x,
+                               enum machine_mode mode ATTRIBUTE_UNUSED,
+                               int opnum, int type,
+                               int ind_levels ATTRIBUTE_UNUSED)
+{
+  /* Reload can generate:
+
+     (plus:DI (plus:DI (unspec:DI [(const_int 0 [0])] UNSPEC_TP)
+                      (reg:DI 97))
+             (reg:DI 2 cx))
+
+     This RTX is rejected from ix86_legitimate_address_p due to
+     non-strictness of base register 97.  Following this rejection, 
+     reload pushes all three components into separate registers,
+     creating invalid memory address RTX.
+
+     Following code reloads only the invalid part of the
+     memory address RTX.  */
+
+  if (GET_CODE (x) == PLUS
+      && REG_P (XEXP (x, 1))
+      && GET_CODE (XEXP (x, 0)) == PLUS
+      && REG_P (XEXP (XEXP (x, 0), 1)))
+    {
+      rtx base, index;
+      bool something_reloaded = false;
+
+      base = XEXP (XEXP (x, 0), 1);      
+      if (!REG_OK_FOR_BASE_STRICT_P (base))
+       {
+         push_reload (base, NULL_RTX, &XEXP (XEXP (x, 0), 1), NULL,
+                      BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
+                      opnum, (enum reload_type)type);
+         something_reloaded = true;
+       }
+
+      index = XEXP (x, 1);
+      if (!REG_OK_FOR_INDEX_STRICT_P (index))
+       {
+         push_reload (index, NULL_RTX, &XEXP (x, 1), NULL,
+                      INDEX_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
+                      opnum, (enum reload_type)type);
+         something_reloaded = true;
+       }
+
+      gcc_assert (something_reloaded);
+      return true;
+    }
+
+  return false;
+}
+
 /* Recognizes RTL expressions that are valid memory addresses for an
    instruction.  The MODE argument is the machine mode for the MEM
    expression that wants to use this address.
index 2608aecfb98866d9e115203ef55889e5300344a7..2dc22fac759919889efc6b91d92459c2a2d9d767 100644 (file)
@@ -1766,6 +1766,17 @@ typedef struct ix86_args {
 
 #define LEGITIMATE_CONSTANT_P(X)  legitimate_constant_p (X)
 
+/* Try a machine-dependent way of reloading an illegitimate address
+   operand.  If we find one, push the reload and jump to WIN.  This
+   macro is used in only one place: `find_reloads_address' in reload.c.  */
+
+#define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, INDL, WIN)     \
+do {                                                                   \
+  if (ix86_legitimize_reload_address ((X), (MODE), (OPNUM),            \
+                                     (int)(TYPE), (INDL)))             \
+    goto WIN;                                                          \
+} while (0)
+
 /* If defined, a C expression to determine the base term of address X.
    This macro is used in only one place: `find_base_term' in alias.c.