summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivopts.c
diff options
context:
space:
mode:
authordavidxl <davidxl@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-28 05:54:54 +0000
committerdavidxl <davidxl@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-28 05:54:54 +0000
commit7d5663e428c80950a119271266399a19a97e1a42 (patch)
tree3fbf89b7f28d0b81cc3e566570f5e04bfff928f8 /gcc/tree-ssa-loop-ivopts.c
parenta0aaaf80944c9f41c330769bc5b8af1cc600226a (diff)
downloadgcc-7d5663e428c80950a119271266399a19a97e1a42.tar.gz
Fix PR45422
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163610 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r--gcc/tree-ssa-loop-ivopts.c54
1 files changed, 25 insertions, 29 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 0029c762687..78bbd8eb296 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -327,6 +327,13 @@ struct iv_ca
/* Number of times each invariant is used. */
unsigned *n_invariant_uses;
+ /* The array holding the number of uses of each loop
+ invariant expressions created by ivopt. */
+ unsigned *used_inv_expr;
+
+ /* The number of created loop invariants. */
+ unsigned num_used_inv_expr;
+
/* Total cost of the assignment. */
comp_cost cost;
};
@@ -4806,45 +4813,17 @@ iv_ca_cand_for_use (struct iv_ca *ivs, struct iv_use *use)
return ivs->cand_for_use[use->id];
}
-
-/* Returns the number of temps needed for new loop invariant
- expressions. */
-
-static int
-iv_ca_get_num_inv_exprs (struct ivopts_data *data, struct iv_ca *ivs)
-{
- unsigned i, n = 0;
- unsigned *used_inv_expr = XCNEWVEC (unsigned, data->inv_expr_id + 1);
-
- for (i = 0; i < ivs->upto; i++)
- {
- struct iv_use *use = iv_use (data, i);
- struct cost_pair *cp = iv_ca_cand_for_use (ivs, use);
- if (cp && cp->inv_expr_id != -1)
- {
- used_inv_expr[cp->inv_expr_id]++;
- if (used_inv_expr[cp->inv_expr_id] == 1)
- n++;
- }
- }
-
- free (used_inv_expr);
- return n;
-}
-
/* Computes the cost field of IVS structure. */
static void
iv_ca_recount_cost (struct ivopts_data *data, struct iv_ca *ivs)
{
- unsigned n_inv_exprs = 0;
comp_cost cost = ivs->cand_use_cost;
cost.cost += ivs->cand_cost;
- n_inv_exprs = iv_ca_get_num_inv_exprs (data, ivs);
cost.cost += ivopts_global_cost_for_size (data,
- ivs->n_regs + n_inv_exprs);
+ ivs->n_regs + ivs->num_used_inv_expr);
ivs->cost = cost;
}
@@ -4901,6 +4880,13 @@ iv_ca_set_no_cp (struct ivopts_data *data, struct iv_ca *ivs,
ivs->cand_use_cost = sub_costs (ivs->cand_use_cost, cp->cost);
iv_ca_set_remove_invariants (ivs, cp->depends_on);
+
+ if (cp->inv_expr_id != -1)
+ {
+ ivs->used_inv_expr[cp->inv_expr_id]--;
+ if (ivs->used_inv_expr[cp->inv_expr_id] == 0)
+ ivs->num_used_inv_expr--;
+ }
iv_ca_recount_cost (data, ivs);
}
@@ -4958,6 +4944,13 @@ iv_ca_set_cp (struct ivopts_data *data, struct iv_ca *ivs,
ivs->cand_use_cost = add_costs (ivs->cand_use_cost, cp->cost);
iv_ca_set_add_invariants (ivs, cp->depends_on);
+
+ if (cp->inv_expr_id != -1)
+ {
+ ivs->used_inv_expr[cp->inv_expr_id]++;
+ if (ivs->used_inv_expr[cp->inv_expr_id] == 1)
+ ivs->num_used_inv_expr++;
+ }
iv_ca_recount_cost (data, ivs);
}
}
@@ -5165,6 +5158,8 @@ iv_ca_new (struct ivopts_data *data)
nw->cand_cost = 0;
nw->n_invariant_uses = XCNEWVEC (unsigned, data->max_inv_id + 1);
nw->cost = zero_cost;
+ nw->used_inv_expr = XCNEWVEC (unsigned, data->inv_expr_id + 1);
+ nw->num_used_inv_expr = 0;
return nw;
}
@@ -5178,6 +5173,7 @@ iv_ca_free (struct iv_ca **ivs)
free ((*ivs)->n_cand_uses);
BITMAP_FREE ((*ivs)->cands);
free ((*ivs)->n_invariant_uses);
+ free ((*ivs)->used_inv_expr);
free (*ivs);
*ivs = NULL;
}