diff options
author | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-29 17:20:24 +0000 |
---|---|---|
committer | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-29 17:20:24 +0000 |
commit | 96710944f937f37eaa4b5ba06880f607acafbe59 (patch) | |
tree | f95f0379758e57b77344bcc50747b34e607c07ba /gcc/tree-ssa-loop-niter.c | |
parent | f5bccbd106b8a46be84733f7cb7a0edfd753fb7e (diff) | |
download | gcc-96710944f937f37eaa4b5ba06880f607acafbe59.tar.gz |
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
Diffstat (limited to 'gcc/tree-ssa-loop-niter.c')
-rw-r--r-- | gcc/tree-ssa-loop-niter.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index f7319b2a425..364c61041fc 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. */ |