From: Zdenek Dvorak Date: Sun, 6 Feb 2005 18:48:58 +0000 (+0100) Subject: tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add unnecessary cast... X-Git-Tag: releases/gcc-4.0.0~1055 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3520b7452c46c56f64697dcdad55160cdf947d39;p=thirdparty%2Fgcc.git tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add unnecessary cast to original induction variable increments. * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add unnecessary cast to original induction variable increments. From-SVN: r94681 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83c0ed5836e6..a49866179963 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-02-06 Zdenek Dvorak + + * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add + unnecessary cast to original induction variable increments. + 2005-02-06 Zdenek Dvorak PR tree-optimization/18219 diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 05f4a8da7bbd..b5f693e4c9d0 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -4542,11 +4542,32 @@ static void rewrite_use_nonlinear_expr (struct ivopts_data *data, struct iv_use *use, struct iv_cand *cand) { - tree comp = unshare_expr (get_computation (data->current_loop, - use, cand)); + tree comp; tree op, stmts, tgt, ass; block_stmt_iterator bsi, pbsi; - + + /* An important special case -- if we are asked to express value of + the original iv by itself, just exit; there is no need to + 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) + { + op = TREE_OPERAND (use->stmt, 1); + + /* 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) + return; + } + + comp = unshare_expr (get_computation (data->current_loop, + use, cand)); switch (TREE_CODE (use->stmt)) { case PHI_NODE: