From 99e833c306340198942f3794915b98f02ae85b47 Mon Sep 17 00:00:00 2001 From: rakdver Date: Sun, 6 Feb 2005 18:48:58 +0000 Subject: [PATCH] * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add unnecessary cast to original induction variable increments. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94681 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/tree-ssa-loop-ivopts.c | 27 ++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83c0ed5..a498661 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 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 * tree-ssa-loop-ivopts.c (get_computation_at): Produce computations in distributed form. diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 05f4a8d..b5f693e 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: -- 2.7.4