Commit 7b9d4f70 by Zdenek Dvorak Committed by Zdenek Dvorak

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
parent ccdeca37
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> 2005-09-21 Daniel Berlin <dberlin@dberlin.org>
* tree-data-ref.c (analyze_array_indexes): Only estimate when * tree-data-ref.c (analyze_array_indexes): Only estimate when
......
...@@ -5331,22 +5331,58 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data, ...@@ -5331,22 +5331,58 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
introduce a new computation (that might also need casting the introduce a new computation (that might also need casting the
variable to unsigned and back). */ variable to unsigned and back). */
if (cand->pos == IP_ORIGINAL if (cand->pos == IP_ORIGINAL
&& TREE_CODE (use->stmt) == MODIFY_EXPR && cand->incremented_at == use->stmt)
&& TREE_OPERAND (use->stmt, 0) == cand->var_after)
{ {
op = TREE_OPERAND (use->stmt, 1); 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);
}
/* Be a bit careful. In case variable is expressed in some /* Check whether we may leave the computation unchanged.
complicated way, rewrite it so that we may get rid of this This is the case only if it does not rely on other
complicated expression. */ computations in the loop -- otherwise, the computation
if ((TREE_CODE (op) == PLUS_EXPR 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) || TREE_CODE (op) == MINUS_EXPR)
&& TREE_OPERAND (op, 0) == cand->var_before {
&& TREE_CODE (TREE_OPERAND (op, 1)) == INTEGER_CST) if (TREE_OPERAND (op, 0) == cand->var_before)
return; 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;
if (op
&& (TREE_CODE (op) == INTEGER_CST
|| operand_equal_p (op, step, 0)))
return;
/* 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); comp = get_computation (data->current_loop, use, cand);
switch (TREE_CODE (use->stmt)) switch (TREE_CODE (use->stmt))
{ {
case PHI_NODE: case PHI_NODE:
......
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