From patchwork Mon Nov 27 14:45:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 170210 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce62:0:b0:403:3b70:6f57 with SMTP id o2csp3174927vqx; Mon, 27 Nov 2023 06:45:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IED6MXE/Y0rSIL1M0Kd0zVYBkTTNz9AViIfrFoi/ShEgBEoiBcrvs1xNUbZKJNGHwdAMGwl X-Received: by 2002:a05:6214:176c:b0:67a:33b1:9a78 with SMTP id et12-20020a056214176c00b0067a33b19a78mr5812248qvb.49.1701096331574; Mon, 27 Nov 2023 06:45:31 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1701096331; cv=pass; d=google.com; s=arc-20160816; b=Pd/s45WNBkYErcHc1joV5V/hvUu6cNg6+HY0wRKx2DqWzTfX0bQok8Nu3cgxbcyx// H70SHihkZfZdUX9jG9EWWHkFjvlDXzl55vHXHO/ZueE6VEvtz3+5CmCKIsyShUZueEun tV3npoD1cog4qj8ZcVw8ujbfYmFWWcHzOyNOO8xe7vX1BftoJTmKRYzeyPnKz3VB4acf 8Eer7Myhwjagzw/qCESao5IGjh0fXu/tG1OEhpxWFFPKeXIqr6r14jDvPNxDNgn803sh tvd8XlfivoSev+HD7rpAHyBJyZn/h+B6NVnsBSrcRqqjGSlFpWXNhGgWq+lF/kv7W0Hu YH+g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mime-version:user-agent :message-id:date:subject:mail-followup-to:to:from:arc-filter :dmarc-filter:delivered-to; bh=lg5T42xHKTPRVv2lrs9LPeOAc/SDlCh8mh6cvMW80Cw=; fh=hPrbWPhweUx4V0GV9uXJqbyAzg2ABmTz7kczrAQqMmM=; b=G6NmR4tfvNcrT4zEDmTaJ6VTByEz1HEOkTgadI8GCtL/Hjal8rmSkoYNszmFm5D9uG e/bxYNcdGn8WLVCswyly5es6ORhexPg3JuIPdVKGaJ78FAwBSnj+EshI2GBqCPb8x+Od 4SSQWXUZAqewR3y7R1phYcX7lxYpgK2R4JRWqaF0oZJbIZF9LdxbpzxmKkQCpLKQGhE2 3rXiu8FAG6R/l9mllihJMRmG79nB3CbTc3LecAYb+JM/P8GUo5ABoouEpfL8SyIJNhux HMfypJp3S7bIp+Hb9JQ2kClUpHGzvWgusYVSocHPQA/JGwg16YJunqcmjJMEnxJL2f4Q ocig== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id m6-20020a0ce8c6000000b0067a21066dd8si6087836qvo.55.2023.11.27.06.45.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 06:45:31 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 57E17385782A for ; Mon, 27 Nov 2023 14:45:31 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 911F238582A3 for ; Mon, 27 Nov 2023 14:45:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 911F238582A3 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 911F238582A3 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701096310; cv=none; b=VmOLRK1gPrH0g/es7zynAyKn6MTTKWJqhJi3VbQJTRe+0BmYY37O2Of6AisV1z6b1hEYUqX4rX25Zw7KnwbxsSB4wAK1Z7ugiSRNdegCdrX/Arfu4+R6fdctp2LCzMl4JZVpZTwTmPIQhGg8ZXXgQNRjbUNi/uAAZk7xAsjVxyA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701096310; c=relaxed/simple; bh=CaH3EP7xMDzXqqjdGhLwMMNM5do9YFLE8udeFVqsOVA=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=bLf4HtTqmavsac84jINJp8swI2eC5dR1yOQS5Qof9JJnXkJQYddOIyAhPD9Qdj48PsLzyX4tdTnMao9vhDGzEEsR85LuD7AkR3mWHoMmifboUD1g0UsGyPFo6ErhQhVJHfDioOZ8BlCIXuE5uyXX2gSNXf+sADUZdrECzdB8WWI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 89E0E2F4 for ; Mon, 27 Nov 2023 06:45:55 -0800 (PST) Received: from localhost (e121540-lin.manchester.arm.com [10.32.110.72]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 87C593F6C4 for ; Mon, 27 Nov 2023 06:45:07 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [pushed] aarch64: Move and generalise vect_all_same Date: Mon, 27 Nov 2023 14:45:06 +0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-22.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE, 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.30 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 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783728786821215042 X-GMAIL-MSGID: 1783728786821215042 The fix for PR106329 needs a way of testing for a ptrue of a particular element size. We already had such a function for svlast, so this patch moves it to common code and generalises it to work with all kinds of vectors. Tested on aarch64-linux-gnu & pushed. Richard gcc/ * config/aarch64/aarch64-sve-builtins.h (vector_cst_all_same): Declare. * config/aarch64/aarch64-sve-builtins.cc (vector_cst_all_same): New function, a generalized replacement of... * config/aarch64/aarch64-sve-builtins-base.cc (svlast_impl::vect_all_same): ...this. (svlast_impl::fold): Update accordingly. --- .../aarch64/aarch64-sve-builtins-base.cc | 17 ++-------------- gcc/config/aarch64/aarch64-sve-builtins.cc | 20 +++++++++++++++++++ gcc/config/aarch64/aarch64-sve-builtins.h | 2 ++ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc b/gcc/config/aarch64/aarch64-sve-builtins-base.cc index 9010ecca6da..a6e527bedd1 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc @@ -1105,19 +1105,6 @@ public: bool is_lasta () const { return m_unspec == UNSPEC_LASTA; } bool is_lastb () const { return m_unspec == UNSPEC_LASTB; } - bool vect_all_same (tree v, int step) const - { - int i; - int nelts = vector_cst_encoded_nelts (v); - tree first_el = VECTOR_CST_ENCODED_ELT (v, 0); - - for (i = 0; i < nelts; i += step) - if (!operand_equal_p (VECTOR_CST_ENCODED_ELT (v, i), first_el, 0)) - return false; - - return true; - } - /* Fold a svlast{a/b} call with constant predicate to a BIT_FIELD_REF. BIT_FIELD_REF lowers to Advanced SIMD element extract, so we have to ensure the index of the element being accessed is in the range of a @@ -1142,7 +1129,7 @@ public: without a linear search of the predicate vector: 1. LASTA if predicate is all true, return element 0. 2. LASTA if predicate all false, return element 0. */ - if (is_lasta () && vect_all_same (pred, step_1)) + if (is_lasta () && vector_cst_all_same (pred, step_1)) { b = build3 (BIT_FIELD_REF, TREE_TYPE (f.lhs), val, bitsize_int (step * BITS_PER_UNIT), bitsize_int (0)); @@ -1152,7 +1139,7 @@ public: /* Handle the all-false case for LASTB where SVE VL == 128b - return the highest numbered element. */ if (is_lastb () && known_eq (BYTES_PER_SVE_VECTOR, 16) - && vect_all_same (pred, step_1) + && vector_cst_all_same (pred, step_1) && integer_zerop (VECTOR_CST_ENCODED_ELT (pred, 0))) { b = build3 (BIT_FIELD_REF, TREE_TYPE (f.lhs), val, diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index 161a14edde7..b61156302cf 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -2541,6 +2541,26 @@ function_checker::check () return shape->check (*this); } +/* Return true if V is a vector constant and if, for every in-range integer I, + element STEP*I is equal to element 0. */ +bool +vector_cst_all_same (tree v, unsigned int step) +{ + if (TREE_CODE (v) != VECTOR_CST) + return false; + + /* VECTOR_CST_NELTS_PER_PATTERN applies to any multiple of + VECTOR_CST_NPATTERNS. */ + unsigned int lcm = least_common_multiple (step, VECTOR_CST_NPATTERNS (v)); + unsigned int nelts = lcm * VECTOR_CST_NELTS_PER_PATTERN (v); + tree first_el = VECTOR_CST_ENCODED_ELT (v, 0); + for (unsigned int i = 0; i < nelts; i += step) + if (!operand_equal_p (VECTOR_CST_ENCODED_ELT (v, i), first_el, 0)) + return false; + + return true; +} + gimple_folder::gimple_folder (const function_instance &instance, tree fndecl, gimple_stmt_iterator *gsi_in, gcall *call_in) : function_call_info (gimple_location (call_in), instance, fndecl), diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h index a301570b82e..d646df1c026 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.h +++ b/gcc/config/aarch64/aarch64-sve-builtins.h @@ -672,6 +672,8 @@ extern tree acle_vector_types[MAX_TUPLE_SIZE][NUM_VECTOR_TYPES + 1]; extern tree acle_svpattern; extern tree acle_svprfop; +bool vector_cst_all_same (tree, unsigned int); + /* Return the ACLE type svbool_t. */ inline tree get_svbool_t (void)