diff options
author | Igor Shevlyakov <igor.shevlyakov@gmail.com> | 2013-10-24 18:55:12 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2013-10-24 12:55:12 -0600 |
commit | f258df2d19bfd37f1458d71e32cf206fe6b34bb0 (patch) | |
tree | 79a4c847d9fe83459e20ee3e311470c35ffa772b /gcc | |
parent | 247dbcf4ab40703cb68ed7c7c593493ee0d7ec80 (diff) | |
download | gcc-f258df2d19bfd37f1458d71e32cf206fe6b34bb0.zip gcc-f258df2d19bfd37f1458d71e32cf206fe6b34bb0.tar.gz gcc-f258df2d19bfd37f1458d71e32cf206fe6b34bb0.tar.bz2 |
tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p ): Check both [reg+mult*reg] and [mult*reg] to determine if multiplier is allowed.
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4731f1c..1b3b1ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index fd740160..bd2e629 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -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); } |