]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p ): Check both [reg+mult*reg...
authorIgor Shevlyakov <igor.shevlyakov@gmail.com>
Thu, 24 Oct 2013 18:55:12 +0000 (18:55 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 24 Oct 2013 18:55:12 +0000 (12:55 -0600)
* tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p ): Check both
[reg+mult*reg] and [mult*reg] to determine if multiplier is allowed.

From-SVN: r204031

gcc/ChangeLog
gcc/tree-ssa-loop-ivopts.c

index 4731f1c77e94dddee43746cadc44d62c89efd91f..1b3b1ea9aaef9fe0baf39bb09d58cba3649d7756 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-24  Igor Shevlyakov  <igor.shevlyakov@gmail.com>
+
+       * tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p ): Check both
+       [reg+mult*reg] and [mult*reg] to determine if multiplier is allowed.
+
 2013-10-24  Cong Hou  <congh@google.com>
 
        * convert.c (convert_to_real): Guard those unsafe math function
index fd740160eabee43085eff24203d858b328af1bb0..bd2e6297785525ffa9201df632bbfd3bc054ae3b 100644 (file)
@@ -3120,16 +3120,19 @@ multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, enum machine_mode mode,
     {
       enum machine_mode address_mode = targetm.addr_space.address_mode (as);
       rtx reg1 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1);
-      rtx addr;
+      rtx reg2 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2);
+      rtx addr, scaled;
       HOST_WIDE_INT i;
 
       valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1);
       bitmap_clear (valid_mult);
-      addr = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
+      scaled = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
+      addr = gen_rtx_fmt_ee (PLUS, address_mode, scaled, reg2);
       for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
        {
-         XEXP (addr, 1) = gen_int_mode (i, address_mode);
-         if (memory_address_addr_space_p (mode, addr, as))
+         XEXP (scaled, 1) = gen_int_mode (i, address_mode);
+         if (memory_address_addr_space_p (mode, addr, as)
+             || memory_address_addr_space_p (mode, scaled, as))
            bitmap_set_bit (valid_mult, i + MAX_RATIO);
        }