diff options
author | Sebastian Pop <pop@cri.ensmp.fr> | 2006-03-29 19:20:24 +0200 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2006-03-29 17:20:24 +0000 |
commit | d31db22f5b4a269286dec288544fb805094152ee (patch) | |
tree | f95f0379758e57b77344bcc50747b34e607c07ba /gcc/tree-ssa-loop-niter.c | |
parent | 67f074899d00a173c0efbca542cc8defb76ce790 (diff) | |
download | gcc-d31db22f5b4a269286dec288544fb805094152ee.zip gcc-d31db22f5b4a269286dec288544fb805094152ee.tar.gz gcc-d31db22f5b4a269286dec288544fb805094152ee.tar.bz2 |
re PR tree-optimization/26859 (ICE Segmentation Fault)
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.
From-SVN: r112502
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 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. */ |