On Mon, 26 Jun 2023, juzhe.zh...@rivai.ai wrote:

> From: Ju-Zhe Zhong <juzhe.zh...@rivai.ai>
> 
> gcc/ChangeLog:
> 
>         * tree-ssa-dse.cc (initialize_ao_ref_for_dse): Add LEN_MASK_STORE.
>         (dse_optimize_stmt): Ditto.
> 
> ---
>  gcc/tree-ssa-dse.cc | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
> index 3c7a2e9992d..b39edd259ab 100644
> --- a/gcc/tree-ssa-dse.cc
> +++ b/gcc/tree-ssa-dse.cc
> @@ -174,6 +174,32 @@ initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write, 
> bool may_def_ok = false)
>             return true;
>           }
>         break;
> +     case IFN_LEN_MASK_STORE:
> +       {
> +         /* We cannot initialize a must-def ao_ref (in all cases) but we
> +            can provide a may-def variant.  */
> +         if (may_def_ok)
> +           {
> +             /* LEN_MASK_STORE is predicated by both mask and len.
> +                We only create ao_ref which is same as MASK_STORE when
> +                (len + bias) is a known INTEGER_CST/POLY_CST value > 0.
> +                Otherwise, we create ao_ref with unknown size.  */
> +             tree ele_bytesize
> +               = TYPE_SIZE_UNIT (TREE_TYPE (gimple_call_arg (stmt, 3)));
> +             tree ele_num
> +               = int_const_binop (PLUS_EXPR,
> +                                  gimple_call_arg (stmt, 2),
> +                                  gimple_call_arg (stmt, 5));

As said there's no guarantee that the length is constant, no?  Please
fix both this and the IFN_LEN_STORE case.

> +             tree actual_bytesize = NULL_TREE;
> +             if (ele_num && poly_int_tree_p (ele_num)
> +                 && known_gt (tree_to_poly_uint64 (ele_num), 0U))
> +               actual_bytesize = ele_bytesize;
> +             ao_ref_init_from_ptr_and_size (write, gimple_call_arg (stmt, 0),
> +                                            actual_bytesize);
> +             return true;
> +           }
> +         break;
> +       }
>       default:;
>       }
>      }
> @@ -1502,6 +1528,7 @@ dse_optimize_stmt (function *fun, gimple_stmt_iterator 
> *gsi, sbitmap live_bytes)
>       {
>       case IFN_LEN_STORE:
>       case IFN_MASK_STORE:
> +     case IFN_LEN_MASK_STORE:
>         {
>           enum dse_store_status store_status;
>           store_status = dse_classify_store (&ref, stmt, false, live_bytes);
> 

-- 
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