{"id":2231282,"url":"http://patchwork.ozlabs.org/api/patches/2231282/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260430132307.231541-1-wangzicong@masscore.cn/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260430132307.231541-1-wangzicong@masscore.cn>","list_archive_url":null,"date":"2026-04-30T13:23:07","name":"[v3] RISC-V: Make tuple vector not tieable to some modes.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"2d784b3be8514e4ecaa3f52cf64e84922588af22","submitter":{"id":93140,"url":"http://patchwork.ozlabs.org/api/people/93140/?format=json","name":"wangzicong","email":"wangzicong@masscore.cn"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260430132307.231541-1-wangzicong@masscore.cn/mbox/","series":[{"id":502305,"url":"http://patchwork.ozlabs.org/api/series/502305/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502305","date":"2026-04-30T13:23:07","name":"[v3] RISC-V: Make tuple vector not tieable to some modes.","version":3,"mbox":"http://patchwork.ozlabs.org/series/502305/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2231282/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2231282/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n dmarc=none (p=none dis=none) header.from=masscore.cn","sourceware.org; spf=none smtp.mailfrom=masscore.cn","server2.sourceware.org;\n arc=none smtp.remote-ip=159.226.251.81"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5vym5H9Yz1xqf\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 23:24:15 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 4D2DE436F7EC\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 13:24:13 +0000 (GMT)","from cstnet.cn (smtp81.cstnet.cn [159.226.251.81])\n by sourceware.org (Postfix) with ESMTPS id 2C76943B550D\n for <gcc-patches@gcc.gnu.org>; Thu, 30 Apr 2026 13:23:16 +0000 (GMT)","from localhost.localdomain (unknown [118.112.177.130])\n by APP-03 (Coremail) with SMTP id rQCowABnh968V_NpJ2CrDw--.5955S2;\n Thu, 30 Apr 2026 21:23:08 +0800 (CST)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 4D2DE436F7EC","OpenDKIM Filter v2.11.0 sourceware.org 2C76943B550D"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 2C76943B550D","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 2C76943B550D","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777555397; cv=none;\n b=h+VtWEpw8v748wzRST5bDMnFPZoidSY1eSpcJ0D3u7kEosdKJ7pCHaJP4kXgvH+lyJ4Ek27kIikRK6La7nz5Hk5fmNzOeXsCb39DGP+JE9OwtLrsI1PCGQMLaBdqOt1nwoBBMKsSfm9ofv0pIaLU9mKciiqpbPoSPv5b9TNyhig=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777555397; c=relaxed/simple;\n bh=WA015mJG3FjcDAPZo2yUIo3LOOwMtgMJij7U4T7R6iM=;\n h=From:To:Subject:Date:Message-Id:MIME-Version;\n b=JEki+Qx8nhQ6RxH+bLX2q7aY3KayxwmzSDMrAXKKbF8lMpjoJdEMpBPHTfLyBW48207LGtMMQRnRjvErRgvyY2po1d0ce640Ke/HFLBhF7njIlGnfFJmhaRQe+BuxiHKwJPxJ/MLG89JBRuXCmIY6GOPUdDT84q4JFafTd+mBBA=","ARC-Authentication-Results":"i=1; server2.sourceware.org","From":"wangzicong <wangzicong@masscore.cn>","To":"gcc-patches@gcc.gnu.org","Cc":"wangzicong@masscore.cn","Subject":"[PATCH v3] RISC-V: Make tuple vector not tieable to some modes.","Date":"Thu, 30 Apr 2026 21:23:07 +0800","Message-Id":"<20260430132307.231541-1-wangzicong@masscore.cn>","X-Mailer":"git-send-email 2.25.1","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-CM-TRANSID":"rQCowABnh968V_NpJ2CrDw--.5955S2","X-Coremail-Antispam":"1UD129KBjvJXoWxZr45Ar18JF1UWr4Uur4fAFb_yoW5Kw4xpa\n 17Gw4Ik3WkAa9rJF1fKryUJwsxu34kGF15Ww1fur47Ca9YqrW0va4qqw4fGFy3GFyrWry3\n Cr1DCF1Y9wn8X3DanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n 9KBjDU0xBIdaVrnRJUUUkl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0\n rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02\n 1l84ACjcxK6xIIjxv20xvE14v26r1j6r1xM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r1j\n 6r4UM28EF7xvwVC2z280aVAFwI0_Gr0_Cr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4j6r\n 4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0\n I7IYx2IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r1j6r\n 4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxG\n rwCFx2IqxVCFs4IE7xkEbVWUJVW8JwCFI7km07C267AKxVWUXVWUAwC20s026c02F40E14\n v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jrv_JF1lIxkG\n c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI\n 0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4U\n MIIF0xvEx4A2jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7VUbnmRUUUUU\n U==","X-Originating-IP":"[118.112.177.130]","X-CM-SenderInfo":"pzdqw6xlfr0w46pd22pfruvhdfq/","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"This patch makes riscv tuple modes not tieable to non-tuple modes. Without \nthis patch some unnecessary type conversions may occur, especially when zvl \nis specified.  \nE.g. RVVMF2x4HI and RVVM2DI are tieable in gcc trunk, and when extracting \nan inner vector mode RVVMF2HI from RVVMF2x4HI and zvl is specified, it will \nbe converted to DI, which is not expected. But with same inner modes, e.g. \nRVVM1x4QI and RVVM1QI, they should be tieable.\n\n        PR target/124448\n\ngcc/ChangeLog:\n\n        * config/riscv/riscv.cc (riscv_modes_tieable_p): Make tuple modes \n        not tieable to some modes.\n\ngcc/testsuite/ChangeLog:\n\n        * gcc.target/riscv/rvv/autovec/pr124448.c: New test.\n\nSigned-off-by: wangzicong <wangzicong@masscore.cn>\n---\n gcc/config/riscv/riscv.cc                     | 27 ++++++++++++++\n .../gcc.target/riscv/rvv/autovec/pr124448.c   | 36 +++++++++++++++++++\n 2 files changed, 63 insertions(+)\n create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr124448.c","diff":"diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc\nindex 615750f07449..65bbaf1a42cb 100644\n--- a/gcc/config/riscv/riscv.cc\n+++ b/gcc/config/riscv/riscv.cc\n@@ -10899,6 +10899,33 @@ riscv_modes_tieable_p (machine_mode mode1, machine_mode mode2)\n      E.g. V2SI and DI are not tieable.  */\n   if (riscv_vector_mode_p (mode1) != riscv_vector_mode_p (mode2))\n     return false;\n+\n+  /* We don't allow tuple vector modes to be tied to any vector mode\n+     that has different inner mode.  It may cause unnecessary type\n+     conversions.\n+     E.g.  RVVMF2x4HI and RVVM2DI are not tieable, but\n+     RVVM1x4QI and RVVM1QI are tieable.  */\n+  if (riscv_tuple_mode_p (mode1) || riscv_tuple_mode_p (mode2))\n+  {\n+    machine_mode subpart_mode1, subpart_mode2;\n+    if (riscv_tuple_mode_p (mode1))\n+    {\n+      subpart_mode1 = riscv_vector::get_subpart_mode (mode1);\n+      subpart_mode1 = GET_MODE_INNER (subpart_mode1);\n+    }\n+    else\n+      subpart_mode1 = GET_MODE_INNER (mode1);\n+    if (riscv_tuple_mode_p (mode2))\n+    {\n+      subpart_mode2 = riscv_vector::get_subpart_mode (mode2);\n+      subpart_mode2 = GET_MODE_INNER (subpart_mode2);\n+    }\n+    else\n+      subpart_mode2 = GET_MODE_INNER (mode2);\n+    if (subpart_mode1 != subpart_mode2)\n+      return false;\n+  }\n+\n   return (mode1 == mode2\n \t  || !(GET_MODE_CLASS (mode1) == MODE_FLOAT\n \t       && GET_MODE_CLASS (mode2) == MODE_FLOAT));\ndiff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr124448.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr124448.c\nnew file mode 100644\nindex 000000000000..32aa85761885\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr124448.c\n@@ -0,0 +1,36 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-march=rv64gcv_zvl128b -mabi=lp64d -O3 -mrvv-vector-bits=zvl  -fdump-rtl-vregs\" } */\n+\n+typedef short int16_t;\n+\n+void dct( int16_t d[16], int16_t dct[16] )\n+{\n+    int16_t tmp[16];\n+    for( int i = 0; i < 4; i++ )\n+    {\n+        int s03 = d[i*4+0] + d[i*4+3];\n+        int s12 = d[i*4+1] + d[i*4+2];\n+        int d03 = d[i*4+0] - d[i*4+3];\n+        int d12 = d[i*4+1] - d[i*4+2];\n+        tmp[0*4+i] =   s03 +   s12;\n+        tmp[1*4+i] = 2*d03 +   d12;\n+        tmp[2*4+i] =   s03 -   s12;\n+        tmp[3*4+i] =   d03 - 2*d12;\n+    }\n+    for( int i = 0; i < 4; i++ )\n+    {\n+        int s03 = tmp[i*4+0] + tmp[i*4+3];\n+        int s12 = tmp[i*4+1] + tmp[i*4+2];\n+        int d03 = tmp[i*4+0] - tmp[i*4+3];\n+        int d12 = tmp[i*4+1] - tmp[i*4+2];\n+\n+        dct[i*4+0] =   s03 +   s12;\n+        dct[i*4+1] = 2*d03 +   d12;\n+        dct[i*4+2] =   s03 -   s12;\n+        dct[i*4+3] =   d03 - 2*d12;\n+    }\n+}\n+\n+/* { dg-final { scan-assembler-times {vsetivli} 1 } } */\n+/* { dg-final { scan-assembler-not {vslidedown\\.vi} } } */\n+/* { dg-final { scan-rtl-dump-not \"\\(subreg:RVVM2DI \\(reg:RVVMF2x4HI\" \"vregs\" } } */\n","prefixes":["v3"]}