From patchwork Tue Sep 26 07:12:57 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: 144752 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:cae8:0:b0:403:3b70:6f57 with SMTP id r8csp1726896vqu; Tue, 26 Sep 2023 00:13:46 -0700 (PDT) X-Google-Smtp-Source: AGHT+IERH+KnVWFuQvjXKhfGzQkmdfO8jqL2wr171DtMZBtPi/fE6zTBmW50adhp1DMwm/1vNJkZ X-Received: by 2002:a17:907:7789:b0:9a3:faf:7aaa with SMTP id ky9-20020a170907778900b009a30faf7aaamr7558270ejc.15.1695712425830; Tue, 26 Sep 2023 00:13:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695712425; cv=none; d=google.com; s=arc-20160816; b=OBJEg/WQc61ikYNzuUGPolkT32HDHruYRw+KbM5tCy3d3JJ1TimBzj13nJ0FE/VRQn CuNA/HbxqTK+itnoBlt10Z/cXZizoyj2RzV+KcOZiSEHy+m5olNUhszdfqnvsNXTk+4Y piPskiqLXtMwqQWg8bRk3+9Ev5IXCE8skDM9AuWpwM6TX62H8iMrLUEWdFOF7L0REbgq 4b74wgPAQwUwDt8XSM4cyi4HVy2FI73ATzoveZBi5pn+Z4V6wXARofpstBM5Q4o57cs2 uvy40YS/8dsET4LujaIO9DdIaqtfmX7OwawyCEKXGvCvZHkpiZrWi82ZyPwycsR/hoBb slxg== ARC-Message-Signature: i=1; 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:feedback-id :content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:dmarc-filter:delivered-to; bh=0au0xlnZOk2es4kfbSKEpQ62gnKJt/JLJv8NzKK03s0=; fh=nq/SXOK3mQq0cjLq1TpwdAHLmWXioN9RH2MmrGpEI+4=; b=l2HZ2zAueSkkaIObr0wsXcgu7ml/ZwkQ4ITC2SiBxLZuh1I6a5x4f23pFN+STqh+UT VIAZmEDFcVah2ANDKCOY9bNoi6eYpSBQSwQVqikOXndr9xQlpcNperQI37mtud5V4Hh3 s40mV7kNDYa1TotleUAU4PecGlvTpd+E73k/DcUElgsVm7ED/TvPQYVkJqvW300bVnEJ V4tTzH0qlMce/NgLIOGfOgNGuGTqtCSIDS7Rm3IQ7zkDepCWwsnYCUJELoFqI1jCXUsv QeHb2ywdvPc9CiQvy75TzKj4t+hxV1r5q3eXWoMvGF4EIhrTsQhDmsar+/3lowJ4X/SR QzAA== 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 g10-20020a170906594a00b0099bd24d66aasi10787967ejr.383.2023.09.26.00.13.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Sep 2023 00:13:45 -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 97478385CC85 for ; Tue, 26 Sep 2023 07:13:38 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbg151.qq.com (smtpbg151.qq.com [18.169.211.239]) by sourceware.org (Postfix) with ESMTPS id EB0A13858D35 for ; Tue, 26 Sep 2023 07:13:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EB0A13858D35 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: bizesmtp70t1695712380trva76e7 Received: from rios-cad121.hadoop.rioslab.org ( [58.60.1.9]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 26 Sep 2023 15:12:59 +0800 (CST) X-QQ-SSF: 01400000000000G0V000000A0000000 X-QQ-FEAT: 3M0okmaRx3hUm9ORVaZA5CRVD7zm3zfiIt6BgglxyCQt6YjuUCueP/GXdIor4 aM/nfGkkaa3G5/OTGCd5qkLDKssjKoBdhA8gOfnGug/J3hcxYO75L5m/spDu4uroXkpS4M7 j47lD5H/CsazDDtZ0ChgMCbudp7u9ahM21tPIwVFyvkLBAr2VAEvu5vgJ3pV9Cq0B1BBryZ teXaYZo7sxNU1HBXBdWlqrwjd/ohE7LLfoVj23Bqy1nswaEgLQC+H7BnyouCMAXhQ6W4TVp ZfHkga65Wa227Q0pUcEkpD2T+6jg70Kbj9spqGC05pdH1iRZVsBsEy4eqaVuPfVTBkScM/W xebCBycDovXAYsI4fSBs/ouDZhTBqSiBDbGrngqTxc/BM2P/4TX2MSdVYTHt0kcdg9fTjA6 8suFs1CfPVF9Wv9nScRS8Q== X-QQ-GoodBg: 2 X-BIZMAIL-ID: 16661127206919629908 From: Juzhe-Zhong To: gcc-patches@gcc.gnu.org Cc: richard.sandiford@arm.com, rguenther@suse.de, pinskia@gmail.com, Juzhe-Zhong Subject: [PATCH] MATCH: Optimize COND_ADD_LEN reduction pattern Date: Tue, 26 Sep 2023 15:12:57 +0800 Message-Id: <20230926071257.129536-1-juzhe.zhong@rivai.ai> X-Mailer: git-send-email 2.36.3 MIME-Version: 1.0 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, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP 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: 1778083352699210294 X-GMAIL-MSGID: 1778083352699210294 This patch leverage this commit: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=62b505a4d5fc89 to optimize COND_LEN_ADD reduction pattern. We are doing optimization of VEC_COND_EXPR + COND_LEN_ADD -> COND_LEN_ADD. Consider thsi following case: #include void pr11594 (uint64_t *restrict a, uint64_t *restrict b, int loop_size) { uint64_t result = 0; for (int i = 0; i < loop_size; i++) { if (b[i] <= a[i]) { result += a[i]; } } a[0] = result; } Before this patch: vsetvli a7,zero,e64,m1,ta,ma vmv.v.i v2,0 vmv1r.v v3,v2 --- redundant .L3: vsetvli a5,a2,e64,m1,ta,ma vle64.v v1,0(a3) vle64.v v0,0(a1) slli a6,a5,3 vsetvli a7,zero,e64,m1,ta,ma sub a2,a2,a5 vmsleu.vv v0,v0,v1 add a1,a1,a6 vmerge.vvm v1,v3,v1,v0 ---- redundant. add a3,a3,a6 vsetvli zero,a5,e64,m1,tu,ma vadd.vv v2,v2,v1 bne a2,zero,.L3 li a5,0 vsetvli a4,zero,e64,m1,ta,ma vmv.s.x v1,a5 vredsum.vs v2,v2,v1 vmv.x.s a5,v2 sd a5,0(a0) ret After this patch: vsetvli a6,zero,e64,m1,ta,ma vmv.v.i v1,0 .L3: vsetvli a5,a2,e64,m1,ta,ma vle64.v v2,0(a4) vle64.v v0,0(a1) slli a3,a5,3 vsetvli a6,zero,e64,m1,ta,ma sub a2,a2,a5 vmsleu.vv v0,v0,v2 add a1,a1,a3 vsetvli zero,a5,e64,m1,tu,mu add a4,a4,a3 vadd.vv v1,v1,v2,v0.t bne a2,zero,.L3 li a5,0 vsetivli zero,1,e64,m1,ta,ma vmv.s.x v2,a5 vsetvli a5,zero,e64,m1,ta,ma vredsum.vs v1,v1,v2 vmv.x.s a5,v1 sd a5,0(a0) ret Bootstrap && Regression is running. Ok for trunk when testing passes ? PR tree-optimization/111594 PR tree-optimization/110660 gcc/ChangeLog: * match.pd: Optimize COND_LEN_ADD reduction. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/cond/cond_reduc-1.c: New test. * gcc.target/riscv/rvv/autovec/cond/pr111594.c: New test. --- gcc/match.pd | 13 +++++++++ .../riscv/rvv/autovec/cond/cond_reduc-1.c | 29 +++++++++++++++++++ .../riscv/rvv/autovec/cond/pr111594.c | 22 ++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_reduc-1.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c diff --git a/gcc/match.pd b/gcc/match.pd index a17778fbaa6..af8d12c138e 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -8866,6 +8866,19 @@ and, (IFN_COND_ADD @0 @1 (vec_cond @2 @3 integer_zerop) @1) (IFN_COND_ADD (bit_and @0 @2) @1 @3 @1)) +/* Detect simplication for a conditional length reduction where + + a = mask ? b : 0 + c = i < len + bias ? d + a : d + + is turned into + + c = mask && i < len ? d + b : d. */ +(simplify + (IFN_COND_LEN_ADD integer_minus_onep @0 (vec_cond @1 @2 zerop) @0 @3 @4) + (if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (type)) + (IFN_COND_LEN_ADD @1 @0 @2 @0 @3 @4))) + /* For pointers @0 and @2 and nonnegative constant offset @1, look for expressions like: diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_reduc-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_reduc-1.c new file mode 100644 index 00000000000..db6f9d1ec6c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_reduc-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=rv64gcv_zvfh -mabi=lp64d -fno-vect-cost-model -ffast-math -fdump-tree-optimized" } */ + +#include + +#define COND_REDUCTION(TYPE) \ + TYPE foo##TYPE (TYPE *restrict a, TYPE *restrict b, int loop_size) \ + { \ + TYPE result = 0; \ + for (int i = 0; i < loop_size; i++) \ + if (b[i] <= a[i]) \ + result += a[i]; \ + return result; \ + } + +COND_REDUCTION (int8_t) +COND_REDUCTION (int16_t) +COND_REDUCTION (int32_t) +COND_REDUCTION (int64_t) +COND_REDUCTION (uint8_t) +COND_REDUCTION (uint16_t) +COND_REDUCTION (uint32_t) +COND_REDUCTION (uint64_t) +COND_REDUCTION (_Float16) +COND_REDUCTION (float) +COND_REDUCTION (double) + +/* { dg-final { scan-tree-dump-not "VCOND_MASK" "optimized" } } */ +/* { dg-final { scan-tree-dump-times "COND_LEN_ADD" 11 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c new file mode 100644 index 00000000000..6d81b26fbd0 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -fno-vect-cost-model -ffast-math" } */ + +#include + +void +pr11594 (uint64_t *restrict a, uint64_t *restrict b, int loop_size) +{ + uint64_t result = 0; + + for (int i = 0; i < loop_size; i++) + { + if (b[i] <= a[i]) + { + result += a[i]; + } + } + + a[0] = result; +} + +/* { dg-final { scan-assembler-not {vmerge} } } */