tree-vrp.c (extract_range_from_unary_expr_1): Implement -X as 0 - X.

2011-08-12  Richard Guenther  <rguenther@suse.de>

	* tree-vrp.c (extract_range_from_unary_expr_1): Implement
	-X as 0 - X.

From-SVN: r177693
This commit is contained in:
Richard Biener 2011-08-12 11:29:01 +00:00
parent 6aeb8c9919
commit d9fbc86e44
2 changed files with 13 additions and 61 deletions

View File

@ -1,4 +1,9 @@
2011-08-02 Romain Geissler <romain.geissler@gmail.com>
2011-08-12 Richard Guenther <rguenther@suse.de>
* tree-vrp.c (extract_range_from_unary_expr_1): Implement
-X as 0 - X.
2011-08-12 Romain Geissler <romain.geissler@gmail.com>
* Makefile.in (PLUGIN_HEADERS): Add C_TREE_H.

View File

@ -2946,67 +2946,14 @@ extract_range_from_unary_expr_1 (value_range_t *vr,
/* Apply the operation to each end of the range and see what we end
up with. */
if (code == NEGATE_EXPR
&& !TYPE_UNSIGNED (type))
if (code == NEGATE_EXPR)
{
/* NEGATE_EXPR flips the range around. We need to treat
TYPE_MIN_VALUE specially. */
if (is_positive_overflow_infinity (vr0.max))
min = negative_overflow_infinity (type);
else if (is_negative_overflow_infinity (vr0.max))
min = positive_overflow_infinity (type);
else if (!vrp_val_is_min (vr0.max))
min = fold_unary_to_constant (code, type, vr0.max);
else if (needs_overflow_infinity (type))
{
if (supports_overflow_infinity (type)
&& !is_overflow_infinity (vr0.min)
&& !vrp_val_is_min (vr0.min))
min = positive_overflow_infinity (type);
else
{
set_value_range_to_varying (vr);
return;
}
}
else
min = TYPE_MIN_VALUE (type);
if (is_positive_overflow_infinity (vr0.min))
max = negative_overflow_infinity (type);
else if (is_negative_overflow_infinity (vr0.min))
max = positive_overflow_infinity (type);
else if (!vrp_val_is_min (vr0.min))
max = fold_unary_to_constant (code, type, vr0.min);
else if (needs_overflow_infinity (type))
{
if (supports_overflow_infinity (type))
max = positive_overflow_infinity (type);
else
{
set_value_range_to_varying (vr);
return;
}
}
else
max = TYPE_MIN_VALUE (type);
}
else if (code == NEGATE_EXPR
&& TYPE_UNSIGNED (type))
{
if (!range_includes_zero_p (&vr0))
{
max = fold_unary_to_constant (code, type, vr0.min);
min = fold_unary_to_constant (code, type, vr0.max);
}
else
{
if (range_is_null (&vr0))
set_value_range_to_null (vr, type);
else
set_value_range_to_varying (vr);
return;
}
/* -X is simply 0 - X, so re-use existing code that also handles
anti-ranges fine. */
value_range_t zero = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
set_value_range_to_value (&zero, build_int_cst (type, 0), NULL);
extract_range_from_binary_expr_1 (vr, MINUS_EXPR, type, &zero, &vr0);
return;
}
else if (code == ABS_EXPR
&& !TYPE_UNSIGNED (type))