On Mon, Oct 23, 2017 at 1:25 PM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> alias.c:find_base_term and find_base_value checked:
>
>       if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
>
> but (a) comparing the precision seems more correct, since it's possible
> for modes to have the same memory size as Pmode but fewer bits and
> (b) the functions are called on arbitrary rtl, so there's no guarantee
> that we're handling an integer truncation.
>
> Since there's no point processing truncations of anything other than an
> integer, this patch checks that first.

Ok.

Richard.

>
> 2017-10-23  Richard Sandiford  <richard.sandif...@linaro.org>
>             Alan Hayward  <alan.hayw...@arm.com>
>             David Sherwood  <david.sherw...@arm.com>
>
> gcc/
>         * alias.c (find_base_value, find_base_term): Only process integer
>         truncations.  Check the precision rather than the size.
>
> Index: gcc/alias.c
> ===================================================================
> --- gcc/alias.c 2017-10-23 11:41:25.511925516 +0100
> +++ gcc/alias.c 2017-10-23 11:44:27.544693078 +0100
> @@ -1349,6 +1349,7 @@ known_base_value_p (rtx x)
>  find_base_value (rtx src)
>  {
>    unsigned int regno;
> +  scalar_int_mode int_mode;
>
>  #if defined (FIND_BASE_TERM)
>    /* Try machine-dependent ways to find the base term.  */
> @@ -1475,7 +1476,8 @@ find_base_value (rtx src)
>          address modes depending on the address space.  */
>        if (!target_default_pointer_address_modes_p ())
>         break;
> -      if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
> +      if (!is_a <scalar_int_mode> (GET_MODE (src), &int_mode)
> +         || GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
>         break;
>        /* Fall through.  */
>      case HIGH:
> @@ -1876,6 +1878,7 @@ find_base_term (rtx x)
>    cselib_val *val;
>    struct elt_loc_list *l, *f;
>    rtx ret;
> +  scalar_int_mode int_mode;
>
>  #if defined (FIND_BASE_TERM)
>    /* Try machine-dependent ways to find the base term.  */
> @@ -1893,7 +1896,8 @@ find_base_term (rtx x)
>          address modes depending on the address space.  */
>        if (!target_default_pointer_address_modes_p ())
>         return 0;
> -      if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (Pmode))
> +      if (!is_a <scalar_int_mode> (GET_MODE (x), &int_mode)
> +         || GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
>         return 0;
>        /* Fall through.  */
>      case HIGH:

Reply via email to