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 | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
index 3c7a2e9992d..01b0951f1a9 100644
--- a/gcc/tree-ssa-dse.cc
+++ b/gcc/tree-ssa-dse.cc
@@ -174,6 +174,23 @@ 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)
+             {
+               tree len_size
+                 = int_const_binop (MINUS_EXPR, gimple_call_arg (stmt, 2),
+                                    gimple_call_arg (stmt, 5));
+               tree mask_size
+                 = TYPE_SIZE_UNIT (TREE_TYPE (gimple_call_arg (stmt, 4)));
+               tree size = int_const_binop (MAX_EXPR, len_size, mask_size);
+               ao_ref_init_from_ptr_and_size (write, gimple_call_arg (stmt, 0),
+                                              size);
+               return true;
+             }
+           break;
+         }
        default:;
        }
     }
@@ -1502,6 +1519,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