From patchwork Fri Sep 1 09:55:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robin Dapp X-Patchwork-Id: 137376 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:c792:0:b0:3f2:4152:657d with SMTP id b18csp773163vqu; Fri, 1 Sep 2023 02:57:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHT4UxhkmW4q4SCaljMULHoDpP6l+9oGZiRMl7qwHUwaUyrM9xEc1GH/cCHnmCWsfZ1616w X-Received: by 2002:a17:907:75cc:b0:9a2:232f:6f7f with SMTP id jl12-20020a17090775cc00b009a2232f6f7fmr1323947ejc.66.1693562232362; Fri, 01 Sep 2023 02:57:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693562232; cv=none; d=google.com; s=arc-20160816; b=Kc7oFkXF3P4BjMT4WQjneB8Jc0bHGd/ErH/aAtNbojz77sih8nHDe/g8NtERdqgE/Q Ogd8II9tL8qCPFF/s67nYoGhmdKpo6MzaFSVynxpY7Si52fb/XnbsDKW5jyPiksaZzP5 qp3iNPgEPZsddDCSxYlAb51vG1l8okPgzKPj+D16x/kzhHtA8T3E2ckpJBTNWPng80YH kXQYxZAcoL26+n59gCrqP6jGBssbrsjAI0kHbWw9r8T+cmg410Ugl4xlWKKY2u0KsGsB g/tlH7jS3QOULPfZW8xT75QU6PFWQ/9DbZ3SnEYX5cpvZvyu9ToK+LlqjqbMeDu6aFMR AvRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:subject:to:content-language:user-agent :mime-version:date:message-id:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=q2TaGY2GtNk38SFvyj65A/wAlpTr2cPTDk9suyVLtnQ=; fh=4HfgUNPS6U6GCu69UGnGXiyGkkKq6ElYRdFjjAexUWY=; b=hAiIPuAH4iZtGmrH2FGV8K6tpIv1Ftpwu9WtqETtStKWoMt2mFLzoZXhqIoVO9NAEg jU0OB2NIp5elanA2PwI8O1MXaxC3f9wVabx6yIKItCSkGkTJlWJDR2n5jD109Mmp5qOV 6FkJ0qX5bgjsvt1sbt7xIUA7PcKo2apfTSBW6Gwje37hEMcVQ0RWhKqv+aML4l3AblWQ Oz6w+k6b4x8rzjlvju6eCWdGOScMhhSgS1Z5mOaRSpQR3NmJ/IhQQ2LSJ4n/XMZCT3Fv 6Q3DMSatsHiRBpKToCDPbb/zQQz7hYsHQbOBl8Synfv/aNqIvcx9EMCiKvZoqVoFh/3c 5JNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=k0w3sTdD; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id s13-20020a1709064d8d00b0098e41199c5dsi2182766eju.417.2023.09.01.02.57.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 Sep 2023 02:57:12 -0700 (PDT) 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=@gcc.gnu.org header.s=default header.b=k0w3sTdD; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B782385697B for ; Fri, 1 Sep 2023 09:56:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8B782385697B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1693562212; bh=q2TaGY2GtNk38SFvyj65A/wAlpTr2cPTDk9suyVLtnQ=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=k0w3sTdDgLlfy0v4LrgFxwqT9plZDrsM037aySv3yo2kgP5yRJYt15bdT/swBpFE/ /Bt1sJ4nFlUugwpCnr5aekue4QHsQVyR5GTplXZoa2UAbXGIygpSPQHqkpNproie5F C+TJeayLPkKjM846eSbAmLEz2dItMJtkIDSS9hHM= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by sourceware.org (Postfix) with ESMTPS id 15EA13858D20 for ; Fri, 1 Sep 2023 09:55:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 15EA13858D20 Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-99bcc0adab4so211890366b.2 for ; Fri, 01 Sep 2023 02:55:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693562157; x=1694166957; h=content-transfer-encoding:subject:from:to:content-language:cc :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=q2TaGY2GtNk38SFvyj65A/wAlpTr2cPTDk9suyVLtnQ=; b=fIyFDRtYL2kXJQAYLy1bxFVZWJhvAo8Oa25qPjz3plX2X1N3j5/+4++Nl/7SYd3u8d 9iWVSaGLG7bOYuCQA+H50vZv5J3lgEiTI5HSOD+g5fDZ4wGnWUjFhrvj5qIhu36EQpqm wuXfX40k2L87zM9En5jl8xWdtqpS3YPjMDJSZz6goEvloXeeiJwFWTw4+X8AJLxlvTDl KfHVY1v4t4Fc+lhJ+3GrehkLKu0eLtky3MwblqAbVIYXSWscmBbn3Rw7/7pQpR2Wu2gl jfjFI0pSh2eJp9toW0wGkyD29ZpHjQ73/ZneK5E2o9ZNT3WSQSnlhd3OQdr7oPdMEh55 FbPQ== X-Gm-Message-State: AOJu0YzIcdQpY5DavNkE4jGYrxoEwaRjCDlMAo5jfsTKe5b6qazPtCbL 15tOL9F1MWsVfDipjPlVtS9R+0Jsx/o= X-Received: by 2002:a17:907:7793:b0:9a3:b0c9:81fe with SMTP id ky19-20020a170907779300b009a3b0c981femr1265672ejc.57.1693562157047; Fri, 01 Sep 2023 02:55:57 -0700 (PDT) Received: from [192.168.1.23] (ip-046-005-130-086.um12.pools.vodafone-ip.de. [46.5.130.86]) by smtp.gmail.com with ESMTPSA id i2-20020a1709064ec200b0099bc8db97bcsm1781968ejv.131.2023.09.01.02.55.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 01 Sep 2023 02:55:56 -0700 (PDT) Message-ID: Date: Fri, 1 Sep 2023 11:55:55 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Content-Language: en-US To: gcc-patches , palmer , Kito Cheng , jeffreyalaw , "juzhe.zhong@rivai.ai" Subject: [PATCH] RISC-V: Add vec_extract for BI -> QI. X-Spam-Status: No, score=-8.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Robin Dapp via Gcc-patches From: Robin Dapp Reply-To: Robin Dapp Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1775828711468269648 X-GMAIL-MSGID: 1775828711468269648 Hi, this patch adds a vec_extract expander that extracts a QImode from a vector mask mode. In doing so, it helps recognize a "live operation"/extract last idiom for mask modes. It fixes the ICE in tree-vect-live-6.c by circumventing the fallback code in extract_bit_field_1. The problem there is still latent, though, and needs to be addressed separately. Regards Robin gcc/ChangeLog: * config/riscv/autovec.md (vec_extractqi): New expander. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/partial/live-2.c: New test. * gcc.target/riscv/rvv/autovec/partial/live_run-2.c: New test. --- gcc/config/riscv/autovec.md | 36 +++++++++++++ .../riscv/rvv/autovec/partial/live-2.c | 31 +++++++++++ .../riscv/rvv/autovec/partial/live_run-2.c | 54 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live-2.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live_run-2.c diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index ebe1b10aa12..2e3e8e720a5 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -1409,6 +1409,42 @@ (define_expand "vec_extract" DONE; }) +;; ------------------------------------------------------------------------- +;; This extracts a bit (via QImode) from a bitmask vector. +;; ------------------------------------------------------------------------- +(define_expand "vec_extractqi" + [(set (match_operand:QI 0 "register_operand") + (vec_select:QI + (match_operand:VB 1 "register_operand") + (parallel + [(match_operand 2 "nonmemory_operand")])))] + "TARGET_VECTOR" +{ + /* Create an empty byte vector and set it to one under mask. */ + machine_mode qimode = riscv_vector::get_vector_mode + (QImode, GET_MODE_NUNITS (mode)).require (); + + rtx tmp1 = gen_reg_rtx (qimode); + emit_move_insn (tmp1, gen_const_vec_duplicate (qimode, GEN_INT (0))); + rtx ones = gen_const_vec_duplicate (qimode, GEN_INT (1)); + + rtx ops1[] = {tmp1, tmp1, ones, operands[1]}; + riscv_vector::emit_vlmax_insn (code_for_pred_merge (qimode), + riscv_vector::MERGE_OP, ops1); + + /* Slide down the requested byte element. */ + rtx tmp2 = gen_reg_rtx (qimode); + + rtx ops2[] = {tmp2, tmp1, operands[2]}; + riscv_vector::emit_vlmax_insn + (code_for_pred_slide (UNSPEC_VSLIDEDOWN, qimode), + riscv_vector::BINARY_OP, ops2); + + /* Extract it. */ + emit_insn (gen_pred_extract_first (qimode, operands[0], tmp2)); + DONE; +}) + ;; ------------------------------------------------------------------------- ;; ---- [FP] Binary operations ;; ------------------------------------------------------------------------- diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live-2.c new file mode 100644 index 00000000000..69c2a44219a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live-2.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d -fno-vect-cost-model --param riscv-autovec-preference=scalable -fdump-tree-optimized-details" } */ + +#include + +#define EXTRACT_LAST(TYPE) \ + _Bool __attribute__ ((noipa)) \ + test_##TYPE (TYPE *restrict x, TYPE *restrict y, int n) \ + { \ + _Bool last; \ + for (int j = 0; j < n; ++j) \ + { \ + last = !x[j]; \ + y[j] = last; \ + } \ + return last; \ + } + +#define TEST_ALL(T) \ + T (int8_t) \ + T (int16_t) \ + T (int32_t) \ + T (int64_t) \ + T (uint8_t) \ + T (uint16_t) \ + T (uint32_t) \ + T (uint64_t) + +TEST_ALL (EXTRACT_LAST) + +/* { dg-final { scan-tree-dump-times "\.VEC_EXTRACT" 8 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live_run-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live_run-2.c new file mode 100644 index 00000000000..80d076bcf74 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/live_run-2.c @@ -0,0 +1,54 @@ +/* { dg-do run { target { riscv_vector } } } */ +/* { dg-additional-options "--param riscv-autovec-preference=scalable" } */ + +#include "live-2.c" + +#define TEST_LOOP(TYPE, N) \ + { \ + TYPE a##N[N]; \ + TYPE b##N[N]; \ + for (int i = 0; i < N; ++i) \ + { \ + a##N[i] = i & 1; \ + b##N[i] = 0; \ + asm volatile ("" ::: "memory"); \ + } \ + TYPE expected##N = !(a##N[N - 1]); \ + TYPE res##N = test_##TYPE (a##N, b##N, N); \ + if (res##N != expected##N) \ + __builtin_abort (); \ + for (int i = 0; i < N; ++i) \ + { \ + if (b##N[i] != !a##N[i]) \ + __builtin_abort (); \ + asm volatile ("" ::: "memory"); \ + } \ + } + +#define TEST_ALL_N(T, N) \ + T (int8_t, N) \ + T (int16_t, N) \ + T (int32_t, N) \ + T (int64_t, N) \ + T (uint8_t, N) \ + T (uint16_t, N) \ + T (uint32_t, N) \ + T (uint64_t, N) + +int __attribute__ ((optimize (1))) main (void) +{ + TEST_ALL_N (TEST_LOOP, 2); + TEST_ALL_N (TEST_LOOP, 3); + TEST_ALL_N (TEST_LOOP, 4); + TEST_ALL_N (TEST_LOOP, 5); + TEST_ALL_N (TEST_LOOP, 6); + TEST_ALL_N (TEST_LOOP, 7); + TEST_ALL_N (TEST_LOOP, 8); + TEST_ALL_N (TEST_LOOP, 17); + TEST_ALL_N (TEST_LOOP, 64); + TEST_ALL_N (TEST_LOOP, 107); + TEST_ALL_N (TEST_LOOP, 255); + TEST_ALL_N (TEST_LOOP, 256); + TEST_ALL_N (TEST_LOOP, 4389); + return 0; +}