[PATCH] PR tree-optimization/90681 Fix ICE in vect_slp_analyze_node_operations_1

Richard Sandiford richard.sandiford@arm.com
Fri May 31 19:06:00 GMT 2019


Alejandro Martinez Vicente <Alejandro.MartinezVicente@arm.com> writes:
> Hi,
>
> This patch fixes bug 90681.  It was caused by trying to SLP vectorize a non
> grouped load.  We've fixed it by tweaking a bit the implementation: mark
> masked loads as not vectorizable, but support them as an special case.  Then
> the detect them in the test for normal non-grouped loads that was already
> there.
>
> The bug reproducer now works and the performance test we added is still happy.
>
> Alejandro
>
> gcc/ChangeLog:
>
> 2019-05-31  Alejandro Martinez  <alejandro.martinezvicente@arm.com>
>
> 	PR tree-optimization/90681
> 	* internal-fn.c (mask_load_direct): Mark as non-vectorizable again.
> 	* tree-vect-slp.c (vect_build_slp_tree_1): Add masked loads as a
> 	special case for SLP, but fail on non-grouped loads.
>
>
> 2019-05-31  Alejandro Martinez  <alejandro.martinezvicente@arm.com>
>
> gcc/testsuite/
>
> 	PR tree-optimization/90681
> 	* gfortran.dg/vect/pr90681.f: Bug reproducer.

OK, thanks.

Richard

> diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
> index 3051a7a..04081f3 100644
> --- a/gcc/internal-fn.c
> +++ b/gcc/internal-fn.c
> @@ -100,7 +100,7 @@ init_internal_fns ()
>  /* Create static initializers for the information returned by
>     direct_internal_fn.  */
>  #define not_direct { -2, -2, false }
> -#define mask_load_direct { -1, 2, true }
> +#define mask_load_direct { -1, 2, false }
>  #define load_lanes_direct { -1, -1, false }
>  #define mask_load_lanes_direct { -1, -1, false }
>  #define gather_load_direct { -1, -1, false }
> diff --git a/gcc/testsuite/gfortran.dg/vect/pr90681.f b/gcc/testsuite/gfortran.dg/vect/pr90681.f
> new file mode 100644
> index 0000000..03d3987
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/vect/pr90681.f
> @@ -0,0 +1,13 @@
> +C { dg-do compile }
> +C { dg-additional-options "-march=armv8.2-a+sve" { target { aarch64*-*-* } } }
> +      SUBROUTINE HMU (H1)
> +      COMMON DD(107)
> +      DIMENSION H1(NORBS,*)
> +            DO 70 J1 = IA,I1
> +               H1(I1,J1) = 0
> +               JO1 = J1
> +               IF (JO1.EQ.1) THEN
> +                   H1(I1,J1) = DD(NI)
> +               END IF
> +   70       CONTINUE
> +      END
> diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
> index 884db33..23a8a20 100644
> --- a/gcc/tree-vect-slp.c
> +++ b/gcc/tree-vect-slp.c
> @@ -661,6 +661,7 @@ vect_build_slp_tree_1 (unsigned char *swap,
>    machine_mode optab_op2_mode;
>    machine_mode vec_mode;
>    stmt_vec_info first_load = NULL, prev_first_load = NULL;
> +  bool load_p = false;
>  
>    /* For every stmt in NODE find its def stmt/s.  */
>    stmt_vec_info stmt_info;
> @@ -714,7 +715,10 @@ vect_build_slp_tree_1 (unsigned char *swap,
>        if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
>  	{
>  	  rhs_code = CALL_EXPR;
> -	  if ((gimple_call_internal_p (call_stmt)
> +
> +	  if (gimple_call_internal_p (stmt, IFN_MASK_LOAD))
> +	    load_p = true;
> +	  else if ((gimple_call_internal_p (call_stmt)
>  	       && (!vectorizable_internal_fn_p
>  		   (gimple_call_internal_fn (call_stmt))))
>  	      || gimple_call_tail_p (call_stmt)
> @@ -732,7 +736,10 @@ vect_build_slp_tree_1 (unsigned char *swap,
>  	    }
>  	}
>        else
> -	rhs_code = gimple_assign_rhs_code (stmt);
> +	{
> +	  rhs_code = gimple_assign_rhs_code (stmt);
> +	  load_p = TREE_CODE_CLASS (rhs_code) == tcc_reference;
> +	}
>  
>        /* Check the operation.  */
>        if (i == 0)
> @@ -899,7 +906,7 @@ vect_build_slp_tree_1 (unsigned char *swap,
>          } /* Grouped access.  */
>        else
>  	{
> -	  if (TREE_CODE_CLASS (rhs_code) == tcc_reference)
> +	  if (load_p)
>  	    {
>  	      /* Not grouped load.  */
>  	      if (dump_enabled_p ())



More information about the Gcc-patches mailing list