From patchwork Tue Sep 26 09:50:37 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: 144798 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:cae8:0:b0:403:3b70:6f57 with SMTP id r8csp1791471vqu; Tue, 26 Sep 2023 02:51:20 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGq1OPvCf94Z4Y7DKRlFLl9PmEdKHl0y70DwqEUbV0ZMcfQhSJcpNXZZ29HpyrcxGdKSKwg X-Received: by 2002:a05:6512:110f:b0:503:7c0:ae96 with SMTP id l15-20020a056512110f00b0050307c0ae96mr8808720lfg.20.1695721880688; Tue, 26 Sep 2023 02:51:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695721880; cv=none; d=google.com; s=arc-20160816; b=AhWkSMLqGUexUIBZWY65KvVud087FxBkzNluZjgfi06/6UMizRHagzXQLHcv22Lgne YKu45QaeRDGAGW0wH5tfNBWLQz+gg0j7OX8cmsZBd4wZrd+UG09ubK27K8cLRcpI832F RvuSlJxoa8lplyuE0YYFJ9U8b+ojRej+ITsId2jrQMdG2kzFx6QGc/DjMR6mWGGDZ4Pe L2MVjgXYpfXG62fsm0vOqFWWebDmoN5t771xvmgsav5lsNQXGJcZYlkpJjCjf+PEojxZ TGHPeSY32EoJxAJp7pbbxM4JitEd31aeivpo7vSDWZrNtpe2L96VU5AZv/TvL3px729d +6Bw== 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=bObx7sU4Tz9zGrd220jLL+vlXdlNP3rLX3vu7NtGJRM=; fh=Hxj0cw/2jAkyitv6gv3v4BQlApRvZwleU4172JThTNQ=; b=ti/QhHIuyNIYBKoLnsHCBTx16Joqa/Efs7ktKFTaJt5Sc1B68DvNlFb1VbkbDb5f3H UwpOudY5Qr5n19626JYxf/1y/yG6oHWAF3yyS7MGgLtP3EaCJD3lPfkilrO3PXPVX9td 5M/bOR5nj632pyPachv0SMbXE1ykMr/cBpHQK2Dc6TLz9MLzJeb1613v/hoEFx4zVP3X f691x5GGs3boljfS4rAaH/kMV4YUInZqJz5gIrPMJG8I+9k/pt7NhgpI+ZT2RCjt7LqQ vhQ2rEQT1vCUO5RWpDaeNHhr73LqNvXq6+pJSOEtdhLcmM9GPzyzeTIjn+Mw3iXAWT0H 4d5Q== ARC-Authentication-Results: i=1; mx.google.com; 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" Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id o24-20020a056402039800b005312692eebfsi4843378edv.150.2023.09.26.02.51.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Sep 2023 02:51:20 -0700 (PDT) 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; 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" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1B609385C6E2 for ; Tue, 26 Sep 2023 09:51:18 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) by sourceware.org (Postfix) with ESMTPS id 740913858D35 for ; Tue, 26 Sep 2023 09:50:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 740913858D35 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: bizesmtp72t1695721840t360koqe Received: from rios-cad121.hadoop.rioslab.org ( [58.60.1.9]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 26 Sep 2023 17:50:38 +0800 (CST) X-QQ-SSF: 01400000000000G0V000000A0000000 X-QQ-FEAT: RrZlkntZBfnQhBiQLemDsAq4YwPgT6vbNX4KyIFW8J9LlIBLjX7lFwE+x4nWW qFllUUQfIpJmfb3eowW0JFY9EWoTSBVmUZNLZU5W7rbyU7iHVi6EV0knxmXV+L6g4JgB9kq dt6UrEOFdFh+LPyACmyFQAaCyV9dXgIKiF/uhoS1iTZOI5tARHqQxZraf994x/C/COETUOq c0sYKsR5gEwZ/EhMzrgcCm7oMK2j9ClG9Dak9bpcU4L5axmUM1ZuSLd9MaFboGdPdm/vGQf gHN1U3zBfp6zREzEeaxqtsfJ+IOYqxi6d5dOA5QhjpcVgLQmvEUWYgTJ3ew/c4LcvQ0MTU3 8qBcPUSxEMmEPCacsDae/wjit1EcX3LWtWrlrbyoIKT7e8KyyZZbi5TzQjan5zTQvp/dHyi ItSkKQl1SY9FueaROSC5sEfvI9h9IKuP X-QQ-GoodBg: 2 X-BIZMAIL-ID: 18390392660069313275 From: Juzhe-Zhong To: gcc-patches@gcc.gnu.org Cc: richard.sandiford@arm.com, rguenther@suse.de, Juzhe-Zhong Subject: [PATCH V3] MATCH: Optimize COND_ADD_LEN reduction pattern Date: Tue, 26 Sep 2023 17:50:37 +0800 Message-Id: <20230926095037.1288981-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_H3, RCVD_IN_MSPIKE_WL, SPF_PASS, TXREP, T_SPF_HELO_TEMPERROR 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: 1778093267153074661 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 | 15 ++++++++++ .../riscv/rvv/autovec/cond/cond_reduc-1.c | 29 +++++++++++++++++++ .../riscv/rvv/autovec/cond/pr111594.c | 22 ++++++++++++++ 3 files changed, 66 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..3ce90c3333b 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -8866,6 +8866,21 @@ 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 + bias ? d + b : d. */ +(simplify + (IFN_COND_LEN_ADD integer_truep @0 (vec_cond @1 @2 zerop@5) @0 @3 @4) + (if (ANY_INTEGRAL_TYPE_P (type) + || (FLOAT_TYPE_P (type) + && fold_real_zero_addition_p (type, NULL_TREE, @5, 0))) + (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} } } */