OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Dec 2011 15:18:24 +0000 (15:18 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Dec 2011 15:18:24 +0000 (15:18 +0000)
PR middle-end/50873
* optabs.c (maybe_legitimize_operand_same_code): Use copy_to_mode_reg
instead of force_reg.  Do nothing if the address is already a
non-virtual pseudo register.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182244 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c

index 17be451..d02c8df 100644 (file)
@@ -1,3 +1,10 @@
+2011-12-12  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR middle-end/50873
+       * optabs.c (maybe_legitimize_operand_same_code): Use copy_to_mode_reg
+       instead of force_reg.  Do nothing if the address is already a
+       non-virtual pseudo register.
+
 2011-12-12  Torvald Riegel  <triegel@redhat.com>
 
        * gimplify.c (voidify_wrapper_expr): Add default handling for
 2011-12-12  Torvald Riegel  <triegel@redhat.com>
 
        * gimplify.c (voidify_wrapper_expr): Add default handling for
index 2c3a640..0d5cd73 100644 (file)
@@ -8242,24 +8242,31 @@ maybe_legitimize_operand_same_code (enum insn_code icode, unsigned int opno,
     return true;
 
   /* If the operand is a memory whose address has no side effects,
     return true;
 
   /* If the operand is a memory whose address has no side effects,
-     try forcing the address into a register.  The check for side
-     effects is important because force_reg cannot handle things
-     like auto-modified addresses.  */
-  if (insn_data[(int) icode].operand[opno].allows_mem
-      && MEM_P (op->value)
-      && !side_effects_p (XEXP (op->value, 0)))
-    {
-      rtx addr, mem, last;
-
-      last = get_last_insn ();
-      addr = force_reg (Pmode, XEXP (op->value, 0));
-      mem = replace_equiv_address (op->value, addr);
-      if (insn_operand_matches (icode, opno, mem))
+     try forcing the address into a non-virtual pseudo register.
+     The check for side effects is important because copy_to_mode_reg
+     cannot handle things like auto-modified addresses.  */
+  if (insn_data[(int) icode].operand[opno].allows_mem && MEM_P (op->value))
+    {
+      rtx addr, mem;
+
+      mem = op->value;
+      addr = XEXP (mem, 0);
+      if (!(REG_P (addr) && REGNO (addr) > LAST_VIRTUAL_REGISTER)
+         && !side_effects_p (addr))
        {
        {
-         op->value = mem;
-         return true;
+         rtx last;
+         enum machine_mode mode;
+
+         last = get_last_insn ();
+         mode = targetm.addr_space.address_mode (MEM_ADDR_SPACE (mem));
+         mem = replace_equiv_address (mem, copy_to_mode_reg (mode, addr));
+         if (insn_operand_matches (icode, opno, mem))
+           {
+             op->value = mem;
+             return true;
+           }
+         delete_insns_since (last);
        }
        }
-      delete_insns_since (last);
     }
 
   return false;
     }
 
   return false;