re PR tree-optimization/22438 (ICE SEGV in is_gimple_variable at tree-gimple.c:239)

PR tree-optimization/22438
	* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Handle all
	preserved iv rhs rewriting specially.

From-SVN: r104522
This commit is contained in:
Zdenek Dvorak 2005-09-22 13:24:00 +02:00 committed by Zdenek Dvorak
parent ccdeca37fe
commit 7b9d4f7084
2 changed files with 53 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2005-09-21 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/22438
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Handle all
preserved iv rhs rewriting specially.
2005-09-21 Daniel Berlin <dberlin@dberlin.org>
* tree-data-ref.c (analyze_array_indexes): Only estimate when

View File

@ -5331,22 +5331,58 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
introduce a new computation (that might also need casting the
variable to unsigned and back). */
if (cand->pos == IP_ORIGINAL
&& TREE_CODE (use->stmt) == MODIFY_EXPR
&& TREE_OPERAND (use->stmt, 0) == cand->var_after)
&& cand->incremented_at == use->stmt)
{
tree step, ctype, utype;
enum tree_code incr_code = PLUS_EXPR;
gcc_assert (TREE_CODE (use->stmt) == MODIFY_EXPR);
gcc_assert (TREE_OPERAND (use->stmt, 0) == cand->var_after);
step = cand->iv->step;
ctype = TREE_TYPE (step);
utype = TREE_TYPE (cand->var_after);
if (TREE_CODE (step) == NEGATE_EXPR)
{
incr_code = MINUS_EXPR;
step = TREE_OPERAND (step, 0);
}
/* Check whether we may leave the computation unchanged.
This is the case only if it does not rely on other
computations in the loop -- otherwise, the computation
we rely upon may be removed in remove_unused_ivs,
thus leading to ICE. */
op = TREE_OPERAND (use->stmt, 1);
if (TREE_CODE (op) == PLUS_EXPR
|| TREE_CODE (op) == MINUS_EXPR)
{
if (TREE_OPERAND (op, 0) == cand->var_before)
op = TREE_OPERAND (op, 1);
else if (TREE_CODE (op) == PLUS_EXPR
&& TREE_OPERAND (op, 1) == cand->var_before)
op = TREE_OPERAND (op, 0);
else
op = NULL_TREE;
}
else
op = NULL_TREE;
/* Be a bit careful. In case variable is expressed in some
complicated way, rewrite it so that we may get rid of this
complicated expression. */
if ((TREE_CODE (op) == PLUS_EXPR
|| TREE_CODE (op) == MINUS_EXPR)
&& TREE_OPERAND (op, 0) == cand->var_before
&& TREE_CODE (TREE_OPERAND (op, 1)) == INTEGER_CST)
if (op
&& (TREE_CODE (op) == INTEGER_CST
|| operand_equal_p (op, step, 0)))
return;
}
comp = get_computation (data->current_loop, use, cand);
/* Otherwise, add the necessary computations to express
the iv. */
op = fold_convert (ctype, cand->var_before);
comp = fold_convert (utype,
build2 (incr_code, ctype, op,
unshare_expr (step)));
}
else
comp = get_computation (data->current_loop, use, cand);
switch (TREE_CODE (use->stmt))
{
case PHI_NODE: