On Wed, Sep 20, 2017 at 2:06 PM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> 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?

extract_range_from_multiplicative_op_1 also allows anti-ranges but indeed
requires INTEGER_CSTs.  Note it won't get anti-ranges because we handle
this case by ranges_from_anti_range.

Thus ok if you also remove the apparent anti-range handling from
extract_range_from_multiplicative_op_1 (in the assert).

Thanks,
Richard.

> Richard
>
>
> 2017-09-20  Richard Sandiford  <richard.sandif...@linaro.org>
>             Alan Hayward  <alan.hayw...@arm.com>
>             David Sherwood  <david.sherw...@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

Reply via email to