]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
lra-constraints.c (process_address): Tighten arguments to base_reg_class.
authorRichard Sandiford <rdsandiford@googlemail.com>
Fri, 26 Oct 2012 06:41:33 +0000 (06:41 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 26 Oct 2012 06:41:33 +0000 (06:41 +0000)
gcc/
* lra-constraints.c (process_address): Tighten arguments to
base_reg_class.  Use simplify_gen_binary to generate PLUS rtxes.

From-SVN: r192836

gcc/ChangeLog
gcc/lra-constraints.c

index 4a93aa6e9224711d0849fb90c36f2aa866f40c5d..be75b81aab5ef5d172fad69eecb412be11572b52 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-26  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * lra-constraints.c (process_address): Tighten arguments to
+       base_reg_class.  Use simplify_gen_binary to generate PLUS rtxes.
+
 2012-10-26  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * lra-constraints.c (get_index_scale, can_add_disp_p): New functions.
index 84c9e1511c99103f6faddd0c31a928c530be703d..ffc067b36346466e7a13d01ea7299662eddf4d60 100644 (file)
@@ -2722,15 +2722,14 @@ process_address (int nop, rtx *before, rtx *after)
        {
          /* index * scale + disp => new base + index * scale,
             case (1) above.  */
-         enum reg_class cl = base_reg_class (mode, as, SCRATCH, SCRATCH);
+         enum reg_class cl = base_reg_class (mode, as, PLUS,
+                                             GET_CODE (*ad.index_loc));
 
          lra_assert (INDEX_REG_CLASS != NO_REGS);
          new_reg = lra_create_new_reg (Pmode, NULL_RTX, cl, "disp");
-         lra_assert (GET_CODE (*addr_loc) == PLUS);
          lra_emit_move (new_reg, *ad.disp_loc);
-         if (CONSTANT_P (XEXP (*addr_loc, 1)))
-           XEXP (*addr_loc, 1) = XEXP (*addr_loc, 0);
-         XEXP (*addr_loc, 0) = new_reg;
+         *addr_loc = simplify_gen_binary (PLUS, GET_MODE (new_reg),
+                                          new_reg, *ad.index_loc);
        }
     }
   else if (ad.index_reg_loc == NULL)
@@ -2749,7 +2748,8 @@ process_address (int nop, rtx *before, rtx *after)
       /* base + scale * index + disp => new base + scale * index,
         case (1) above.  */
       new_reg = base_plus_disp_to_reg (mode, as, &ad);
-      *addr_loc = gen_rtx_PLUS (Pmode, new_reg, *ad.index_loc);
+      *addr_loc = simplify_gen_binary (PLUS, GET_MODE (new_reg),
+                                      new_reg, *ad.index_loc);
     }
   *before = get_insns ();
   end_sequence ();