diff options
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 17 |
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; |