Commit 4c11bdff by Bin Cheng Committed by Bin Cheng

tree-ssa-loop-ivopts.c (struct iv_cand): New field inv_exprs.

	* tree-ssa-loop-ivopts.c (struct iv_cand): New field inv_exprs.
	(dump_cand): Support iv_cand.inv_exprs.
	(add_candidate_1): Record invariant exprs in iv_cand.inv_exprs
	for candidates.
	(iv_ca_set_no_cp, iv_ca_set_cp, free_loop_data): Support
	iv_cand.inv_exprs.

From-SVN: r247889
parent 3df50a94
2017-05-11 Bin Cheng <bin.cheng@arm.com> 2017-05-11 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (struct iv_cand): New field inv_exprs.
(dump_cand): Support iv_cand.inv_exprs.
(add_candidate_1): Record invariant exprs in iv_cand.inv_exprs
for candidates.
(iv_ca_set_no_cp, iv_ca_set_cp, free_loop_data): Support
iv_cand.inv_exprs.
2017-05-11 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Move * tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Move
from ... from ...
* tree-ssa-address.c (multiplier_allowed_in_address_p): ... to here * tree-ssa-address.c (multiplier_allowed_in_address_p): ... to here
......
...@@ -347,9 +347,10 @@ struct cost_pair ...@@ -347,9 +347,10 @@ struct cost_pair
struct iv_cand *cand; /* The candidate. */ struct iv_cand *cand; /* The candidate. */
comp_cost cost; /* The cost. */ comp_cost cost; /* The cost. */
enum tree_code comp; /* For iv elimination, the comparison. */ enum tree_code comp; /* For iv elimination, the comparison. */
bitmap inv_vars; /* The list of invariants that have to be bitmap inv_vars; /* The list of invariant ssa_vars that have to be
preserved. */ preserved when representing iv_use with iv_cand. */
bitmap inv_exprs; /* Loop invariant expressions. */ bitmap inv_exprs; /* The list of newly created invariant expressions
when representing iv_use with iv_cand. */
tree value; /* For final value elimination, the expression for tree value; /* For final value elimination, the expression for
the final value of the iv. For iv elimination, the final value of the iv. For iv elimination,
the new bound to compare with. */ the new bound to compare with. */
...@@ -418,8 +419,11 @@ struct iv_cand ...@@ -418,8 +419,11 @@ struct iv_cand
unsigned cost_step; /* Cost of the candidate's increment operation. */ unsigned cost_step; /* Cost of the candidate's increment operation. */
struct iv_use *ainc_use; /* For IP_{BEFORE,AFTER}_USE candidates, the place struct iv_use *ainc_use; /* For IP_{BEFORE,AFTER}_USE candidates, the place
where it is incremented. */ where it is incremented. */
bitmap inv_vars; /* The list of invariants that are used in step of the bitmap inv_vars; /* The list of invariant ssa_vars used in step of the
biv. */ iv_cand. */
bitmap inv_exprs; /* If step is more complicated than a single ssa_var,
hanlde it as a new invariant expression which will
be hoisted out of loop. */
struct iv *orig_iv; /* The original iv if this cand is added from biv with struct iv *orig_iv; /* The original iv if this cand is added from biv with
smaller type. */ smaller type. */
}; };
...@@ -789,6 +793,11 @@ dump_cand (FILE *file, struct iv_cand *cand) ...@@ -789,6 +793,11 @@ dump_cand (FILE *file, struct iv_cand *cand)
fprintf (file, " Depend on inv.vars: "); fprintf (file, " Depend on inv.vars: ");
dump_bitmap (file, cand->inv_vars); dump_bitmap (file, cand->inv_vars);
} }
if (cand->inv_exprs)
{
fprintf (file, " Depend on inv.exprs: ");
dump_bitmap (file, cand->inv_exprs);
}
if (cand->var_before) if (cand->var_before)
{ {
...@@ -3025,7 +3034,23 @@ add_candidate_1 (struct ivopts_data *data, ...@@ -3025,7 +3034,23 @@ add_candidate_1 (struct ivopts_data *data,
data->vcands.safe_push (cand); data->vcands.safe_push (cand);
if (TREE_CODE (step) != INTEGER_CST) if (TREE_CODE (step) != INTEGER_CST)
find_inv_vars (data, &step, &cand->inv_vars); {
find_inv_vars (data, &step, &cand->inv_vars);
iv_inv_expr_ent *inv_expr = get_loop_invariant_expr (data, step);
/* Share bitmap between inv_vars and inv_exprs for cand. */
if (inv_expr != NULL)
{
cand->inv_exprs = cand->inv_vars;
cand->inv_vars = NULL;
if (cand->inv_exprs)
bitmap_clear (cand->inv_exprs);
else
cand->inv_exprs = BITMAP_ALLOC (NULL);
bitmap_set_bit (cand->inv_exprs, inv_expr->id);
}
}
if (pos == IP_AFTER_USE || pos == IP_BEFORE_USE) if (pos == IP_AFTER_USE || pos == IP_BEFORE_USE)
cand->ainc_use = use; cand->ainc_use = use;
...@@ -5603,6 +5628,7 @@ iv_ca_set_no_cp (struct ivopts_data *data, struct iv_ca *ivs, ...@@ -5603,6 +5628,7 @@ iv_ca_set_no_cp (struct ivopts_data *data, struct iv_ca *ivs,
ivs->n_cands--; ivs->n_cands--;
ivs->cand_cost -= cp->cand->cost; ivs->cand_cost -= cp->cand->cost;
iv_ca_set_remove_invs (ivs, cp->cand->inv_vars, ivs->n_inv_var_uses); iv_ca_set_remove_invs (ivs, cp->cand->inv_vars, ivs->n_inv_var_uses);
iv_ca_set_remove_invs (ivs, cp->cand->inv_exprs, ivs->n_inv_expr_uses);
} }
ivs->cand_use_cost -= cp->cost; ivs->cand_use_cost -= cp->cost;
...@@ -5659,6 +5685,7 @@ iv_ca_set_cp (struct ivopts_data *data, struct iv_ca *ivs, ...@@ -5659,6 +5685,7 @@ iv_ca_set_cp (struct ivopts_data *data, struct iv_ca *ivs,
ivs->n_cands++; ivs->n_cands++;
ivs->cand_cost += cp->cand->cost; ivs->cand_cost += cp->cand->cost;
iv_ca_set_add_invs (ivs, cp->cand->inv_vars, ivs->n_inv_var_uses); iv_ca_set_add_invs (ivs, cp->cand->inv_vars, ivs->n_inv_var_uses);
iv_ca_set_add_invs (ivs, cp->cand->inv_exprs, ivs->n_inv_expr_uses);
} }
ivs->cand_use_cost += cp->cost; ivs->cand_use_cost += cp->cost;
...@@ -7140,6 +7167,8 @@ free_loop_data (struct ivopts_data *data) ...@@ -7140,6 +7167,8 @@ free_loop_data (struct ivopts_data *data)
if (cand->inv_vars) if (cand->inv_vars)
BITMAP_FREE (cand->inv_vars); BITMAP_FREE (cand->inv_vars);
if (cand->inv_exprs)
BITMAP_FREE (cand->inv_exprs);
free (cand); free (cand);
} }
data->vcands.truncate (0); data->vcands.truncate (0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment