From: Sebastian Pop Date: Wed, 29 Mar 2006 17:20:24 +0000 (+0200) Subject: re PR tree-optimization/26859 (ICE Segmentation Fault) X-Git-Tag: releases/gcc-4.2.0~3513 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d31db22f5b4a269286dec288544fb805094152ee;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19e54d9a25dc..274c94d059b0 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 f7319b2a425e..364c61041fc5 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. */