Thanks Richard.

Is it correct that the better way is to add optabs 
(len_strided_load/len_strided_store),
then expand LEN_MASK_GATHER_LOAD/LEN_MASK_SCATTER_STORE to 
len_strided_load/len_strided_store optab (if it is strided load/store) in
expand_gather_load_optab_fn 
expand_scatter_store_optab_fn

of internal-fn.cc

Am I right? Thanks.


juzhe.zh...@rivai.ai
 
From: Richard Biener
Date: 2023-07-12 15:27
To: juzhe.zh...@rivai.ai
CC: jeffreyalaw; gcc-patches; Kito.cheng; Robin Dapp; richard.sandiford
Subject: Re: Re: [PATCH V5] RISC-V: Support gather_load/scatter RVV 
auto-vectorization
On Wed, 12 Jul 2023, juzhe.zh...@rivai.ai wrote:
 
> I understand your concern. I CC Richards to see whether this piece of codes 
> is  unsafe.
> 
> Hi, Richard and Richi:
> 
> Jeff is worrying about this codes in "expand_gather_scatter" of supporting 
> len_mask_gather_load/len_mask_scatter_store in RISC-V port.
> 
> The codes are as follows:
> 
>  +/* Return true if it is the strided load/store. */
> +static bool
> +strided_load_store_p (rtx vec_offset, rtx *base, rtx *step)
> +{
> +  if (const_vec_series_p (vec_offset, base, step))
> +    return true;
> +
> +  /* For strided load/store, vectorizer always generates
> +     VEC_SERIES_EXPR for vec_offset.  */
> +  tree expr = REG_P (vec_offset) ? REG_EXPR (vec_offset) : NULL_TREE;
> +  if (!expr || TREE_CODE (expr) != SSA_NAME)
> +    return false;
> +
> +  /* Check if it is GIMPLE like: _88 = VEC_SERIES_EXPR <0, _87>;  */
> +  gimple *def_stmt = SSA_NAME_DEF_STMT (expr);
> +  if (!def_stmt || !is_gimple_assign (def_stmt)
> +      || gimple_assign_rhs_code (def_stmt) != VEC_SERIES_EXPR)
> +    return false;
> +
> +  tree baset = gimple_assign_rhs1 (def_stmt);
> +  tree stept = gimple_assign_rhs2 (def_stmt);
> +  *base = expand_normal (baset);
> +  *step = expand_normal (stept);
> +
> +  if (!rtx_equal_p (*base, const0_rtx))
> +    return false;
> +  return true;
> +}
> In this codes, I tried to query the SSA_NAME_DEF_STMT to see whether the 
> vector offset of gather/scatter is VEC_SERISE
> If it is VEC_SERISE, I will lower them into RVV strided load/stores 
> (vlse.v/vsse.v) which is using scalar stride, 
> if it is not, then use common RVV indexed load/store with vector offset 
> (vluxei/vsuxei).
> 
> Jeff is worrying about whether we are using SSA_NAME_DEF_STMT at this point  
> (during the stage "expand" expanding gimple ->rtl).
 
Using SSA_NAME_DEF_STMT during expansion is OK, but I don't think you
can rely on REG_EXPR here since you don't know whether any coalescing
happened.  That said, maybe the implementation currently guarantees
you'll only see a REG_EXPR SSA name if there's a single definition
of that register, but at least I'm not aware of that and this is also
not documented.
 
I wonder if you can recover vlse.v at combine time though?
 
That said, if the ISA supports gather/scatter with an affine offset
the more appropriate way would be to add additional named expanders
for this and deal with the above in the middle-end during RTL
expansion instead.
 
Richard.
 
> I am also wondering whether I am doing wrong here.
> Thanks.
> 
> 
> juzhe.zh...@rivai.ai
>  
> From: Jeff Law
> Date: 2023-07-12 13:32
> To: juzhe.zh...@rivai.ai; gcc-patches
> CC: Kito.cheng; Robin Dapp
> Subject: Re: [PATCH V5] RISC-V: Support gather_load/scatter RVV 
> auto-vectorization
>  
>  
> On 7/11/23 20:34, juzhe.zh...@rivai.ai wrote:
> > Hi, Jeff.
> > 
> >  >> Hmm, I'm not sure this is safe, especially if gimple->rtl expansion is
> >>>complete.  While you might be able to get REG_EXPR, I would not really
> >>>expect SSA_NAME_DEF_STMT to be correct.  At the least it'll need some
> >>>way to make sure it's not called at an inappropriate time.
> > I think it's safe, if SSA_NAME_DEF_STMT is NULL, then just return it.
> > 
> >>>Should this have been known_lt rather than known_le?
> > It should be LE, since I will pass through GET_MODE_NUNITS/GET_MODE_SIZE 
> > for SLP.
> THanks for double checking.  It looked slightly odd checking ge or le.
>  
>  
> > 
> >>>Something's off in your formatting here.  I'd guess spaces vs tabs
> > Ok.
> > 
> >>>In a few places you're using expand_binop.  Those interfaces are really
> >>>more for gimple->RTL.  BUt code like expand_gather_scatter is really
> >>>RTL, not gimple/tree.   Is there a reason why you're not using pure RTL
> >>>interfaces?
> > I saw ARM SVE is using them in many places for expanding patterns.
> > And I think it's convenient so that's why I use them.
> OK.
>  
> I still think we need a resolution on strided_load_store_p.  As I 
> mentioned in my original email, I'm not sure you can depend on getting 
> to the SSA_NAME_DEF_STMT at this point -- in particular if it's a 
> dangling pointer, then bad things are going to happen.  So let's chase 
> that down.  Presumably this is called during gimple->rtl expansion, 
> right?  Is it ever called later?
>  
> I think my concerns about expand_gather_scatter are a non-issue after 
> looking at it again -- I missed the GET_MODE (step) != Pmode conditional 
> when I first looked at that code.
>  
>  
> jeff
>  
> 
 
-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)
 

Reply via email to