From: spop Date: Wed, 29 Mar 2006 17:20:24 +0000 (+0000) Subject: PR tree-optimization/26859 X-Git-Tag: upstream/4.9.2~55173 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=96710944f937f37eaa4b5ba06880f607acafbe59;p=platform%2Fupstream%2Flinaro-gcc.git PR tree-optimization/26859 * tree-ssa-loop-niter.c (infer_loop_bounds_from_undefined): Avoid division by zero. (convert_step): Remove TREE_OVERFLOW and TREE_CONSTANT_OVERFLOW flags for the step after fold_convert. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112502 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19e54d9..274c94d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-03-29 Sebastian Pop + + PR tree-optimization/26859 + * tree-ssa-loop-niter.c (infer_loop_bounds_from_undefined): Avoid + division by zero. + (convert_step): Remove TREE_OVERFLOW and TREE_CONSTANT_OVERFLOW flags + for the step after fold_convert. + 2006-03-29 Paul Brook * reload1.c (choose_reload_regs): Check for all RTX_AUTOINC operators. diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index f7319b2..364c610 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -1582,9 +1582,13 @@ infer_loop_bounds_from_undefined (struct loop *loop) diff = fold_build2 (MINUS_EXPR, utype, TYPE_MAX_VALUE (type), init); - estimation = fold_build2 (CEIL_DIV_EXPR, utype, diff, - step); - record_estimate (loop, estimation, boolean_true_node, stmt); + if (!integer_zerop (step)) + { + estimation = fold_build2 (CEIL_DIV_EXPR, utype, diff, + step); + record_estimate (loop, estimation, boolean_true_node, + stmt); + } } break; @@ -2090,7 +2094,7 @@ tree convert_step (struct loop *loop, tree new_type, tree base, tree step, tree at_stmt) { - tree base_type; + tree res, base_type; if (chrec_contains_undetermined (base) || chrec_contains_undetermined (step)) @@ -2100,12 +2104,22 @@ convert_step (struct loop *loop, tree new_type, tree base, tree step, /* When not using wrapping arithmetic, signed types don't wrap. */ if (!flag_wrapv && !TYPE_UNSIGNED (base_type)) - return fold_convert (new_type, step); + goto do_convert_step; if (TYPE_PRECISION (new_type) > TYPE_PRECISION (base_type)) return convert_step_widening (loop, new_type, base, step, at_stmt); - return fold_convert (new_type, step); + do_convert_step: + + res = fold_convert (new_type, step); + + if (TREE_CODE (res) == INTEGER_CST) + { + TREE_OVERFLOW (res) = 0; + TREE_CONSTANT_OVERFLOW (res) = 0; + } + + return res; } /* Frees the information on upper bounds on numbers of iterations of LOOP. */