aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivopts.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r--gcc/tree-ssa-loop-ivopts.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index e16a482..65794b2 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -4331,18 +4331,25 @@ get_address_cost (struct ivopts_data *data, struct iv_use *use,
machine_mode addr_mode = TYPE_MODE (type);
machine_mode mem_mode = TYPE_MODE (TREE_TYPE (*use->op_p));
addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (use->iv->base));
+ /* Only true if ratio != 1. */
+ bool ok_with_ratio_p = false;
+ bool ok_without_ratio_p = false;
if (!aff_combination_const_p (aff_inv))
{
parts.index = integer_one_node;
/* Addressing mode "base + index". */
- if (valid_mem_ref_p (mem_mode, as, &parts))
+ ok_without_ratio_p = valid_mem_ref_p (mem_mode, as, &parts);
+ if (ratio != 1)
{
parts.step = wide_int_to_tree (type, ratio);
/* Addressing mode "base + index << scale". */
- if (ratio != 1 && !valid_mem_ref_p (mem_mode, as, &parts))
+ ok_with_ratio_p = valid_mem_ref_p (mem_mode, as, &parts);
+ if (!ok_with_ratio_p)
parts.step = NULL_TREE;
-
+ }
+ if (ok_with_ratio_p || ok_without_ratio_p)
+ {
if (aff_inv->offset != 0)
{
parts.offset = wide_int_to_tree (sizetype, aff_inv->offset);
@@ -4440,7 +4447,9 @@ get_address_cost (struct ivopts_data *data, struct iv_use *use,
if (parts.symbol != NULL_TREE)
cost.complexity += 1;
- if (parts.step != NULL_TREE && !integer_onep (parts.step))
+ /* Don't increase the complexity of adding a scaled index if it's
+ the only kind of index that the target allows. */
+ if (parts.step != NULL_TREE && ok_without_ratio_p)
cost.complexity += 1;
if (parts.base != NULL_TREE && parts.index != NULL_TREE)
cost.complexity += 1;