Commit 1b92ccde by Bin Cheng Committed by Bin Cheng

(aff_combination_expand): Move (T1)(X *+- CST) simplification to ...

	(tree_to_aff_combination): ... here.

From-SVN: r248955
parent c18101f5
2017-06-07 Bin Cheng <bin.cheng@arm.com> 2017-06-07 Bin Cheng <bin.cheng@arm.com>
(aff_combination_expand): Move (T1)(X *+- CST) simplification to ...
(tree_to_aff_combination): ... here.
2017-06-07 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (ivopts_estimate_reg_pressure): New * tree-ssa-loop-ivopts.c (ivopts_estimate_reg_pressure): New
reg_pressure model function. reg_pressure model function.
(ivopts_global_cost_for_size): Delete. (ivopts_global_cost_for_size): Delete.
......
...@@ -363,6 +363,33 @@ tree_to_aff_combination (tree expr, tree type, aff_tree *comb) ...@@ -363,6 +363,33 @@ tree_to_aff_combination (tree expr, tree type, aff_tree *comb)
aff_combination_add (comb, &tmp); aff_combination_add (comb, &tmp);
return; return;
CASE_CONVERT:
{
tree otype = TREE_TYPE (expr);
tree inner = TREE_OPERAND (expr, 0);
tree itype = TREE_TYPE (inner);
enum tree_code icode = TREE_CODE (inner);
/* In principle this is a valid folding, but it isn't necessarily
an optimization, so do it here and not in fold_unary. */
if ((icode == PLUS_EXPR || icode == MINUS_EXPR || icode == MULT_EXPR)
&& TREE_CODE (itype) == INTEGER_TYPE
&& TREE_CODE (otype) == INTEGER_TYPE
&& TYPE_PRECISION (otype) > TYPE_PRECISION (itype)
&& TYPE_OVERFLOW_UNDEFINED (itype)
&& TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST)
{
/* Convert (T1)(X *+- CST) into (T1)X *+- (T1)CST if X's type has
undefined overflow behavior. */
tree op0 = fold_convert (otype, TREE_OPERAND (inner, 0));
tree op1 = fold_convert (otype, TREE_OPERAND (inner, 1));
expr = fold_build2 (icode, otype, op0, op1);
tree_to_aff_combination (expr, type, comb);
return;
}
}
break;
default: default:
break; break;
} }
...@@ -639,28 +666,10 @@ aff_combination_expand (aff_tree *comb ATTRIBUTE_UNUSED, ...@@ -639,28 +666,10 @@ aff_combination_expand (aff_tree *comb ATTRIBUTE_UNUSED,
exp = XNEW (struct name_expansion); exp = XNEW (struct name_expansion);
exp->in_progress = 1; exp->in_progress = 1;
*slot = exp; *slot = exp;
/* In principle this is a generally valid folding, but rhs = gimple_assign_rhs_to_tree (def);
it is not unconditionally an optimization, so do it if (e != name)
here and not in fold_unary. */ rhs = fold_convert (type, rhs);
/* Convert (T1)(X *+- CST) into (T1)X *+- (T1)CST if T1 is wider
than the type of X and overflow for the type of X is
undefined. */
if (e != name
&& INTEGRAL_TYPE_P (type)
&& INTEGRAL_TYPE_P (TREE_TYPE (name))
&& TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (name))
&& TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (name))
&& (code == PLUS_EXPR || code == MINUS_EXPR || code == MULT_EXPR)
&& TREE_CODE (gimple_assign_rhs2 (def)) == INTEGER_CST)
rhs = fold_build2 (code, type,
fold_convert (type, gimple_assign_rhs1 (def)),
fold_convert (type, gimple_assign_rhs2 (def)));
else
{
rhs = gimple_assign_rhs_to_tree (def);
if (e != name)
rhs = fold_convert (type, rhs);
}
tree_to_aff_combination_expand (rhs, comb->type, &current, cache); tree_to_aff_combination_expand (rhs, comb->type, &current, cache);
exp->expansion = current; exp->expansion = current;
exp->in_progress = 0; exp->in_progress = 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