From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id 4644A3890023 for ; Mon, 3 Jun 2024 17:03:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4644A3890023 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=dabbelt.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dabbelt.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4644A3890023 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::434 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717434242; cv=none; b=AI+/ml9HZDFIc2fp27M7emU5FhwqZJRc5sg6sHf12KsBPq6GWKp+VX2Ipc4EdfRUujq9phHlEDHuQO+6IndHy2gud4DYYmAJ/diHZGWRQUOt8j4a1PEjdQOQxz9kjaYKm1wP8t6HGfk/ZduLCOuktSw+g3CKyG0BflXkjnHuZuk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717434242; c=relaxed/simple; bh=Rze+8XkKv/jIMnaOx1l77br9RkSJhpvmnxy0+CQGNFE=; h=DKIM-Signature:Date:Subject:From:To:Message-ID:Mime-Version; b=L1pp0d6MgP/BXeHoB6xYK6Z21vTB8GV8yQUi4euFYqhNe8LCSJAf5uJCF7TY2C5J9m6SFsGLwJa3JQcRg3kAntt7CMQ13MqKnHr/gTK10HulqzIbuLmBvlYty1clzfjoXqFeIJMZm8trm9O8E4qJvNwWZpOeBy7SPMaC1uZu8QM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-7026ad046a2so964693b3a.2 for ; Mon, 03 Jun 2024 10:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt-com.20230601.gappssmtp.com; s=20230601; t=1717434237; x=1718039037; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:to:from:cc :in-reply-to:subject:date:from:to:cc:subject:date:message-id :reply-to; bh=vBH7OsqTf4hb24AoLKxxQXwNkOv7+YdHby9Q7j2Jssk=; b=nXgBy+p8of73oJJ0j7EFVxzuITTwgQZF7Va/PTR/wVdjjcJ430C7c8xC9EhiKa2n6b XfF2rtzBa7Lz3ltP7oUJUFRh1zWzp1yW4nRU5kPqeSTgK6JiZt6FUntjcHHz8uOJozDk X4F4SjRRyi1JYlxNcq4EBg0eNoIXdVzvyrC38QXB13aZ/rGUAsZesuVlzUKRosqzV9Rn JTKzUZi7IIUggPZqlc5z9nvMe3j0t+2cJjDAPC15pj4jGRUuroTXwIa8z+kqDl54Jrw4 x6aTQHA+6RdXNc4ofU8FgdzL/nR3nWUcliI2/Ah3udaMhGqc3c2roslaONyd74NKFXX+ izQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717434237; x=1718039037; h=content-transfer-encoding:mime-version:message-id:to:from:cc :in-reply-to:subject:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=vBH7OsqTf4hb24AoLKxxQXwNkOv7+YdHby9Q7j2Jssk=; b=Oapg93BwvpKE2aPi0SPI5hMX6t//lGvv8LQ4mOvcXddz0ShItwOxVghrZo3ghFX1oF 1OuYzhES4HZVb7xiW1zFEhQVyUW9W+8+eZQjUa1aXgGaD/0SfLkn95dNXbnAxhHAANK/ B23Ney1NYmWckEf3+EvyYJVZoenahGRZzLlIbnE2dj01Tb93mrt9/SUyB/iSn2wi/mh8 KatOy+cIsu68BBKoXwG9TB+BK7uAeDCrunLfgyxM0fO0v5GSUAekI5VO5BiAD80uKMQk LN0G6gLZwurghMLY9QBzy3qFOobKZOn2uLCPJ7KMeV5MzUDp+z1NB8cOMU60vUUPLCin n93w== X-Gm-Message-State: AOJu0Yz3SVRS8ZWQLbuTyOhn/flJOLnaR/cCOKle0QaPKfpsRu6KRcOP pEBTCeGQAt+8CPwvF2mTvX0sEj/eNQhTL7ctAHJo1yYk8LayKbOe4vTyl4epJvMXgeIBUsT7ox/ e X-Google-Smtp-Source: AGHT+IHblCX9AKRYPxsPNXiQgC04ICnZYMwnfzkOvNBnfDz1r8QtD3Mfyc9RhWXUkIdY/g96s9ED1w== X-Received: by 2002:a05:6a00:2d89:b0:702:5e60:14c1 with SMTP id d2e1a72fcca58-7025e6017e9mr5769795b3a.26.1717434236801; Mon, 03 Jun 2024 10:03:56 -0700 (PDT) Received: from localhost ([192.184.165.199]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-702423cb391sm5709621b3a.23.2024.06.03.10.03.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jun 2024 10:03:56 -0700 (PDT) Date: Mon, 03 Jun 2024 10:03:56 -0700 (PDT) X-Google-Original-Date: Mon, 03 Jun 2024 10:03:54 PDT (-0700) Subject: Re: [PATCH] RISC-V: Add min/max patterns for ifcvt. In-Reply-To: <7677685f-9436-4b92-a407-5973f433fd97@gmail.com> CC: gcc-patches@gcc.gnu.org, Robin Dapp , Kito Cheng , juzhe.zhong@rivai.ai, jeffreyalaw@gmail.com From: Palmer Dabbelt To: Robin Dapp Message-ID: Mime-Version: 1.0 (MHng) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,KAM_SHORT,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 Fri, 31 May 2024 08:07:11 PDT (-0700), Robin Dapp wrote: > Hi, > > ifcvt likes to emit > > (set > (if_then_else) > (ge (reg 1) (reg2)) > (reg 1) > (reg 2)) > > which can be recognized as min/max patterns in the backend. > This patch adds such patterns and the respective iterators as well as a > test. > > This depends on the generic ifcvt change. https://inbox.sourceware.org/gcc-patches/57bb6ce5-79c3-4b08-b524-e807b9ac431b@gmail.com/T/#u in case anyone's looking for it. > Regtested on rv64gcv_zvfh_zicond_zbb_zvbb. > > Regards > Robin > > gcc/ChangeLog: > > * config/riscv/bitmanip.md (*_cmp_3): > New min/max ifcvt pattern. > * config/riscv/iterators.md (minu): New iterator. > * config/riscv/riscv.cc (riscv_noce_conversion_profitable_p): > Remove riscv-specific adjustment. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/zbb-min-max-04.c: New test. > --- > gcc/config/riscv/bitmanip.md | 13 +++++ > gcc/config/riscv/iterators.md | 8 ++++ > gcc/config/riscv/riscv.cc | 3 -- > .../gcc.target/riscv/zbb-min-max-04.c | 47 +++++++++++++++++++ > 4 files changed, 68 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/riscv/zbb-min-max-04.c > > diff --git a/gcc/config/riscv/bitmanip.md b/gcc/config/riscv/bitmanip.md > index 8769a6b818b..11102985796 100644 > --- a/gcc/config/riscv/bitmanip.md > +++ b/gcc/config/riscv/bitmanip.md > @@ -547,6 +547,19 @@ (define_insn "*3" > "\t%0,%1,%z2" > [(set_attr "type" "")]) > > +;; Provide a minmax pattern for ifcvt to match. > +(define_insn "*_cmp_3" > + [(set (match_operand:X 0 "register_operand" "=r") > + (if_then_else:X > + (bitmanip_minmax_cmp_op > + (match_operand:X 1 "register_operand" "r") > + (match_operand:X 2 "register_operand" "r")) > + (match_dup 1) > + (match_dup 2)))] > + "TARGET_ZBB" > + "\t%0,%1,%z2" > + [(set_attr "type" "")]) This is a bit different than how we're handling the other min/max type attributes (define_insn "*3" [(set (match_operand:X 0 "register_operand" "=r") (bitmanip_minmax:X (match_operand:X 1 "register_operand" "r") (match_operand:X 2 "reg_or_0_operand" "rJ")))] "TARGET_ZBB" "\t%0,%1,%z2" [(set_attr "type" "")]) but it looks like it ends up with the same types after all the iterators (there's some "max vs smax" and "smax vs maxs" juggling, but IIUC it ends up in the same place). I think it'd be clunkier to try and use all the same iterators, though, so Reviewed-by: Palmer Dabbelt [I was wondering if we need the reversed, Jeff on the call says we don't. I couldn't figure out how to write a test for it.] > + > ;; Optimize the common case of a SImode min/max against a constant > ;; that is safe both for sign- and zero-extension. > (define_insn_and_split "*minmax" > diff --git a/gcc/config/riscv/iterators.md b/gcc/config/riscv/iterators.md > index 8a9d1986b4a..2f7be6e83c1 100644 > --- a/gcc/config/riscv/iterators.md > +++ b/gcc/config/riscv/iterators.md > @@ -202,6 +202,14 @@ (define_code_iterator bitmanip_bitwise [and ior]) > > (define_code_iterator bitmanip_minmax [smin umin smax umax]) > > +(define_code_iterator bitmanip_minmax_cmp_op [lt ltu le leu ge geu gt gtu]) > + > +; Map a comparison operator to a min or max. > +(define_code_attr bitmanip_minmax_cmp_insn [(lt "min") (ltu "minu") > + (le "min") (leu "minu") > + (ge "max") (geu "maxu") > + (gt "max") (gtu "maxu")]) > + > (define_code_iterator clz_ctz_pcnt [clz ctz popcount]) > > (define_code_iterator bitmanip_rotate [rotate rotatert]) > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > index 13cd61a4a22..d17c0a260a2 100644 > --- a/gcc/config/riscv/riscv.cc > +++ b/gcc/config/riscv/riscv.cc > @@ -4009,9 +4009,6 @@ riscv_noce_conversion_profitable_p (rtx_insn *seq, > { > struct noce_if_info riscv_if_info = *if_info; > > - riscv_if_info.original_cost -= COSTS_N_INSNS (2); > - riscv_if_info.original_cost += insn_cost (if_info->jump, if_info->speed_p); > - > /* Hack alert! When `noce_try_store_flag_mask' uses `cstore4' > to emit a conditional set operation on DImode output it comes up > with a sequence such as: > diff --git a/gcc/testsuite/gcc.target/riscv/zbb-min-max-04.c b/gcc/testsuite/gcc.target/riscv/zbb-min-max-04.c > new file mode 100644 > index 00000000000..ebf1889075d > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/zbb-min-max-04.c > @@ -0,0 +1,47 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=rv64gc_zicond_zbb -mabi=lp64d" } */ > +/* { dg-skip-if "" { *-*-* } { "-finline-functions" "-funroll-loops" "-ftracer" } } */ > + > +typedef int move_s; IIUC that typedef isn't used? > + > +int > +remove_one_fast (int *move_ordering, const int num_moves, int mark) > +{ > + int i, best = -1000000; > + int tmp = 0; > + > + for (i = mark; i < num_moves; i++) > + { > + if (move_ordering[i] > best) > + { > + best = move_ordering[i]; > + tmp = i; > + } > + } > + > + return tmp; > +} > + > +/* { dg-final { scan-assembler-times "max\t" 1 } } */ > +/* { dg-final { scan-assembler-times "czero.nez" 2 } } */ > +/* { dg-final { scan-assembler-times "czero.eqz" 2 } } */ > + > +int > +remove_one_fast2 (int *move_ordering, const int num_moves, int mark) > +{ > + int i, best = -1000000; > + int tmp = 0; > + > + for (i = mark; i < num_moves; i++) > + { > + if (move_ordering[i] < best) > + { > + best = move_ordering[i]; > + tmp = i; > + } > + } > + > + return tmp; > +} > + > +/* { dg-final { scan-assembler-times "min\t" 1 } } */