Commit 622d360e by Richard Guenther Committed by Richard Biener

re PR tree-optimization/43949 (bogus warning: array subscript is above array bounds)

2010-05-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/43949
	* tree-vrp.c (extract_range_from_binary_expr): Only handle
	TRUNC_MOD_EXPR.

From-SVN: r159020
parent f857e9a4
2010-05-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43949
* tree-vrp.c (extract_range_from_binary_expr): Only handle
TRUNC_MOD_EXPR.
2010-04-26 Jason Merrill <jason@redhat.com> 2010-04-26 Jason Merrill <jason@redhat.com>
* c.opt (-fstrict-enums): New. * c.opt (-fstrict-enums): New.
......
...@@ -2084,9 +2084,6 @@ extract_range_from_binary_expr (value_range_t *vr, ...@@ -2084,9 +2084,6 @@ extract_range_from_binary_expr (value_range_t *vr,
&& code != EXACT_DIV_EXPR && code != EXACT_DIV_EXPR
&& code != ROUND_DIV_EXPR && code != ROUND_DIV_EXPR
&& code != TRUNC_MOD_EXPR && code != TRUNC_MOD_EXPR
&& code != FLOOR_MOD_EXPR
&& code != CEIL_MOD_EXPR
&& code != ROUND_MOD_EXPR
&& code != RSHIFT_EXPR && code != RSHIFT_EXPR
&& code != MIN_EXPR && code != MIN_EXPR
&& code != MAX_EXPR && code != MAX_EXPR
...@@ -2156,9 +2153,6 @@ extract_range_from_binary_expr (value_range_t *vr, ...@@ -2156,9 +2153,6 @@ extract_range_from_binary_expr (value_range_t *vr,
&& code != EXACT_DIV_EXPR && code != EXACT_DIV_EXPR
&& code != ROUND_DIV_EXPR && code != ROUND_DIV_EXPR
&& code != TRUNC_MOD_EXPR && code != TRUNC_MOD_EXPR
&& code != FLOOR_MOD_EXPR
&& code != CEIL_MOD_EXPR
&& code != ROUND_MOD_EXPR
&& (vr0.type == VR_VARYING && (vr0.type == VR_VARYING
|| vr1.type == VR_VARYING || vr1.type == VR_VARYING
|| vr0.type != vr1.type || vr0.type != vr1.type
...@@ -2509,27 +2503,30 @@ extract_range_from_binary_expr (value_range_t *vr, ...@@ -2509,27 +2503,30 @@ extract_range_from_binary_expr (value_range_t *vr,
} }
} }
} }
else if (code == TRUNC_MOD_EXPR else if (code == TRUNC_MOD_EXPR)
|| code == FLOOR_MOD_EXPR
|| code == CEIL_MOD_EXPR
|| code == ROUND_MOD_EXPR)
{ {
bool sop = false; bool sop = false;
if (vr0.type == VR_ANTI_RANGE if (vr1.type != VR_RANGE
|| vr1.type != VR_RANGE
|| symbolic_range_p (&vr1) || symbolic_range_p (&vr1)
|| range_includes_zero_p (&vr1)) || range_includes_zero_p (&vr1)
|| vrp_val_is_min (vr1.min))
{ {
set_value_range_to_varying (vr); set_value_range_to_varying (vr);
return; return;
} }
type = VR_RANGE; type = VR_RANGE;
max = int_const_binop (MINUS_EXPR, vr1.max, integer_one_node, 0); /* Compute MAX <|vr1.min|, |vr1.max|> - 1. */
if (vrp_expr_computes_nonnegative (op0, &sop) max = fold_unary_to_constant (ABS_EXPR, TREE_TYPE (vr1.min), vr1.min);
&& vrp_expr_computes_nonnegative (op1, &sop) && !sop) if (tree_int_cst_lt (max, vr1.max))
min = build_int_cst (TREE_TYPE (vr1.max), 0); max = vr1.max;
max = int_const_binop (MINUS_EXPR, max, integer_one_node, 0);
/* If the dividend is non-negative the modulus will be
non-negative as well. */
if (TYPE_UNSIGNED (TREE_TYPE (max))
|| (vrp_expr_computes_nonnegative (op0, &sop) && !sop))
min = build_int_cst (TREE_TYPE (max), 0);
else else
min = fold_unary (NEGATE_EXPR, TREE_TYPE (max), max); min = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (max), max);
} }
else if (code == MINUS_EXPR) else if (code == MINUS_EXPR)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment