From 026ea634950c9238107683a84e4d84fb2ba2029b Mon Sep 17 00:00:00 2001 From: rakdver Date: Wed, 16 Aug 2006 21:14:11 +0000 Subject: [PATCH] PR tree-optimization/28364 * tree-ssa-loop-ivopts.c (aff_combination_to_tree): Handle zero correctly. (fold_affine_expr): New function. (may_eliminate_iv): Use fold_affine_expr. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116189 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-ssa-loop-ivopts.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aa17eb1d404..a4b7574b0a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-08-16 Zdenek Dvorak + + PR tree-optimization/28364 + * tree-ssa-loop-ivopts.c (aff_combination_to_tree): Handle zero + correctly. + (fold_affine_expr): New function. + (may_eliminate_iv): Use fold_affine_expr. + 2006-08-16 Volker Reichelt PR c/27489 diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 8a69664ba05..0e8fa94b9d6 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -2917,10 +2917,17 @@ aff_combination_to_tree (struct affine_tree_combination *comb) unsigned i; unsigned HOST_WIDE_INT off, sgn; - /* Handle the special case produced by get_computation_aff when - the type does not fit in HOST_WIDE_INT. */ if (comb->n == 0 && comb->offset == 0) - return fold_convert (type, expr); + { + if (expr) + { + /* Handle the special case produced by get_computation_aff when + the type does not fit in HOST_WIDE_INT. */ + return fold_convert (type, expr); + } + else + return build_int_cst (type, 0); + } gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE); @@ -2943,6 +2950,21 @@ aff_combination_to_tree (struct affine_tree_combination *comb) comb->mask); } +/* Folds EXPR using the affine expressions framework. */ + +static tree +fold_affine_expr (tree expr) +{ + tree type = TREE_TYPE (expr); + struct affine_tree_combination comb; + + if (TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT) + return expr; + + tree_to_aff_combination (expr, type, &comb); + return aff_combination_to_tree (&comb); +} + /* Determines the expression by that USE is expressed from induction variable CAND at statement AT in LOOP. The expression is stored in a decomposed form into AFF. Returns false if USE cannot be expressed using CAND. */ @@ -4029,7 +4051,7 @@ may_eliminate_iv (struct ivopts_data *data, fold_convert (wider_type, nit)))) return false; - *bound = cand_value_at (loop, cand, use->stmt, nit); + *bound = fold_affine_expr (cand_value_at (loop, cand, use->stmt, nit)); return true; } -- 2.11.4.GIT