From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id 75B98385AFA6 for ; Tue, 25 Jul 2023 16:35:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 75B98385AFA6 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1b89d47ffb6so29539505ad.2 for ; Tue, 25 Jul 2023 09:35:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1690302915; x=1690907715; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=P5cKD6V4CmgIvXhBj3QELudxy7DXsy7QKW8CflSVzAY=; b=kyHvntRqUgna3Z9ep3muvBLviZd2+iDYqy6taIeeSjPPVSA1imeiMwh7YFSnqFLcrK UaU9QC+JDnC8DsvHYTxshrTf/MY8tehavcEuxaQsLP6VyAPgThI98FXtF7CXZtqRPkxo ZqXvPC4LFntFz3BNBXa5vJMY2TeU8SKE+oaScL7Hwz+Fk02zxuTWXZOZzJeCThMSNAKy D/HFzmkZJUy0HwP8LUjwJsC1YY5azpM0j6TK+FjsQIVVWCUU0TrSo3GLsbkm6bh2QlLA gZYLP5he3+1VMTUgoBerPvgh+0qohWOUOU+03TlzYqQrVj952ZJ8FnaIu/DnfL8IDdYA 4glA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690302915; x=1690907715; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=P5cKD6V4CmgIvXhBj3QELudxy7DXsy7QKW8CflSVzAY=; b=c4IhGFWR+gGmZvobmsVXOMLgF+6jRL84N/M+u0IvQzZbHw0JeHacyGaXCJf8dFCeA6 TDj19v8W/xJbBKfi1PwZKZWn5zMHTYe2Og7BXCsc1OzmZ43oKYXQKnjDSoOl0vsZvTjs yeZcYta6rdweeA2+oeFbEOu9PNXZdVWikJpvwzAfgUe6LAjQ2JAH4eY5DpC9LNxIaJVU ljuMtarXqE0Z7uy912NjSAnnRP9y4kNKHoivk+wQ0uyi9n6rjUOLbQEBnWTzvUl3n/RV Hy7o6QQ2DXxd0yCOfj/bHftgh/hlHq5H74e3XVdx4nbxYOKw5/LUFzvB4eVWLIdGuXuo Ku2g== X-Gm-Message-State: ABy/qLZxZR/CIeq92s33lRNjg/NGOi2aImEVTEXdKt+Pyz8VgUvX+EXs 8tjtPIWTjY+uq6T593YEGO8= X-Google-Smtp-Source: APBJJlFxsMUzJ5PfsQ55kIhpg+NLj7znOLadUb4f4ZRWhY94MlgHrOQx7/YarNVHBIwIMg3Xj56M+g== X-Received: by 2002:a17:902:9f8f:b0:1ac:8be5:8787 with SMTP id g15-20020a1709029f8f00b001ac8be58787mr8560937plq.21.1690302914882; Tue, 25 Jul 2023 09:35:14 -0700 (PDT) Received: from [172.31.1.103] ([172.56.168.109]) by smtp.gmail.com with ESMTPSA id jo8-20020a170903054800b001bba27684b1sm4760827plb.272.2023.07.25.09.35.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 25 Jul 2023 09:35:14 -0700 (PDT) Message-ID: <7a159fa9-34e3-f8aa-996d-7a50833644e0@gmail.com> Date: Tue, 25 Jul 2023 10:35:12 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH 2/5] [RISC-V] Generate Zicond instruction for basic semantics Content-Language: en-US To: Xiao Zeng , gcc-patches@gcc.gnu.org Cc: research_trasio@irq.a4lg.com, kito.cheng@gmail.com, zhengyu@eswincomputing.com, eri-sw-toolchain@eswincomputing.com References: <20230719101156.21771-1-zengxiao@eswincomputing.com> <20230719101156.21771-3-zengxiao@eswincomputing.com> From: Jeff Law In-Reply-To: <20230719101156.21771-3-zengxiao@eswincomputing.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,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 List-Id: On 7/19/23 04:11, Xiao Zeng wrote: > This patch completes the recognition of the basic semantics > defined in the spec, namely: > > Conditional zero, if condition is equal to zero > rd = (rs2 == 0) ? 0 : rs1 > Conditional zero, if condition is non zero > rd = (rs2 != 0) ? 0 : rs1 > > gcc/ChangeLog: > > * config/riscv/riscv.md: Include zicond.md > * config/riscv/zicond.md: New file. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/zicond-primitiveSemantics.c: New test. > --- > gcc/config/riscv/riscv.md | 1 + > gcc/config/riscv/zicond.md | 84 +++++++++++++++++++ > .../riscv/zicond-primitiveSemantics.c | 49 +++++++++++ > 3 files changed, 134 insertions(+) > create mode 100644 gcc/config/riscv/zicond.md > create mode 100644 gcc/testsuite/gcc.target/riscv/zicond-primitiveSemantics.c > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > index d63b584a4c1..6b8c2e8e268 100644 > --- a/gcc/config/riscv/riscv.md > +++ b/gcc/config/riscv/riscv.md > @@ -3317,3 +3317,4 @@ > (include "sifive-7.md") > (include "thead.md") > (include "vector.md") > +(include "zicond.md") > diff --git a/gcc/config/riscv/zicond.md b/gcc/config/riscv/zicond.md > new file mode 100644 > index 00000000000..1cf28589c87 > --- /dev/null > +++ b/gcc/config/riscv/zicond.md > @@ -0,0 +1,84 @@ > +;; Machine description for the RISC-V Zicond extension > +;; Copyright (C) 2022-23 Free Software Foundation, Inc. > + > +;; This file is part of GCC. > + > +;; GCC is free software; you can redistribute it and/or modify > +;; it under the terms of the GNU General Public License as published by > +;; the Free Software Foundation; either version 3, or (at your option) > +;; any later version. > + > +;; GCC is distributed in the hope that it will be useful, > +;; but WITHOUT ANY WARRANTY; without even the implied warranty of > +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +;; GNU General Public License for more details. > + > +;; You should have received a copy of the GNU General Public License > +;; along with GCC; see the file COPYING3. If not see > +;; . > + > +(define_code_iterator eq_or_ne [eq ne]) > +(define_code_attr eqz [(eq "nez") (ne "eqz")]) > +(define_code_attr nez [(eq "eqz") (ne "nez")]) > + > + > +;; Special optimization under eq/ne in primitive semantics > +(define_insn "*czero.eqz..opt1" > + [(set (match_operand:GPR 0 "register_operand" "=r") > + (if_then_else:GPR (eq (match_operand:ANYI 1 "register_operand" "r") > + (const_int 0)) > + (match_operand:GPR 2 "register_operand" "1") > + (match_operand:GPR 3 "register_operand" "r")))] > + "TARGET_ZICOND && operands[1] == operands[2]" > + "czero.eqz\t%0,%3,%1" Interesting. We didn't have this pattern internally, though it's clever. I'm curious how often it triggered. Why did you need the operands[1] == operands[2] condition. I would hazard a guess the idea was to reject cases that weren't going to be profitable if LRA/reload needed to insert copies to satisfy the matching constraint? It may have been better to replace operand 2 with (match_dup 1). If that isn't viable, then the right check in the condition would have been REGNO (operands[1]) == REGNO (operands[2]). You need to be very careful comparing REG expressions for equality like you did. It probably works in this case, but it's pretty fragile in general. The problem while you can compare two pseudos using pointer equality, you can't necessarily do that for hard registers. What happens under the hood is you can have two distinct pseudos which get allocated to the same hard reg. At assignment time we just replace the underlying register # without going back and fixing all the REG expressions. Meaning that you can have: (reg:XX 12) and (reg:XX 12) Which are at distinct memory locations. Meaning that while the RTX expresssions look the same, they will fail the pointer equality check. So again, it probably works on your example, but I'd rather look for ways to bullet proof this better. The (match_dup) approach is probably the most preferred. Similarly for the other 3 patterns that have pointer equality tests for two operands in the insn condition. Jeff