From patchwork Mon Jul 3 04:07:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "juzhe.zhong@rivai.ai" X-Patchwork-Id: 115185 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f45:0:b0:3ea:f831:8777 with SMTP id v5csp269668vqx; Sun, 2 Jul 2023 21:08:35 -0700 (PDT) X-Google-Smtp-Source: APBJJlGFARe36//YApfoqsuB+XhKE5Yxojgf+z9yLtrc9/yNGVqF9w2fD5AvRZFSKS8USoraYoxo X-Received: by 2002:aa7:cd15:0:b0:51e:6a:b4ba with SMTP id b21-20020aa7cd15000000b0051e006ab4bamr3585660edw.41.1688357315052; Sun, 02 Jul 2023 21:08:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688357315; cv=none; d=google.com; s=arc-20160816; b=cZRelxnC4ekoCljgzf/tUuZ1/9BVc64gfG82+7owIbLyyE3wCBcuFKv56Cv9Mvnp9v 3bRixqbxjwtz+814cGdMjEYiuaRXCjXlCU4pKTQaayjP2o8q8dVV10aEB2lh08PwT1bt YxOS4tSbnLCgVxV7Q1cljIpDrl8PdyGts3m1bnDKeF9N/+WfA9Nz9+KvMzF8MfDp9h/f OsOHYbhM3ZWCMw+5J1iH8JZ3co9S4CW3SRq2xV7oSD0tCDSi5wWH5rN1o5KRv36uImTr MNc1IyULFjjsxSbw67amMbzVPKNMzGmrhrZqmg2qnjA4T2xSr4ya6bPo0LUP+em7XJ5n C8Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:feedback-id :content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:dmarc-filter:delivered-to; bh=pTl9qH14wJqbWEX24CEnODfmtQkrvbJVjYt/a2fDP3s=; fh=h6UG6PIw2FD/e8JL+9n/VDDoO75bXx4B3jGj5okR2Rw=; b=SB+9F79zHSZ0IV408mCZMKHU2obPGM1c2G7P4tduoKlge5I6FXFydrqdZBN67Cqb5E eRZ0lIBG9wZQ7MCHQlv3RvvgbQRdHe73o+MSiBCaFHUxxFJw4u6PvMaDbp08eUyAmG7M uOGsU9W2vIb7aQVrLc74Qr4ngVqm5OGMSFhi/Mi5LXHeBSjc3y+UPg6WikkI6Zhp37oj oi9Lc0JsZjEGr+HUPl8zGReNXcFTtgqAEhFnjl1SoTMzPYxsPMtoFZ41k07Sa6o1RnUg UUq8G4wb7ECedOmJNkOqGcl3XZBG+HvXSeUl2ZDDLHsp/65OZQY8Ztg6Qmj6Go0T17rx F9Nw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id x6-20020a1709065ac600b00993166137f5si1986313ejs.140.2023.07.02.21.08.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Jul 2023 21:08:35 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 13D7F3857735 for ; Mon, 3 Jul 2023 04:08:23 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbg153.qq.com (smtpbg153.qq.com [13.245.218.24]) by sourceware.org (Postfix) with ESMTPS id 90D0D3858D28 for ; Mon, 3 Jul 2023 04:07:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 90D0D3858D28 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: bizesmtp69t1688357266tydn3bss Received: from server1.localdomain ( [58.60.1.22]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 03 Jul 2023 12:07:45 +0800 (CST) X-QQ-SSF: 01400000000000G0T000000A0000000 X-QQ-FEAT: 90EFqYDyPxDakWiFGcvPnSVlPZspnbgvDs3Im9daGWdsaY6P1OK4DRaFibtI+ SxGjnckISe1xfVikjOH7ED1H06LwMrY0dkF9D7NVHiclWU4clfKV9hIZ2S6fWyjErp+UElM tpjxAZgww42f6/djXs8fYiBJKFgXNkra1sBB9OaE/5k0TmmsQMNfREtsPKVS/Is7dqrcl03 IQawurEB7F0cYuxml4NGeRaw+fqaYWSaNIcf2xY/oLe3+fmDXoH4p+ta+EjGUf29YQ6LLwA LchL1+FPTlE5XEcTid0NtbkNcA/3B5MsEMIG8ZJ0imeAC+wjW+FZUrSfBYbO61jEAOzQP8T im0vvXHYnrHdpDrwcH1em1i/K1NO9f+WzKEPwZoE9uZkZU4gQiMUl9ohnJDlWpyoPcD0voE vCAaH4/qHfI= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 12535264792464979097 From: juzhe.zhong@rivai.ai To: gcc-patches@gcc.gnu.org Cc: richard.sandiford@arm.com, rguenther@suse.de, Ju-Zhe Zhong Subject: [PATCH] Middle-end: Change order of LEN_MASK_LOAD/LEN_MASK_STORE arguments Date: Mon, 3 Jul 2023 12:07:44 +0800 Message-Id: <20230703040744.258283-1-juzhe.zhong@rivai.ai> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvrgz:qybglogicsvrgz7a-one-0 X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1770370959647248122?= X-GMAIL-MSGID: =?utf-8?q?1770370959647248122?= From: Ju-Zhe Zhong Hi, Richard and Richi. According to Richard's review comments: https://gcc.gnu.org/pipermail/gcc-patches/2023-July/623405.html current len, bias and mask order is not reasonable. Change {len,mask,bias} into {len,bias,mask}. This patch is a simple fix patch, ok for trunk ? gcc/ChangeLog: * config/riscv/autovec.md: Change order of LEN_MASK_LOAD/LEN_MASK_STORE arguments. * config/riscv/riscv-v.cc (expand_load_store): Ditto. * doc/md.texi: Ditto. * gimple-fold.cc (gimple_fold_partial_load_store_mem_ref): Ditto. * internal-fn.cc (len_maskload_direct): Ditto. (len_maskstore_direct): Ditto. (add_len_bias_and_mask_args): Ditto. (expand_partial_load_optab_fn): Ditto. (expand_partial_store_optab_fn): Ditto. (internal_fn_mask_index): Ditto. (internal_fn_len_index): Ditto. (internal_fn_bias_index): Ditto. (internal_fn_stored_value_index): Ditto. (internal_len_load_store_bias): Ditto. * tree-ssa-dse.cc (initialize_ao_ref_for_dse): Ditto. * tree-vect-stmts.cc (vectorizable_store): Ditto. (vectorizable_load): Ditto. --- gcc/config/riscv/autovec.md | 8 +- gcc/config/riscv/riscv-v.cc | 2 +- gcc/doc/md.texi | 16 ++-- gcc/gimple-fold.cc | 7 +- gcc/internal-fn.cc | 176 +++++++++++++----------------------- gcc/tree-ssa-dse.cc | 13 +-- gcc/tree-vect-stmts.cc | 6 +- 7 files changed, 90 insertions(+), 138 deletions(-) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 1488f2be1be..4ab0e9f99eb 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -26,8 +26,8 @@ [(match_operand:V 0 "register_operand") (match_operand:V 1 "memory_operand") (match_operand 2 "autovec_length_operand") - (match_operand: 3 "vector_mask_operand") - (match_operand 4 "const_0_operand")] + (match_operand 3 "const_0_operand") + (match_operand: 4 "vector_mask_operand")] "TARGET_VECTOR" { riscv_vector::expand_load_store (operands, true); @@ -38,8 +38,8 @@ [(match_operand:V 0 "memory_operand") (match_operand:V 1 "register_operand") (match_operand 2 "autovec_length_operand") - (match_operand: 3 "vector_mask_operand") - (match_operand 4 "const_0_operand")] + (match_operand 3 "const_0_operand") + (match_operand: 4 "vector_mask_operand")] "TARGET_VECTOR" { riscv_vector::expand_load_store (operands, false); diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc index adb8d7d36a5..8d5bed7ebe4 100644 --- a/gcc/config/riscv/riscv-v.cc +++ b/gcc/config/riscv/riscv-v.cc @@ -2777,7 +2777,7 @@ expand_load_store (rtx *ops, bool is_load) { poly_int64 value; rtx len = ops[2]; - rtx mask = ops[3]; + rtx mask = ops[4]; machine_mode mode = GET_MODE (ops[0]); if (poly_int_rtx_p (len, &value) && known_eq (value, GET_MODE_NUNITS (mode))) diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index b44d1ba3af9..f14dd32b2dc 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -5319,15 +5319,15 @@ This pattern is not allowed to @code{FAIL}. @cindex @code{len_maskload@var{m}@var{n}} instruction pattern @item @samp{len_maskload@var{m}@var{n}} Perform a masked load from the memory location pointed to by operand 1 -into register operand 0. (operand 2 + operand 4) elements are loaded from +into register operand 0. (operand 2 + operand 3) elements are loaded from memory and other elements in operand 0 are set to undefined values. This is a combination of len_load and maskload. Operands 0 and 1 have mode @var{m}, which must be a vector mode. Operand 2 has whichever integer mode the target prefers. A mask is specified in -operand 3 which must be of type @var{n}. The mask has lower precedence than +operand 4 which must be of type @var{n}. The mask has lower precedence than the length and is itself subject to length masking, -i.e. only mask indices < (operand 2 + operand 4) are used. -Operand 4 conceptually has mode @code{QI}. +i.e. only mask indices < (operand 2 + operand 3) are used. +Operand 3 conceptually has mode @code{QI}. Operand 2 can be a variable or a constant amount. Operand 4 specifies a constant bias: it is either a constant 0 or a constant -1. The predicate on @@ -5346,14 +5346,14 @@ This pattern is not allowed to @code{FAIL}. @cindex @code{len_maskstore@var{m}@var{n}} instruction pattern @item @samp{len_maskstore@var{m}@var{n}} Perform a masked store from vector register operand 1 into memory operand 0. -(operand 2 + operand 4) elements are stored to memory +(operand 2 + operand 3) elements are stored to memory and leave the other elements of operand 0 unchanged. This is a combination of len_store and maskstore. Operands 0 and 1 have mode @var{m}, which must be a vector mode. Operand 2 has whichever -integer mode the target prefers. A mask is specified in operand 3 which must be +integer mode the target prefers. A mask is specified in operand 4 which must be of type @var{n}. The mask has lower precedence than the length and is itself subject to -length masking, i.e. only mask indices < (operand 2 + operand 4) are used. -Operand 4 conceptually has mode @code{QI}. +length masking, i.e. only mask indices < (operand 2 + operand 3) are used. +Operand 3 conceptually has mode @code{QI}. Operand 2 can be a variable or a constant amount. Operand 3 specifies a constant bias: it is either a constant 0 or a constant -1. The predicate on diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index 8434274f69d..d2d758f6435 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -5391,11 +5391,11 @@ gimple_fold_partial_load_store_mem_ref (gcall *call, tree vectype, bool mask_p) } else { - tree basic_len = gimple_call_arg (call, 2); + internal_fn ifn = gimple_call_internal_fn (call); + tree basic_len = gimple_call_arg (call, internal_fn_len_index (ifn)); if (!poly_int_tree_p (basic_len)) return NULL_TREE; - unsigned int nargs = gimple_call_num_args (call); - tree bias = gimple_call_arg (call, nargs - 1); + tree bias = gimple_call_arg (call, internal_fn_bias_index (ifn)); gcc_assert (TREE_CODE (bias) == INTEGER_CST); /* For LEN_LOAD/LEN_STORE/LEN_MASK_LOAD/LEN_MASK_STORE, we don't fold when (bias + len) != VF. */ @@ -5405,7 +5405,6 @@ gimple_fold_partial_load_store_mem_ref (gcall *call, tree vectype, bool mask_p) /* For LEN_MASK_{LOAD,STORE}, we should also check whether the mask is all ones mask. */ - internal_fn ifn = gimple_call_internal_fn (call); if (ifn == IFN_LEN_MASK_LOAD || ifn == IFN_LEN_MASK_STORE) { tree mask = gimple_call_arg (call, internal_fn_mask_index (ifn)); diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc index 43ac5b37cc9..e394c05c895 100644 --- a/gcc/internal-fn.cc +++ b/gcc/internal-fn.cc @@ -165,7 +165,7 @@ init_internal_fns () #define mask_load_lanes_direct { -1, -1, false } #define gather_load_direct { 3, 1, false } #define len_load_direct { -1, -1, false } -#define len_maskload_direct { -1, 3, false } +#define len_maskload_direct { -1, 4, false } #define mask_store_direct { 3, 2, false } #define store_lanes_direct { 0, 0, false } #define mask_store_lanes_direct { 0, 0, false } @@ -173,7 +173,7 @@ init_internal_fns () #define vec_cond_direct { 2, 0, false } #define scatter_store_direct { 3, 1, false } #define len_store_direct { 3, 3, false } -#define len_maskstore_direct { 4, 3, false } +#define len_maskstore_direct { 4, 5, false } #define vec_set_direct { 3, 3, false } #define unary_direct { 0, 0, true } #define unary_convert_direct { -1, 0, true } @@ -293,6 +293,40 @@ get_multi_vector_move (tree array_type, convert_optab optab) return convert_optab_handler (optab, imode, vmode); } +/* Add len, bias and mask arguments according to the STMT. */ + +static unsigned int +add_len_bias_and_mask_args (expand_operand *ops, unsigned int opno, gcall *stmt) +{ + internal_fn ifn = gimple_call_internal_fn (stmt); + int len_index = internal_fn_len_index (ifn); + int bias_index = internal_fn_bias_index (ifn); + int mask_index = internal_fn_mask_index (ifn); + /* The order of arguments are always {len,bias,mask}. */ + if (len_index >= 0) + { + tree len = gimple_call_arg (stmt, len_index); + rtx len_rtx = expand_normal (len); + create_convert_operand_from (&ops[opno++], len_rtx, + TYPE_MODE (TREE_TYPE (len)), + TYPE_UNSIGNED (TREE_TYPE (len))); + } + if (bias_index >= 0) + { + tree biast = gimple_call_arg (stmt, bias_index); + rtx bias = expand_normal (biast); + create_input_operand (&ops[opno++], bias, QImode); + } + if (mask_index >= 0) + { + tree mask = gimple_call_arg (stmt, mask_index); + rtx mask_rtx = expand_normal (mask); + create_input_operand (&ops[opno++], mask_rtx, + TYPE_MODE (TREE_TYPE (mask))); + } + return opno; +} + /* Expand LOAD_LANES call STMT using optab OPTAB. */ static void @@ -2879,14 +2913,15 @@ expand_call_mem_ref (tree type, gcall *stmt, int index) * OPTAB. */ static void -expand_partial_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab) +expand_partial_load_optab_fn (internal_fn ifn, gcall *stmt, convert_optab optab) { + int i = 0; class expand_operand ops[5]; - tree type, lhs, rhs, maskt, biast; - rtx mem, target, mask, bias; + tree type, lhs, rhs, maskt; + rtx mem, target; insn_code icode; - maskt = gimple_call_arg (stmt, 2); + maskt = gimple_call_arg (stmt, internal_fn_mask_index (ifn)); lhs = gimple_call_lhs (stmt); if (lhs == NULL_TREE) return; @@ -2903,38 +2938,11 @@ expand_partial_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab) mem = expand_expr (rhs, NULL_RTX, VOIDmode, EXPAND_WRITE); gcc_assert (MEM_P (mem)); - mask = expand_normal (maskt); target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); - create_output_operand (&ops[0], target, TYPE_MODE (type)); - create_fixed_operand (&ops[1], mem); - if (optab == len_load_optab) - { - create_convert_operand_from (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt)), - TYPE_UNSIGNED (TREE_TYPE (maskt))); - biast = gimple_call_arg (stmt, 3); - bias = expand_normal (biast); - create_input_operand (&ops[3], bias, QImode); - expand_insn (icode, 4, ops); - } - else if (optab == len_maskload_optab) - { - create_convert_operand_from (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt)), - TYPE_UNSIGNED (TREE_TYPE (maskt))); - maskt = gimple_call_arg (stmt, 3); - mask = expand_normal (maskt); - create_input_operand (&ops[3], mask, TYPE_MODE (TREE_TYPE (maskt))); - icode = convert_optab_handler (optab, TYPE_MODE (type), - TYPE_MODE (TREE_TYPE (maskt))); - biast = gimple_call_arg (stmt, 4); - bias = expand_normal (biast); - create_input_operand (&ops[4], bias, QImode); - expand_insn (icode, 5, ops); - } - else - { - create_input_operand (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt))); - expand_insn (icode, 3, ops); - } + create_output_operand (&ops[i++], target, TYPE_MODE (type)); + create_fixed_operand (&ops[i++], mem); + i = add_len_bias_and_mask_args (ops, i, stmt); + expand_insn (icode, i, ops); if (!rtx_equal_p (target, ops[0].value)) emit_move_insn (target, ops[0].value); @@ -2951,12 +2959,13 @@ expand_partial_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab) static void expand_partial_store_optab_fn (internal_fn ifn, gcall *stmt, convert_optab optab) { + int i = 0; class expand_operand ops[5]; - tree type, lhs, rhs, maskt, biast; - rtx mem, reg, mask, bias; + tree type, lhs, rhs, maskt; + rtx mem, reg; insn_code icode; - maskt = gimple_call_arg (stmt, 2); + maskt = gimple_call_arg (stmt, internal_fn_mask_index (ifn)); rhs = gimple_call_arg (stmt, internal_fn_stored_value_index (ifn)); type = TREE_TYPE (rhs); lhs = expand_call_mem_ref (type, stmt, 0); @@ -2971,37 +2980,11 @@ expand_partial_store_optab_fn (internal_fn ifn, gcall *stmt, convert_optab optab mem = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); gcc_assert (MEM_P (mem)); - mask = expand_normal (maskt); reg = expand_normal (rhs); - create_fixed_operand (&ops[0], mem); - create_input_operand (&ops[1], reg, TYPE_MODE (type)); - if (optab == len_store_optab) - { - create_convert_operand_from (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt)), - TYPE_UNSIGNED (TREE_TYPE (maskt))); - biast = gimple_call_arg (stmt, 4); - bias = expand_normal (biast); - create_input_operand (&ops[3], bias, QImode); - expand_insn (icode, 4, ops); - } - else if (optab == len_maskstore_optab) - { - create_convert_operand_from (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt)), - TYPE_UNSIGNED (TREE_TYPE (maskt))); - maskt = gimple_call_arg (stmt, 3); - mask = expand_normal (maskt); - create_input_operand (&ops[3], mask, TYPE_MODE (TREE_TYPE (maskt))); - biast = gimple_call_arg (stmt, 5); - bias = expand_normal (biast); - create_input_operand (&ops[4], bias, QImode); - icode = convert_optab_handler (optab, TYPE_MODE (type), GET_MODE (mask)); - expand_insn (icode, 5, ops); - } - else - { - create_input_operand (&ops[2], mask, TYPE_MODE (TREE_TYPE (maskt))); - expand_insn (icode, 3, ops); - } + create_fixed_operand (&ops[i++], mem); + create_input_operand (&ops[i++], reg, TYPE_MODE (type)); + i = add_len_bias_and_mask_args (ops, i, stmt); + expand_insn (icode, i, ops); } #define expand_mask_store_optab_fn expand_partial_store_optab_fn @@ -3519,40 +3502,6 @@ expand_LAUNDER (internal_fn, gcall *call) expand_assignment (lhs, gimple_call_arg (call, 0), false); } -/* Add len, bias and mask arguments according to the STMT. */ - -static unsigned int -add_len_bias_and_mask_args (expand_operand *ops, unsigned int opno, gcall *stmt) -{ - internal_fn ifn = gimple_call_internal_fn (stmt); - int len_index = internal_fn_len_index (ifn); - int bias_index = internal_fn_bias_index (ifn); - int mask_index = internal_fn_mask_index (ifn); - /* The order of arguments are always {len,bias,mask}. */ - if (len_index >= 0) - { - tree len = gimple_call_arg (stmt, len_index); - rtx len_rtx = expand_normal (len); - create_convert_operand_from (&ops[opno++], len_rtx, - TYPE_MODE (TREE_TYPE (len)), - TYPE_UNSIGNED (TREE_TYPE (len))); - } - if (bias_index >= 0) - { - tree biast = gimple_call_arg (stmt, bias_index); - rtx bias = expand_normal (biast); - create_input_operand (&ops[opno++], bias, QImode); - } - if (mask_index >= 0) - { - tree mask = gimple_call_arg (stmt, mask_index); - rtx mask_rtx = expand_normal (mask); - create_input_operand (&ops[opno++], mask_rtx, - TYPE_MODE (TREE_TYPE (mask))); - } - return opno; -} - /* Expand {MASK_,}SCATTER_STORE{S,U} call CALL using optab OPTAB. */ static void @@ -4532,8 +4481,9 @@ internal_fn_mask_index (internal_fn fn) return 6; case IFN_LEN_MASK_LOAD: + return 4; case IFN_LEN_MASK_STORE: - return 3; + return 5; default: return (conditional_internal_fn_code (fn) != ERROR_MARK @@ -4550,8 +4500,10 @@ internal_fn_len_index (internal_fn fn) switch (fn) { case IFN_LEN_LOAD: - case IFN_LEN_STORE: case IFN_LEN_MASK_LOAD: + return 2; + + case IFN_LEN_STORE: case IFN_LEN_MASK_STORE: return 3; @@ -4573,8 +4525,10 @@ internal_fn_bias_index (internal_fn fn) switch (fn) { case IFN_LEN_LOAD: - case IFN_LEN_STORE: case IFN_LEN_MASK_LOAD: + return 3; + + case IFN_LEN_STORE: case IFN_LEN_MASK_STORE: return 4; @@ -4604,7 +4558,7 @@ internal_fn_stored_value_index (internal_fn fn) return 3; case IFN_LEN_MASK_STORE: - return 4; + return 2; default: return -1; @@ -4670,7 +4624,6 @@ internal_len_load_store_bias (internal_fn ifn, machine_mode mode) { optab optab = direct_internal_fn_optab (ifn); insn_code icode = direct_optab_handler (optab, mode); - int bias_opno = 3; if (icode == CODE_FOR_nothing) { @@ -4688,15 +4641,14 @@ internal_len_load_store_bias (internal_fn ifn, machine_mode mode) optab = direct_internal_fn_optab (IFN_LEN_MASK_STORE); } icode = convert_optab_handler (optab, mode, mask_mode); - bias_opno = 4; } if (icode != CODE_FOR_nothing) { /* For now we only support biases of 0 or -1. Try both of them. */ - if (insn_operand_matches (icode, bias_opno, GEN_INT (0))) + if (insn_operand_matches (icode, 3, GEN_INT (0))) return 0; - if (insn_operand_matches (icode, bias_opno, GEN_INT (-1))) + if (insn_operand_matches (icode, 3, GEN_INT (-1))) return -1; } diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc index f8338037a61..aa58f7b900d 100644 --- a/gcc/tree-ssa-dse.cc +++ b/gcc/tree-ssa-dse.cc @@ -159,14 +159,15 @@ initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write, bool may_def_ok = false) { case IFN_LEN_STORE: case IFN_MASK_STORE: - case IFN_LEN_MASK_STORE: + 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) + internal_fn ifn = gimple_call_internal_fn (stmt); + int stored_value_index = internal_fn_stored_value_index (ifn); + if (ifn == IFN_LEN_STORE) { - tree len = gimple_call_arg (stmt, 2); - tree bias = gimple_call_arg (stmt, 4); + tree len = gimple_call_arg (stmt, internal_fn_len_index (ifn)); + tree bias + = gimple_call_arg (stmt, internal_fn_bias_index (ifn)); if (tree_fits_uhwi_p (len)) { ao_ref_init_from_ptr_and_size (write, diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 68faa8ead39..0c61e123e5e 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -9122,8 +9122,8 @@ vectorizable_store (vec_info *vinfo, if (partial_ifn == IFN_LEN_MASK_STORE) call = gimple_build_call_internal (IFN_LEN_MASK_STORE, 6, dataref_ptr, ptr, - final_len, final_mask, - vec_oprnd, bias); + vec_oprnd, final_len, + bias, final_mask); else call = gimple_build_call_internal (IFN_LEN_STORE, 5, @@ -10523,7 +10523,7 @@ vectorizable_load (vec_info *vinfo, call = gimple_build_call_internal (IFN_LEN_MASK_LOAD, 5, dataref_ptr, ptr, final_len, - final_mask, bias); + bias, final_mask); else call = gimple_build_call_internal (IFN_LEN_LOAD, 4, dataref_ptr, ptr,