Commit 9c382ce9 by Sebastian Pop Committed by Sebastian Pop

tree-scalar-evolution.c (instantiate_scev_convert): New.

2009-09-01  Sebastian Pop  <sebastian.pop@amd.com>

	* tree-scalar-evolution.c (instantiate_scev_convert): New.
	(instantiate_scev_1): Move code in instantiate_scev_convert.

From-SVN: r154534
parent 15fda317
2009-09-01 Sebastian Pop <sebastian.pop@amd.com> 2009-09-01 Sebastian Pop <sebastian.pop@amd.com>
* tree-scalar-evolution.c (instantiate_scev_convert): New.
(instantiate_scev_1): Move code in instantiate_scev_convert.
2009-09-01 Sebastian Pop <sebastian.pop@amd.com>
* tree-scalar-evolution.c (instantiate_scev_binary): New. * tree-scalar-evolution.c (instantiate_scev_binary): New.
(instantiate_scev_1): Move code in instantiate_scev_binary. (instantiate_scev_1): Move code in instantiate_scev_binary.
......
...@@ -2254,6 +2254,52 @@ instantiate_scev_binary (basic_block instantiate_below, ...@@ -2254,6 +2254,52 @@ instantiate_scev_binary (basic_block instantiate_below,
/* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
and EVOLUTION_LOOP, that were left under a symbolic form. and EVOLUTION_LOOP, that were left under a symbolic form.
"CHREC" that stands for a convert expression "(TYPE) OP" is to be
instantiated.
CACHE is the cache of already instantiated values.
FOLD_CONVERSIONS should be set to true when the conversions that
may wrap in signed/pointer type are folded, as long as the value of
the chrec is preserved.
SIZE_EXPR is used for computing the size of the expression to be
instantiated, and to stop if it exceeds some limit. */
static tree
instantiate_scev_convert (basic_block instantiate_below,
struct loop *evolution_loop, tree chrec,
tree type, tree op,
bool fold_conversions, htab_t cache, int size_expr)
{
tree op0 = instantiate_scev_1 (instantiate_below, evolution_loop, op,
fold_conversions, cache, size_expr);
if (op0 == chrec_dont_know)
return chrec_dont_know;
if (fold_conversions)
{
tree tmp = chrec_convert_aggressive (type, op0);
if (tmp)
return tmp;
}
if (chrec && op0 == op)
return chrec;
/* If we used chrec_convert_aggressive, we can no longer assume that
signed chrecs do not overflow, as chrec_convert does, so avoid
calling it in that case. */
if (fold_conversions)
return fold_convert (type, op0);
return chrec_convert (type, op0, NULL);
}
/* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
and EVOLUTION_LOOP, that were left under a symbolic form.
CHREC is the scalar evolution to instantiate. CHREC is the scalar evolution to instantiate.
CACHE is the cache of already instantiated values. CACHE is the cache of already instantiated values.
...@@ -2316,29 +2362,9 @@ instantiate_scev_1 (basic_block instantiate_below, ...@@ -2316,29 +2362,9 @@ instantiate_scev_1 (basic_block instantiate_below,
fold_conversions, cache, size_expr); fold_conversions, cache, size_expr);
CASE_CONVERT: CASE_CONVERT:
op0 = instantiate_scev_1 (instantiate_below, evolution_loop, return instantiate_scev_convert (instantiate_below, evolution_loop, chrec,
TREE_OPERAND (chrec, 0), TREE_TYPE (chrec), TREE_OPERAND (chrec, 0),
fold_conversions, cache, size_expr); fold_conversions, cache, size_expr);
if (op0 == chrec_dont_know)
return chrec_dont_know;
if (fold_conversions)
{
tree tmp = chrec_convert_aggressive (TREE_TYPE (chrec), op0);
if (tmp)
return tmp;
}
if (op0 == TREE_OPERAND (chrec, 0))
return chrec;
/* If we used chrec_convert_aggressive, we can no longer assume that
signed chrecs do not overflow, as chrec_convert does, so avoid
calling it in that case. */
if (fold_conversions)
return fold_convert (TREE_TYPE (chrec), op0);
return chrec_convert (TREE_TYPE (chrec), op0, NULL);
case BIT_NOT_EXPR: case BIT_NOT_EXPR:
/* Handle ~X as -1 - X. */ /* Handle ~X as -1 - X. */
......
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