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));
+               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);
-- 
2.36.3

Reply via email to