From patchwork Wed Dec 20 06:50:11 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: 181485 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:24d3:b0:fb:cd0c:d3e with SMTP id r19csp2457521dyi; Tue, 19 Dec 2023 22:50:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IG3gD67+xtkdEtDtfo3W0t+tE3dTJNdoi6vbjsjvxtJ2BcMqLq+dtL09djZtcNOIdA+AZ4m X-Received: by 2002:ad4:5f09:0:b0:67f:4f8b:8f31 with SMTP id fo9-20020ad45f09000000b0067f4f8b8f31mr3904424qvb.31.1703055049523; Tue, 19 Dec 2023 22:50:49 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1703055049; cv=pass; d=google.com; s=arc-20160816; b=QWOdDWxgYkkkQXPUerIg74xD+d+rfwV6HkQQUsHRTKnXLKBIL7FNbO8OITfOrXGWJ8 eMabt5uyyN0A3RPwZBfvyASnC67RmC5/TcQ4CAMgxPyq6lYM3hWJns7Mr0dxhQX4zwyR OQBWsKqtSPSgpu9VM/cor/Rr4kro5+0oz+j4o2NTMTrMuZqU9Nxe0+sXdpNMd2sOpSZz KK1oXCaq+f9Qkvz/dBNP3vy7qHMrmQoISGYUEe83bFAgpjkd7tqk5qZ6I2dRyvUxt6DL 5VPpGLiPqNLbOuGwjjjZniwpKsNLC+Zgd2aT0kAvYxjdJcr2ZZxVL+lrPd7VnGVJC0kc aNoA== 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:feedback-id :content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:arc-filter:dmarc-filter:delivered-to; bh=XDkds2Z75oJ8rErGsiK1ZxKKmsxGKmsgX5NMs/UMHSQ=; fh=12MRPJmZ1mgDpHqWoogMKqnaGRGM2b7lcuJroqfjJiw=; b=anoe4xzJ244QDQ3Hl5vrwYfHZ7SH8c+o7S4S04gecq9S1K+dLXyu98YbE/0CYEoqG0 RDTrGEI7GoNvb74rV8C6DfHWbsF1Xl49xziB3Q6j0soB4+nKYo+HLRwKfRxwx9BeeVbM T1GepFbWigcO53gminnRxkq5Xbte74b/kYqs63VB0mZ0jpHBSBQdCGE1001sF7G4Zj1k zCHai46TDIB1+8RKb1KCYD+svm4bhONztmu9uwmEU0gKwiwFXTHGibtoDQ9rJ/ZHIW3G 92scgyUFqIiJao7NiHpXPXEoSRt9D0JrEhZCeLAeDmIU4H8X5aTA+Bmltnyhx3SlWUTd peIw== 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" Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id s7-20020a0cdc07000000b0067f68144c3bsi1819672qvk.365.2023.12.19.22.50.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 22:50:49 -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" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3A1BF38618A0 for ; Wed, 20 Dec 2023 06:50:49 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) by sourceware.org (Postfix) with ESMTPS id AE3093861806 for ; Wed, 20 Dec 2023 06:50:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE3093861806 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai ARC-Filter: OpenARC Filter v1.0.0 sourceware.org AE3093861806 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=54.207.19.206 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703055025; cv=none; b=x0xHvpVqr+YFj84vwbVbRLvsiFL0twTNVBbKotnW/rCPOy0ou+Z7omjGMfrkruop1qUBePgJsPzo8ip2PLxifiUZ8LL1t8dxHbKN2cz+AlGZW/fWoxQpN0W30Z836w74kV4EWMQVZnypP54FNat8Ey/42w3WQYi4d8IUamo/gV8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703055025; c=relaxed/simple; bh=qPod2cOX80E/sT6Z95s2YEPrqhUm6s4wZBi+Xnf52yA=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=rtKVr4sabg9m0ugRz3UbHS1I/fEocYSQRUm2juVP53e3dQUjeoEAFr+N2quT/5q0rICsuW4RihDvNMVSH/R4IwPhewZqF663rPW2+d+fta9dOmLbTch2USKioPwD5oMninf+bKsZJIN0+1ytrMbsItRi/YfSld4CSrJP747JCsg= ARC-Authentication-Results: i=1; server2.sourceware.org X-QQ-mid: bizesmtp65t1703055013tlaohky7 Received: from rios-cad121.hadoop.rioslab.org ( [58.60.1.9]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 20 Dec 2023 14:50:12 +0800 (CST) X-QQ-SSF: 01400000000000G0V000000A0000000 X-QQ-FEAT: cvpDInk2tjW/kP6rK4Co9cgIyNZYac4dG0dbtOKy0sL+FntKFoGl3c4OogXkI iEHt3MT0R9znTyEqVkPWwy/MSvXBYtGa4f4WzCyL/vqUslkLpwr6W3oruujqaKXTR0GRrHS QGIVoEOTGI/4joqT8o5dUJ+2B7Ssms0x8ji1Ndb8bjzF8CJOqlMwlBlCXsKLub+H3GJBxDR ueJBKUfsqn/fsjgrcUvIcBVKzio+xe6Q//9am6EDfT9HKqEwfZrBixVfVKmdz998DsIxf8v Wxlmr4MxyDbMF6zoSCMKgQsplAjiKOdhnwZTiMllmUoZJfCfNuyO2oD+qKbS012EIicw0Aa JoG0S2/Jql3mx8Lr3dqq31o8Jir/B/YEhvFRaDFbxEsuPvWnTm7YXpNgwjpjNuE3LdQcUbo yqM2NEZGvho= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 12284277938912589088 From: Juzhe-Zhong To: gcc-patches@gcc.gnu.org Cc: kito.cheng@gmail.com, kito.cheng@sifive.com, jeffreyalaw@gmail.com, rdapp.gcc@gmail.com, Juzhe-Zhong Subject: [PATCH] RISC-V: Fix bug of VSETVL fusion Date: Wed, 20 Dec 2023 14:50:11 +0800 Message-Id: <20231220065011.2696544-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.1 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_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.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: 1785782651556782560 X-GMAIL-MSGID: 1785782651556782560 This patch fixes bugs in the fusion of this following case: li a5,-1 vmv.s.x v0,a5 -> demand any non-zero AVL vsetvli a5, ... Incorrect fusion after VSETVL PASS: li a5,-1 vsetvli a5... vmv.s.x v0, a5 --> a5 is modified as incorrect value. We disallow this incorrect fusion above. Full coverage testing of RV64 and RV32 no regression. PR target/113087 gcc/ChangeLog: * config/riscv/riscv-vsetvl.cc: Disallow fusion when VL modification pollutes non AVL use. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/pr113087-1.c: New test. --- gcc/config/riscv/riscv-vsetvl.cc | 41 ++++++++++++- .../gcc.target/riscv/rvv/autovec/pr113087-1.c | 60 +++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 6af8d8429ab..eabaef80f89 100644 --- a/gcc/config/riscv/riscv-vsetvl.cc +++ b/gcc/config/riscv/riscv-vsetvl.cc @@ -1128,6 +1128,27 @@ public: return gen_vsetvl_discard_result (Pmode, avl, sew, vlmul, ta, ma); } + /* Return true that the non-AVL operands of THIS will be modified + if we fuse the VL modification from OTHER into THIS. */ + bool vl_modify_non_avl_op_p (const vsetvl_info &other) const + { + /* We don't need to worry about any operands from THIS be + modified by OTHER vsetvl since we OTHER vsetvl doesn't + modify any operand. */ + if (!other.has_vl ()) + return false; + + /* THIS VL operand always preempt OTHER VL operand. */ + if (this->has_vl ()) + return false; + + /* If THIS has non IMM AVL and THIS is AVL compatible with + OTHER, the AVL value of THIS is same as VL value of OTHER. */ + if (!this->has_imm_avl ()) + return false; + return find_access (this->get_insn ()->uses (), REGNO (other.get_vl ())); + } + bool operator== (const vsetvl_info &other) const { gcc_assert (!uninit_p () && !other.uninit_p () @@ -1896,6 +1917,20 @@ public: gcc_unreachable (); } + bool vl_not_in_conflict_p (const vsetvl_info &prev, const vsetvl_info &next) + { + /* We don't fuse this following case: + + li a5, -1 + vmv.s.x v0, a5 -- PREV + vsetvli a5, ... -- NEXT + + Don't fuse NEXT into PREV. + */ + return !prev.vl_modify_non_avl_op_p (next) + && !next.vl_modify_non_avl_op_p (prev); + } + bool avl_compatible_p (const vsetvl_info &prev, const vsetvl_info &next) { gcc_assert (prev.valid_p () && next.valid_p ()); @@ -1953,7 +1988,8 @@ public: { bool compatible_p = sew_lmul_compatible_p (prev, next) && policy_compatible_p (prev, next) - && avl_compatible_p (prev, next); + && avl_compatible_p (prev, next) + && vl_not_in_conflict_p (prev, next); return compatible_p; } @@ -1961,7 +1997,8 @@ public: { bool available_p = sew_lmul_available_p (prev, next) && policy_available_p (prev, next) - && avl_available_p (prev, next); + && avl_available_p (prev, next) + && vl_not_in_conflict_p (prev, next); gcc_assert (!available_p || compatible_p (prev, next)); return available_p; } diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c new file mode 100644 index 00000000000..7b743effc79 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c @@ -0,0 +1,60 @@ +/* { dg-do run } */ +/* { dg-options "-O3" } */ +/* { dg-require-effective-target riscv_v } */ + +#include +int (e) (int g, int h) { return h > 0x10 || g > 0xFFFFFFFF >> h ? g : g << h; } +struct i +{ + int j; + int l : 1; +}; +struct m +{ + char k; + int n; +}; +char o; +char p; +short s; +int q; +struct m r; +int v; +int t; +short z; +long ac; +int ad; +int ae; + +static void +ai (struct i bf) +{ + for (; v; v++) + r.k = 0; + do + ac ^= bf.j; + while (bf.j < 0); + s = 0; + if (bf.l) + q |= 0x800; +} + +int +main () +{ + struct i aw = {0xE00, 1}; + o = 4; + s = p; + ai (aw); + t = 1; + ++p; + for (; t <= 7; t++) + { + ad &= 1; + (o &= 1 - e (0x40000012, ++ae)) & (z |= 1); + } + for (; r.n;) + ; + assert (o == 4); + return 0; +}