From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) by sourceware.org (Postfix) with ESMTPS id 8AE0C3858D33 for ; Mon, 26 Jun 2023 07:43:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8AE0C3858D33 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai X-QQ-mid: bizesmtp81t1687765424tqsrcqlk Received: from rios-cad5.localdomain ( [58.60.1.11]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 26 Jun 2023 15:43:43 +0800 (CST) X-QQ-SSF: 01400000000000G0S000000A0000000 X-QQ-FEAT: eSZ1CZgv+JCyeu0m4cxs+13YtpwgDLHI19igTe5d7gowHfHgVMQVB/T9eIWdG v2JTuOoH/qx4nmo+j4+ulQNB5bCmg5Z3DWLgM5e34n7wLAgVH336oCxrabV+mbA1it86eun 7ZkJeNXDm8+Lztc2nV6FiFP/4yozA2SoH4kAnxKDp8X11YkT0CcvllO9kTQxIGc/vvITqOP HZnoICJeC9ZV3dnIc5wx7GDWm1JMtYrFdDVlKzpijpxe6sbSZIRuQvkT480o1ZOy2AAj1xn uK21xDm+TIS9EXyRLK1qTF7+jjf1cYOgq54w3JXRW9UkZr0yi9fv5JT2Hl9pKyxP9fEl4ch JLB6b4M0XDBAYCwbDgIzSwDw21hoojgw1VmzR8wVUYV89IgdWuXy22CC3H7wYQgLeFRJjp6 01EfDJasdsk= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 17092752510874512409 From: juzhe.zhong@rivai.ai To: gcc-patches@gcc.gnu.org Cc: richard.sandiford@arm.com, rguenther@suse.de, Ju-Zhe Zhong Subject: [PATCH V3] DSE: Add LEN_MASK_STORE analysis into DSE and fix LEN_STORE Date: Mon, 26 Jun 2023 15:43:42 +0800 Message-Id: <20230626074342.2629716-1-juzhe.zhong@rivai.ai> X-Mailer: git-send-email 2.36.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvrgz:qybglogicsvrgz7a-one-0 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: From: Ju-Zhe Zhong Hi, Richi. This patch is adding LEN_MASK_STORE into DSE. My understanding is LEN_MASK_STORE is predicated by mask and len. No matter len is constant or not, the ao_ref should be the same as MASK_STORE. Wheras for LEN_STORE, when len is constant, we use (len - bias), otherwise, it's the same as MASK_STORE/LEN_MASK_STORE. Not sure whether I am on the same page with you, feel free to correct me. Thanks. gcc/ChangeLog: * tree-ssa-dse.cc (initialize_ao_ref_for_dse): Add LEN_MASK_STORE and fix LEN_STORE. (dse_optimize_stmt): Add LEN_MASK_STORE. --- gcc/tree-ssa-dse.cc | 47 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc index 3c7a2e9992d..f8338037a61 100644 --- a/gcc/tree-ssa-dse.cc +++ b/gcc/tree-ssa-dse.cc @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-loop-niter.h" #include "cfgloop.h" #include "tree-data-ref.h" +#include "internal-fn.h" /* This file implements dead store elimination. @@ -157,23 +158,36 @@ initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write, bool may_def_ok = false) switch (gimple_call_internal_fn (stmt)) { case IFN_LEN_STORE: - ao_ref_init_from_ptr_and_size - (write, gimple_call_arg (stmt, 0), - int_const_binop (MINUS_EXPR, - gimple_call_arg (stmt, 2), - gimple_call_arg (stmt, 4))); - return true; case IFN_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) - { - ao_ref_init_from_ptr_and_size - (write, gimple_call_arg (stmt, 0), - TYPE_SIZE_UNIT (TREE_TYPE (gimple_call_arg (stmt, 3)))); - return true; - } - break; + case IFN_LEN_MASK_STORE: + { + int stored_value_index + = internal_fn_stored_value_index (gimple_call_internal_fn (stmt)); + if (gimple_call_internal_fn (stmt) == IFN_LEN_STORE) + { + tree len = gimple_call_arg (stmt, 2); + tree bias = gimple_call_arg (stmt, 4); + if (tree_fits_uhwi_p (len)) + { + ao_ref_init_from_ptr_and_size (write, + gimple_call_arg (stmt, 0), + int_const_binop (MINUS_EXPR, + len, bias)); + return true; + } + } + /* We cannot initialize a must-def ao_ref (in all cases) but we + can provide a may-def variant. */ + if (may_def_ok) + { + ao_ref_init_from_ptr_and_size ( + write, gimple_call_arg (stmt, 0), + TYPE_SIZE_UNIT ( + TREE_TYPE (gimple_call_arg (stmt, stored_value_index)))); + return true; + } + break; + } default:; } } @@ -1502,6 +1516,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