From patchwork Sun Nov 13 21:20:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Tomsich X-Patchwork-Id: 19456 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1837033wru; Sun, 13 Nov 2022 13:23:57 -0800 (PST) X-Google-Smtp-Source: AA0mqf7/ZYtvlSjUqgHjMZbYaCivTwqVZA2dgRnYFwuHCZIGd6z6Y79bTZBKrb1tV3q6AN0oI/pS X-Received: by 2002:a17:906:5ac6:b0:7ad:ab0e:76aa with SMTP id x6-20020a1709065ac600b007adab0e76aamr8255685ejs.435.1668374637758; Sun, 13 Nov 2022 13:23:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668374637; cv=none; d=google.com; s=arc-20160816; b=O8qxg0V72gDSxs6BIeeMcjo1oYSXv1jamgNzFu5aOcqFIzQ9gHoVJ1O38FDlMIsBLl RO8DBga2WId7TSVrjyP94LOtcGfxVeL3zH+7KoKYIdiRFENtwuJ+zk0sE9Can+gIJ6/4 qZ6p76Io8AUtADwsTkY0EPzOjfglfp/Fo+x6/JdpQ/Nq9ZyzrLxrxn0OwsojpORmOeqg v9WaqYivdPOHA/DBkHsG5yn6s2mOFfTrJh0Ah9v87OewkmwUL2/Z6yBH5nZ21Omr0DwB gDd5gP5FeMbRRlGyycufCtfZIrdeg3i0Vd/RxCq5jDpNMt8ABHm2JmWJLDODgV9xRz4j 4CGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:dmarc-filter:delivered-to; bh=b3VGfLPXdNiqtWor6/bIjoP03UtomcZJKF6AQhGr5xo=; b=rpBbYiUq63vD8HP6gbkw/B6wJbIEAkY7LPxAMuPSBkzvJN+WeJwnizBfcgqXcjbhpJ eA9tMaB/TSkflTMcgGzTznBCCw4jQGtgqqaP6Gmgs1plbb6TeoqGO6jxNM+k/MdH8piv WB9mF0fRdFLMVO3r1BES3khACu9djyXTqdewvokjx/Em/yKy6mcXEUg3X70v/MIQTEI+ k8QFGWhcnfKrt0I8UDd2ItAJW+3O7rtfH4L/NXjFEvYOgseqrhWHUSM0XaX26ukAEU9U dBUFRHAY9xQg4qoEQ1mSsQ+Xee7Ki5RFWLzlmLGh7aHVnT035GYHRmu6D/YsnaL2NbFg w3sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@vrull.eu header.s=google header.b=r6Gd3i34; 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 sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id ko16-20020a170907987000b0078d473448afsi6097125ejc.233.2022.11.13.13.23.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Nov 2022 13:23:57 -0800 (PST) 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; dkim=pass header.i=@vrull.eu header.s=google header.b=r6Gd3i34; 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 DA32F3889E2A for ; Sun, 13 Nov 2022 21:21:35 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by sourceware.org (Postfix) with ESMTPS id 217CC388552B for ; Sun, 13 Nov 2022 21:20:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 217CC388552B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu Received: by mail-lf1-x130.google.com with SMTP id b3so16358823lfv.2 for ; Sun, 13 Nov 2022 13:20:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=b3VGfLPXdNiqtWor6/bIjoP03UtomcZJKF6AQhGr5xo=; b=r6Gd3i34hd/75LY+TFfsn6pYejrSVyIBjrF7kreGiu2kFQhyOFYT9WXjrgZcOysFsa 10a9pPTh4cQYIS/uby6Vw8AR3qNA03daPlELzDKiBx3IbTfsFllBoimk1qPu7ITmInfc tLGk34Tk0pYE3rSQawIKrjCaXNXr7KPjNe0K2z0Om4FVekz+xe3GBElhW41cZTgVpdxZ Vq/aFs52rilB/LkSDRTOcWhtAYhms+yu8+elg2A3OBW4BmhZ5xJeSNvt2fqUXLrhqVbK svpNUXzPvZxe0Akfz24xp3zvvgbm67izFnI9BXf6iAJIhbzyUUqmvlXbS1l600/ZjlMJ L9jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=b3VGfLPXdNiqtWor6/bIjoP03UtomcZJKF6AQhGr5xo=; b=vetoJOaVXMBzp/iPYgVd6rGBxE++H6qvH3dOLPjTlgy8GvAss+n9DOW/Xiz7yZjTNV MatT+/3MVKWofKOCLGFf5lUdgtORA5w4PV6On14+9Ka1AK141aVCD/1y7buHm9mP362p Fs5wNCrbg9mS3QlHu4y9E3nPvxqzUcmeYAQlKjmDy3+DtrSZeTfbFIfGVDRrw4mOISvk 5UF9qDthG08gaCVaYbRSf0wrdmZ+FCICyeSUpTPEDc4w+tHl/uoUFC4WR9BTr3pfq5uB Rs33n2L2bkXvlIq6tX/mbjZ1AHcjyOfCj/r8BM6QjwptD8SoccDz0vkUdl8PRcNoVVUK EAew== X-Gm-Message-State: ANoB5pmI3cN8iAtqMeXM1Xn1mvjg9TjjqcmmR/N19g8NRm9yrPbmyEMi E73lSWog6x8v8F+lCKKRtx2RsDrL8LMHEpmC X-Received: by 2002:a05:6512:2a8f:b0:4b4:9196:af54 with SMTP id dt15-20020a0565122a8f00b004b49196af54mr1992278lfb.686.1668374441115; Sun, 13 Nov 2022 13:20:41 -0800 (PST) Received: from ubuntu-focal.. ([2a01:4f9:3a:1e26::2]) by smtp.gmail.com with ESMTPSA id d5-20020a0565123d0500b004948ddb4e4dsm1529079lfv.301.2022.11.13.13.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Nov 2022 13:20:40 -0800 (PST) From: Philipp Tomsich To: gcc-patches@gcc.gnu.org Cc: Jeff Law , Vineet Gupta , Kito Cheng , Christoph Muellner , Palmer Dabbelt , Philipp Tomsich , Henry Brausen Subject: [PATCH v2 6/8] RISC-V: Support immediates in XVentanaCondOps Date: Sun, 13 Nov 2022 22:20:27 +0100 Message-Id: <20221113212030.4078815-7-philipp.tomsich@vrull.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221113212030.4078815-1-philipp.tomsich@vrull.eu> References: <20221113212030.4078815-1-philipp.tomsich@vrull.eu> MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_SHORT, LIKELY_SPAM_BODY, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, 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.29 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 Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749417604390753330?= X-GMAIL-MSGID: =?utf-8?q?1749417604390753330?= When if-conversion encounters sequences using immediates, the sequences can't trivially map back onto vt.maskc/vt.maskcn (even if benefitial) due to vt.maskc and vt.maskcn not having immediate forms. This adds a splitter to rewrite opportunities for XVentanaCondOps that operate on an immediate by first putting the immediate into a register to enable the non-immediate vt.maskc/vt.maskcn instructions to operate on the value. Consider code, such as long func2 (long a, long c) { if (c) a = 2; else a = 5; return a; } which will be converted to func2: seqz a0,a2 neg a0,a0 andi a0,a0,3 addi a0,a0,2 ret Following this change, we generate li a0,3 vt.maskcn a0,a0,a2 addi a0,a0,2 ret This commit also introduces a simple unit test for if-conversion with immediate (literal) values as the sources for simple sets in the THEN and ELSE blocks. The test checks that Ventana's conditional mask instruction (vt.maskc) is emitted as part of the resultant branchless instruction sequence. gcc/ChangeLog: * config/riscv/xventanacondops.md: Support immediates for vt.maskc/vt.maskcn through a splitter. gcc/testsuite/ChangeLog: * gcc.target/riscv/xventanacondops-ifconv-imm.c: New test. Signed-off-by: Philipp Tomsich Reviewed-by: Henry Brausen --- Ref #204 (no changes since v1) gcc/config/riscv/xventanacondops.md | 24 +++++++++++++++++-- .../riscv/xventanacondops-ifconv-imm.c | 19 +++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/xventanacondops-ifconv-imm.c diff --git a/gcc/config/riscv/xventanacondops.md b/gcc/config/riscv/xventanacondops.md index 81e5e8a8298..e3e109828a2 100644 --- a/gcc/config/riscv/xventanacondops.md +++ b/gcc/config/riscv/xventanacondops.md @@ -29,6 +29,26 @@ "TARGET_XVENTANACONDOPS" "vt.maskc\t%0,%2,%1") +;; XVentanaCondOps does not have immediate forms, so we need to do extra +;; work to support these: if we encounter a vt.maskc/n with an immediate, +;; we split this into a load-immediate followed by a vt.maskc/n. +(define_split + [(set (match_operand:DI 0 "register_operand") + (and:DI (neg:DI (match_operator:DI 1 "equality_operator" + [(match_operand:DI 2 "register_operand") + (const_int 0)])) + (match_operand:DI 3 "immediate_operand"))) + (clobber (match_operand:DI 4 "register_operand"))] + "TARGET_XVENTANACONDOPS" + [(set (match_dup 4) (match_dup 3)) + (set (match_dup 0) (and:DI (neg:DI (match_dup 1)) + (match_dup 4)))] +{ + /* Eliminate the clobber/temporary, if it is not needed. */ + if (!rtx_equal_p (operands[0], operands[2])) + operands[4] = operands[0]; +}) + ;; Make order operators digestible to the vt.maskc logic by ;; wrapping their result in a comparison against (const_int 0). @@ -37,7 +57,7 @@ [(set (match_operand:X 0 "register_operand") (and:X (neg:X (match_operator:X 1 "anyge_operator" [(match_operand:X 2 "register_operand") - (match_operand:X 3 "register_operand")])) + (match_operand:X 3 "arith_operand")])) (match_operand:X 4 "register_operand"))) (clobber (match_operand:X 5 "register_operand"))] "TARGET_XVENTANACONDOPS" @@ -54,7 +74,7 @@ [(set (match_operand:X 0 "register_operand") (and:X (neg:X (match_operator:X 1 "anygt_operator" [(match_operand:X 2 "register_operand") - (match_operand:X 3 "register_operand")])) + (match_operand:X 3 "arith_operand")])) (match_operand:X 4 "register_operand"))) (clobber (match_operand:X 5 "register_operand"))] "TARGET_XVENTANACONDOPS" diff --git a/gcc/testsuite/gcc.target/riscv/xventanacondops-ifconv-imm.c b/gcc/testsuite/gcc.target/riscv/xventanacondops-ifconv-imm.c new file mode 100644 index 00000000000..0012e7b669c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/xventanacondops-ifconv-imm.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc_xventanacondops -mabi=lp64" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */ + +/* Each function below should emit a vt.maskcn instruction */ + +long +foo0 (long a, long b, long c) +{ + if (c) + a = 0; + else + a = 5; + return a; +} + +/* { dg-final { scan-assembler-times "vt.maskcn\t" 1 } } */ +/* { dg-final { scan-assembler-not "beqz\t" } } */ +/* { dg-final { scan-assembler-not "bnez\t" } } */