On Thu, Feb 05, 2015 at 12:33:18AM +0100, Matthias Klose wrote:
> On 01/15/2015 06:23 PM, Martin Liška wrote:
> > Hello.
> > 
> > This is Honsa's patch that I've just tested on x86_64-linux-pc. The patch is
> > preapproved by Honza
> > and is going to be installed.
> 
> backporting the fix for PR63970 introduced PR64938.  Backporting this patch as
> well fixes the ICE reported in PR64938.  Honza approved the backport on IRC.

How can an aarch64 patch fix an arm PR64938 issue?

> # DP: Proposed fix for PR target/64893 (AArch64)
> 
> commit 455a54f36a205af281b3fe8dbc97916ede704ca8
> Author: Andrew Pinski <apin...@cavium.com>
> Date:   Mon Feb 2 18:40:08 2015 +0000
> 
>     Fix bug 64893: ICE with vget_lane_u32 with C++ front-end
>     
>       PR target/64893
>             * config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins):
>             Change the first argument type to size_type_node and add another
>             size_type_node.
>             (aarch64_simd_expand_builtin): Handle the new argument to
>             AARCH64_SIMD_BUILTIN_LANE_CHECK and don't ICE but rather
>             print sorry out when the first two arguments are not
>             integer constants.
>             * config/aarch64/arm_neon.h (__AARCH64_LANE_CHECK):
>             Pass the sizeof directly to __builtin_aarch64_im_lane_boundsi.
>             * testsuite/c-c++-common/torture/aarch64-vect-lane-1.c: New 
> testcase.
> 
> --- a/src/gcc/config/aarch64/aarch64-builtins.c
> +++ b/src/gcc/config/aarch64/aarch64-builtins.c
> @@ -712,7 +712,8 @@ aarch64_init_simd_builtins (void)
>    aarch64_init_simd_builtin_scalar_types ();
>   
>    tree lane_check_fpr = build_function_type_list (void_type_node,
> -                                               intSI_type_node,
> +                                               size_type_node,
> +                                               size_type_node,
>                                                 intSI_type_node,
>                                                 NULL);
>    aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_LANE_CHECK] =
> @@ -1001,13 +1002,18 @@ aarch64_simd_expand_builtin (int fcode, tree exp, rtx 
> target)
>  {
>    if (fcode == AARCH64_SIMD_BUILTIN_LANE_CHECK)
>      {
> -      tree nlanes = CALL_EXPR_ARG (exp, 0);
> -      gcc_assert (TREE_CODE (nlanes) == INTEGER_CST);
> -      rtx lane_idx = expand_normal (CALL_EXPR_ARG (exp, 1));
> -      if (CONST_INT_P (lane_idx))
> -     aarch64_simd_lane_bounds (lane_idx, 0, TREE_INT_CST_LOW (nlanes), exp);
> +      rtx totalsize = expand_normal (CALL_EXPR_ARG (exp, 0));
> +      rtx elementsize = expand_normal (CALL_EXPR_ARG (exp, 1));
> +      if (CONST_INT_P (totalsize) && CONST_INT_P (elementsize))
> +     {
> +       rtx lane_idx = expand_normal (CALL_EXPR_ARG (exp, 2));
> +          if (CONST_INT_P (lane_idx))
> +         aarch64_simd_lane_bounds (lane_idx, 0, UINTVAL (totalsize)/UINTVAL 
> (elementsize), exp);
> +          else
> +         error ("%Klane index must be a constant immediate", exp);
> +     }
>        else
> -     error ("%Klane index must be a constant immediate", exp);
> +     sorry ("%Ktotal size and element size must be a constant immediate", 
> exp);
>        /* Don't generate any RTL.  */
>        return const0_rtx;
>      }
> --- a/src/gcc/config/aarch64/arm_neon.h
> +++ b/src/gcc/config/aarch64/arm_neon.h
> @@ -541,7 +541,7 @@ typedef struct poly16x8x4_t
>  
>  #define __AARCH64_NUM_LANES(__v) (sizeof (__v) / sizeof (__v[0]))
>  #define __AARCH64_LANE_CHECK(__vec, __idx)   \
> -     __builtin_aarch64_im_lane_boundsi (__AARCH64_NUM_LANES (__vec), __idx)
> +     __builtin_aarch64_im_lane_boundsi (sizeof(__vec), sizeof(__vec[0]), 
> __idx)
>  
>  /* For big-endian, GCC's vector indices are the opposite way around
>     to the architectural lane indices used by Neon intrinsics.  */
> --- /dev/null
> +++ b/src/gcc/testsuite/c-c++-common/torture/aarch64-vect-lane-1.c
> @@ -0,0 +1,8 @@
> +// { dg-do compile { target "aarch64*-*-*" } }
> +#include <arm_neon.h>
> +int
> +search_line_fast (uint32x2_t t)
> +{
> +  return vget_lane_u32 (t, 0);
> +}
> +


        Jakub

Reply via email to