+2006-08-16 Zdenek Dvorak <dvorakz@suse.cz>
+
+ 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 <reichelt@igpm.rwth-aachen.de>
PR c/27489
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);
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. */
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;
}