On Mon, 14 Oct 2024, Tamar Christina wrote:

> Hi All,
> 
> While chasing down a costing discrepancy between SLP and non-SLP noticed that
> costing for different VMATs were not working.
> 
> It looks like the vectorizer for non-SLP stores the VMAT type in
> STMT_VINFO_MEMORY_ACCESS_TYPE on the stmt_info, but for SLP it stores it in
> SLP_TREE_MEMORY_ACCESS_TYPE which is on the SLP node itself.
> 
> While I could fairly easily fix the AArch64 backend to look at both, I had a
> look at how various targets use the the macros.  At the moment there are 4
> backends with costing depending on specific VMAT:  i386, rs6000, rvv and
> AArch64.  Of these 4 only i386 actually also reads 
> SLP_TREE_MEMORY_ACCESS_TYPE.
> 
> Some of the targets look like it's gonna be a bit of churn to read and the
> fact that there is two location to check makes it somewhat annoying.
> 
> Instead I'm proposing that, for at least during the transition period that we
> also store the VMAT in the SLP tree's representive statement.  This restores
> the costing in the specific backends.
> 
> If not OK, I'm happy to just fix AArch64.
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu -m32,
> -m64 and no issues.
> 
> Ok for master?

No, this will cause issues - it was removed there specifically because
it will break when a DR is both SLP and not SLP vectorized.  git
blame will tell you.

So the "fix" is to indeed look at SLP_TREE_MEMORY_ACCESS_TYPE
if the cost hook gets passed a slp_node and STMT_VINFO_MEMORY_ACCESS_TYPE
if not.

Maybe instead add an inline helper to tree-vectorizer.h doing this
switching like

inline vect_memory_access_type
vect_memory_access_type (stmt_vec_info stmt_info, slp_tree node)
{
  if (node)
    return SLP_TREE_MEMORY_ACCESS_TYPE (node);
  else
    return STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info);
}

>

> Thanks,
> Tamar
> 
> gcc/ChangeLog:
> 
>       * tree-vect-stmts.cc (vectorizable_load): Always set
>       STMT_VINFO_MEMORY_ACCESS_TYPE.
> 
> ---
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 
> 4f6905f15417f90c6f36e1711a7a25071f0f507c..22f32598059377ed5285fab018b342c8c286a441
>  100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -10235,9 +10235,8 @@ vectorizable_load (vec_info *vinfo,
>         return false;
>       }
>  
> -      if (!slp)
> -     STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) = memory_access_type;
> -      else
> +      STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) = memory_access_type;
> +      if (slp)
>       SLP_TREE_MEMORY_ACCESS_TYPE (slp_node) = memory_access_type;
>  
>        if (loop_vinfo
> 
> 
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to