diff options
author | Bin Cheng <bin.cheng@arm.com> | 2014-01-11 09:33:39 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2014-01-11 09:33:39 +0000 |
commit | 2c4074268983c92c1c8554b591a6877b4e92d7bb (patch) | |
tree | 287af300fe6f96b18a3119d658f1e2505f6c47be /gcc/tree-ssa-loop-ivopts.c | |
parent | 730e409386c1e3b2d2a2d50d0c9ef5e4b9e40d59 (diff) | |
download | gcc-2c4074268983c92c1c8554b591a6877b4e92d7bb.zip gcc-2c4074268983c92c1c8554b591a6877b4e92d7bb.tar.gz gcc-2c4074268983c92c1c8554b591a6877b4e92d7bb.tar.bz2 |
tree-ssa-loop-ivopts.c (iv_ca_narrow): New parameter.
* tree-ssa-loop-ivopts.c (iv_ca_narrow): New parameter.
Start narrowing with START. Apply candidate-use pair
and check overall cost in narrowing.
(iv_ca_prune): Pass new argument.
From-SVN: r206552
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 483b4d0..2d96fce 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -5733,18 +5733,20 @@ iv_ca_extend (struct ivopts_data *data, struct iv_ca *ivs, } /* Try narrowing set IVS by removing CAND. Return the cost of - the new set and store the differences in DELTA. */ + the new set and store the differences in DELTA. START is + the candidate with which we start narrowing. */ static comp_cost iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs, - struct iv_cand *cand, struct iv_ca_delta **delta) + struct iv_cand *cand, struct iv_cand *start, + struct iv_ca_delta **delta) { unsigned i, ci; struct iv_use *use; struct cost_pair *old_cp, *new_cp, *cp; bitmap_iterator bi; struct iv_cand *cnd; - comp_cost cost; + comp_cost cost, best_cost, acost; *delta = NULL; for (i = 0; i < n_iv_uses (data); i++) @@ -5755,13 +5757,15 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs, if (old_cp->cand != cand) continue; - new_cp = NULL; + best_cost = iv_ca_cost (ivs); + /* Start narrowing with START. */ + new_cp = get_use_iv_cost (data, use, start); if (data->consider_all_candidates) { EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, ci, bi) { - if (ci == cand->id) + if (ci == cand->id || (start && ci == start->id)) continue; cnd = iv_cand (data, ci); @@ -5770,20 +5774,21 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs, if (!cp) continue; - if (!iv_ca_has_deps (ivs, cp)) - continue; + iv_ca_set_cp (data, ivs, use, cp); + acost = iv_ca_cost (ivs); - if (!cheaper_cost_pair (cp, new_cp)) - continue; - - new_cp = cp; + if (compare_costs (acost, best_cost) < 0) + { + best_cost = acost; + new_cp = cp; + } } } else { EXECUTE_IF_AND_IN_BITMAP (use->related_cands, ivs->cands, 0, ci, bi) { - if (ci == cand->id) + if (ci == cand->id || (start && ci == start->id)) continue; cnd = iv_cand (data, ci); @@ -5791,15 +5796,19 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs, cp = get_use_iv_cost (data, use, cnd); if (!cp) continue; - if (!iv_ca_has_deps (ivs, cp)) - continue; - if (!cheaper_cost_pair (cp, new_cp)) - continue; + iv_ca_set_cp (data, ivs, use, cp); + acost = iv_ca_cost (ivs); - new_cp = cp; + if (compare_costs (acost, best_cost) < 0) + { + best_cost = acost; + new_cp = cp; + } } } + /* Restore to old cp for use. */ + iv_ca_set_cp (data, ivs, use, old_cp); if (!new_cp) { @@ -5841,7 +5850,7 @@ iv_ca_prune (struct ivopts_data *data, struct iv_ca *ivs, if (cand == except_cand) continue; - acost = iv_ca_narrow (data, ivs, cand, &act_delta); + acost = iv_ca_narrow (data, ivs, cand, except_cand, &act_delta); if (compare_costs (acost, best_cost) < 0) { |