From: Richard Sandiford Date: Fri, 22 Sep 2017 17:00:56 +0000 (+0000) Subject: range_int_cst_p handling in extract_range_from_binary_expr_1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=597fdf45ede583ca1e88ce9f2923673b1238cdf8;p=gcc.git range_int_cst_p handling in extract_range_from_binary_expr_1 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. 2017-09-22 Richard Sandiford Alan Hayward David Sherwood gcc/ * tree-vrp.c (extract_range_from_multiplicative_op_1): Assert for VR_RANGE only; don't allow VR_ANTI_RANGE. (extract_range_from_binary_expr_1): Don't call extract_range_from_multiplicative_op_1 if !range_int_cst_p. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r253102 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e29256106b2..fdb7221848c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-09-22 Richard Sandiford + Alan Hayward + David Sherwood + + * tree-vrp.c (extract_range_from_multiplicative_op_1): Assert + for VR_RANGE only; don't allow VR_ANTI_RANGE. + (extract_range_from_binary_expr_1): Don't call + extract_range_from_multiplicative_op_1 if !range_int_cst_p. + 2017-09-22 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index aef20f4e8a5..3dba3562789 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1851,8 +1851,7 @@ extract_range_from_multiplicative_op_1 (value_range *vr, || code == ROUND_DIV_EXPR || code == RSHIFT_EXPR || code == LSHIFT_EXPR); - gcc_assert ((vr0->type == VR_RANGE - || (code == MULT_EXPR && vr0->type == VR_ANTI_RANGE)) + gcc_assert (vr0->type == VR_RANGE && vr0->type == vr1->type); rtype = vr0->type; @@ -2462,9 +2461,14 @@ extract_range_from_binary_expr_1 (value_range *vr, 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