range_int_cst_p handling in extract_range_from_binary_expr_1
Richard Sandiford
richard.sandiford@linaro.org
Wed Sep 20 12:06:00 GMT 2017
extract_range_from_binary_expr_1 had:
if (range_int_cst_p (&vr0)
&& range_int_cst_p (&vr1)
&& TYPE_OVERFLOW_WRAPS (expr_type))
...
...
extract_range_from_multiplicative_op_1 (vr, code, &vr0, &vr1);
but extract_range_from_multiplicative_op_1 also requires range_int_cst_p.
I think we should bail out if either range isn't a constant.
This might only be theoretical with current sources, but it's needed
once polynomial constants are added.
Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linus-gnu.
OK to install?
Richard
2017-09-20 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* tree-vrp.c (extract_range_from_binary_expr_1): Don't call
extract_range_from_multiplicative_op_1 if !range_int_cst_p.
Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c 2017-08-30 12:18:46.631541422 +0100
+++ gcc/tree-vrp.c 2017-09-20 13:04:20.397027078 +0100
@@ -2462,9 +2462,14 @@ extract_range_from_binary_expr_1 (value_
signop sign = TYPE_SIGN (expr_type);
unsigned int prec = TYPE_PRECISION (expr_type);
- if (range_int_cst_p (&vr0)
- && range_int_cst_p (&vr1)
- && TYPE_OVERFLOW_WRAPS (expr_type))
+ if (!range_int_cst_p (&vr0)
+ || !range_int_cst_p (&vr1))
+ {
+ set_value_range_to_varying (vr);
+ return;
+ }
+
+ if (TYPE_OVERFLOW_WRAPS (expr_type))
{
typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION * 2) vrp_int;
typedef generic_wide_int
More information about the Gcc-patches
mailing list