aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-niter.c
diff options
context:
space:
mode:
authorSebastian Pop <pop@cri.ensmp.fr>2006-03-29 19:20:24 +0200
committerSebastian Pop <spop@gcc.gnu.org>2006-03-29 17:20:24 +0000
commitd31db22f5b4a269286dec288544fb805094152ee (patch)
treef95f0379758e57b77344bcc50747b34e607c07ba /gcc/tree-ssa-loop-niter.c
parent67f074899d00a173c0efbca542cc8defb76ce790 (diff)
downloadgcc-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.c26
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. */