On Thu, Jan 4, 2018 at 11:06 AM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> The first BIT_FIELD_REF folding pattern assumed without checking that
> operands satisfy tree_fits_uhwi_p.  The second pattern does check this:
>
>       /* On constants we can use native encode/interpret to constant
>          fold (nearly) all BIT_FIELD_REFs.  */
>       if (CONSTANT_CLASS_P (arg0)
>           && can_native_interpret_type_p (type)
>           && BITS_PER_UNIT == 8
>           && tree_fits_uhwi_p (op1)
>           && tree_fits_uhwi_p (op2))
>
> so this patch adds the checks to the first pattern too.  This is needed
> for POLY_INT_CST bit positions.
>
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
> Also tested by comparing the before and after assembly output for at
> least one target per CPU directory.  OK to install?

Ok.  It's of course because verify_expr verified that.

Richard.

> Richard
>
>
> 2018-01-04  Richard Sandiford  <richard.sandif...@linaro.org>
>
> gcc/
>         * fold-const.c (fold_ternary_loc): Check tree_fits_uhwi_p before
>         using tree_to_uhwi.
>
> Index: gcc/fold-const.c
> ===================================================================
> --- gcc/fold-const.c    2018-01-03 21:42:34.349039784 +0000
> +++ gcc/fold-const.c    2018-01-04 10:06:02.165809202 +0000
> @@ -11643,7 +11643,9 @@ fold_ternary_loc (location_t loc, enum t
>        if (TREE_CODE (arg0) == VECTOR_CST
>           && (type == TREE_TYPE (TREE_TYPE (arg0))
>               || (TREE_CODE (type) == VECTOR_TYPE
> -                 && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0)))))
> +                 && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0))))
> +         && tree_fits_uhwi_p (op1)
> +         && tree_fits_uhwi_p (op2))
>         {
>           tree eltype = TREE_TYPE (TREE_TYPE (arg0));
>           unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));

Reply via email to