aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivopts.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2014-01-11 09:33:39 +0000
committerBin Cheng <amker@gcc.gnu.org>2014-01-11 09:33:39 +0000
commit2c4074268983c92c1c8554b591a6877b4e92d7bb (patch)
tree287af300fe6f96b18a3119d658f1e2505f6c47be /gcc/tree-ssa-loop-ivopts.c
parent730e409386c1e3b2d2a2d50d0c9ef5e4b9e40d59 (diff)
downloadgcc-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.c45
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)
{