From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10olkn2085.outbound.protection.outlook.com [40.92.40.85]) by sourceware.org (Postfix) with ESMTPS id 8F15C3858D32 for ; Sat, 11 Feb 2023 08:47:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8F15C3858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=outlook.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WXSsSlLs4aRkNgsQOeMzv833yKAqyteKKD8nncAdGPEbeMq/BO3vjdQ/nFaduSmZATQ8MdJagg9J06JqQBjUozN7Vcd8PCoYS/cBbt4iPGZLnVLkWuMKJP+xGdbDck3je+/e457AfcrnwkC6sB5KiomFDNhEI/wut50lCT4pqb6m8EM3bCT423/vrdcATKKnK8vr48Q94yO+mn77chnuhqAQC75uGDObgRHLl17kVN1n8/+h6ZjQMX7F6cOcDQXIcT80ole0Z9lyhfg1vM8qSnNQIxCsJnWwRCQ8O7vVxCN+LCXZaNpLWTADjcWu1bL91MuVckK1+Zcqj9/O4nbNfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ShYQjsXV1MPTBN7TVWuxc3EkgjA+iDIaVnJr4S9ElII=; b=JzfIegNTod56mzWOpGI9qrXjXOonAfksMDt0QYpnbgZeh54Q/YkK0By/ux+SEtW9UvdkMqNDLIvtvNJ/+uk/mMAV9hbzfICx/MrRQ7AihXIX9hRMwqtOe0WkRczJ8G5EMpjZM5xmXxUmvZJjEfKhM908gsydcSd9h6lmjFM+733hyArp2Xd+fb3/4oHF0dRKBEwBHZqNDVRm9amkdS8AVWD/kZvuoEPJD0tJIOUeT0e1DCzFtU2xNcDxdLUc5Tsfz004ow5eGiGAqsUzXCS8dWloEwbYcMVTH4JKI0TiGnfOn3ESUL9uxsFRkrz8dv1S1mnnOnlQ9vWdtRl4qs/VPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ShYQjsXV1MPTBN7TVWuxc3EkgjA+iDIaVnJr4S9ElII=; b=j0GjRBPbuBh7DlYQ8ImMVuTVqPEniwck6/OsYuccuxaZF/TG3MBCGDvKcUj3SZadi6h9lDN6iQPAMgMdh6K70omB1HgvDmYrwcIppJwZ+6m+R2hSzNNOj483V6yvWqlhllzRRLMfk4Ng4gpemybTIsSbm4xh7KjgTSymF1gr5Dt6B1JKdMmQezvCNwLBvyunCQEqU9/1l8EtK1qgm4n6buvzIrKJSc2/I0pupsBcbvQhumcP3CbLsTMZW/pEQi9e5qVapkZVEJI4Sk/SsclSo7t+8bj6gFbWFebVwBe3zkP5bUCNG/y76khIApftw64gIn30TeLi3ebfiujtRRl/Bw== Received: from BYAPR04MB4824.namprd04.prod.outlook.com (2603:10b6:a03:5e::19) by CO6PR04MB8363.namprd04.prod.outlook.com (2603:10b6:303:142::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.22; Sat, 11 Feb 2023 08:47:07 +0000 Received: from BYAPR04MB4824.namprd04.prod.outlook.com ([fe80::3a96:d832:ac44:1c25]) by BYAPR04MB4824.namprd04.prod.outlook.com ([fe80::3a96:d832:ac44:1c25%7]) with mapi id 15.20.6064.031; Sat, 11 Feb 2023 08:47:06 +0000 From: incarnation.p.lee@outlook.com To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, kito.cheng@sifive.com, rguenther@suse.de, Pan Li Subject: [PATCH] RISC-V: Bugfix for mode tieable of the rvv bool types Date: Sat, 11 Feb 2023 16:46:49 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-TMN: [GaUU7K/opZO9z42mbkSKpCskiIOy5AgX] X-ClientProxiedBy: SGAP274CA0011.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b6::23) To BYAPR04MB4824.namprd04.prod.outlook.com (2603:10b6:a03:5e::19) X-Microsoft-Original-Message-ID: <20230211084649.697236-1-incarnation.p.lee@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BYAPR04MB4824:EE_|CO6PR04MB8363:EE_ X-MS-Office365-Filtering-Correlation-Id: 74586b4b-858f-409a-ced4-08db0c0c8df3 X-MS-Exchange-SLBlob-MailProps: ZRuQdVKRmYvj2SQOIAkM0uUEjqzrtf6gZI3wFvg8e2jz6lSdUOQKzGEo0xkY/GKmDai8L6bO8pL8E+Q32q2PLeAh2Ud5uEng85q5RvTDJPiqD450NdR0T7xEW6Z251BmHH2wWAgEVXCJZvZlwgiADKZVDJnLRsteBbWL6KjlPFZq0u4TmaTeIX2aCJxrMP9YaPrLEfqwxXctOnO5s+h1QieVsrrIrZ8pZ5sfYYSjO6yXQv102u2J6ZJF/82ofsJ3m9mhnzWviZwx9sJ78cx+pzvcUnZoZ8E6glsBpPk5eXjQYMtXThJvINkFl48WE/mUUqZMNVs0CbDElfZhSdHkGiKVzEw4RjQufUC4g3hmwExAL1omXQhgprjcxdCh3xbdbm25IETH98m3tjfl4/dF5fsXpDBcUJf57rDPAIoPwzyXtWLnA9XIECZ0LSKZlRfNK34pcF/KpHgT4s9HgYCzqCpij2ExHM0NJyORWmx0oSs02wH9Ev2fZorgUz+8mLtUhf0lEUo96DxYlJ1NDNJRvDboYjfdptYLJTX0QCeozwHvY4hnEuL7SG1CE05xbxk8d6QiowdHxGPavQzO64O/W+PsY/YUrTBV8L5wFI4vj4aMqGdgzZ/HlKOZxI7/FQv3VtTnpCsnezNqTyRx1WPzfeEmGRIizFDejohCqO8uRdO4u+zgR4ImG6Q7yt+zesshCR0wvx01roVQd+nrDk6CEutaupZwKCZo X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: mjfKlYvS69VWxCvTyCJmArLRDM0O37vu9HiLfKQq+7eZeC1pRLD5dDWJdKtF/cn2Cd8y7LOLPRV01IAmFlyGVOGXc7Y/475YCOKUfVgghMs2xVJ+2YuZRwbLLuFYd5+1n060jepVJgZgItmiZI8lzLX/FyqezA2btYCGEooZz/8PyDVKySWEgumTANBCG9i5mFXWvU0JLKZjqwhC333ROK4AwftgF1+gzMHV81Uqsb0y8rxEs02Np+WcBaYvoX5HelNDQCwqFp8fmOKq7b2nBBJocc51Qw/l0X5a7xClgcdbo4rjMsVFLkNysUZxHpYpvKkV8T6I0n6tjYJDyjiYxBeHgLV5JcRMb0tJzi0nBt0PQvc3nFO1goPLlg6TjhyGyF8BKPnPitFz2hCe71fUWKUb8IFGm2AKuzFwOR0Amr4sgTaxM1s5iINizg3RN5ZvCqjP5LJfV7MgshynfZn9efpNxEWiPBlBnrqPj8cnFthoAtOOeqq9M9CFzpoL4CODY/URvTAUg6Ls38mL/cE3Cl3jy0DznaGoW1/mOWZMv/Q1LP1Ux+zXeHFUFUWctkAwyTojym40mkoujXGUGxxhl9eOK+oA4JA0Cb45Ia+md5ZH2Mnbh7O6RmpWUxutlp58dxCt9PmksoWsICvMtJ+DVg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fd/PzUtR+gTzY4CAxilZINvCZxEWeqvRDuk2kVZIoXOkoDz75tH1Ighgu9yl?= =?us-ascii?Q?dwg21uMhM6GBTH2yzS8uEkh0gt8uPxQRzIeTow+t91dStY2ewRMcFAJiXEeF?= =?us-ascii?Q?G/gKfllM6/102ORl1BNAA1QaIdl8ffKGg6IJsLYcSXU2HhWclPipmUZm4VJ4?= =?us-ascii?Q?CLi1v1fLwYwhN+XsVSuc1jVtkOcaUzngwx9dvukuVfitMi8Y8CscryuGpbCG?= =?us-ascii?Q?2ktyU7KnyYi1YnkHDkcgu+LyWHQFiRvBWhTPR6sVCxvBOK32PK472QFJs4ov?= =?us-ascii?Q?unGbHfm2o6Q2rYaAo9fVmwJFzGGijYTwpoltONYwUmiyDjWJGWT6Y//yZDVZ?= =?us-ascii?Q?KZQws3WhQrGH4G8ROQRqC3Ax4FKYAkaWrhLYkx9BYDY8yWC4a2rAGLV65vzE?= =?us-ascii?Q?RAE4ShM7vzdyWWLk4SeOi8D8C+WqNlm5xXAhR2Kcs9yqhZlVbXm+14704O0W?= =?us-ascii?Q?iHVpdU28iNY/bDgNvsWhe1YwKp9gSmsaWMUtZof/hDuZc2bfyuE7DkaWOkd4?= =?us-ascii?Q?cocerIvrS39Y9Vzy35nxTiM0pOzXM7+liybhpqZ2+3s9XWAl+3+g5bzLyUbT?= =?us-ascii?Q?eGf+HhlBSwc02CjJklomA5odoXKas5fubisz8eOxfC7Txi3nrzH8jjlty1AP?= =?us-ascii?Q?pITLecHzdIWFKt7fkjRpuWnUfGNXY1yRncIJFrku99SwbA9Ur3HnoTmGzmdT?= =?us-ascii?Q?FmE9MtEhy9fE2T+ruU904fixog0Z9aeroU06eQg+UU37o0XEWTR2J0SDM9JP?= =?us-ascii?Q?LKkMKc39N2CIi4loyvsG7DDAHaPUdDwWGH8URqHBk4WM119/bf7Mju6uPeqW?= =?us-ascii?Q?qJUq0ogLr+gyqnGvwOIgqUT52POjBVbvfvOwko+r3VGuZxWQFZt/Kvd9GQrc?= =?us-ascii?Q?9z2VUr2oNxom6GsBHUru4uXVXqIQivyU/jJgWPdmzgimRYv3QyH7ttfNVotD?= =?us-ascii?Q?pFvKXX2LKxi/FVk8JFuHI5Mk2/h8mr50Skx4MKuEJKGj5B4GM2qPYd3vfzYS?= =?us-ascii?Q?E71RS7ERvmieG0LfgHbu8DzWE7JlzLheiZ7IQ5nrYRX5V3Vh1wHHLoRz5Pik?= =?us-ascii?Q?4Xan00uUD/i6F8hZtg9W0U7MRTMkyTtjCesgUSyHbXTgomCOsIlAgb8MyKeK?= =?us-ascii?Q?D9ieLzCDmmv4rsl1omllRk/p4Qxs3mVt5DGKyQqh8cKqgUUc0GU9LQ+UW/+y?= =?us-ascii?Q?NNDZwezsMwfM/n6zdvbUoF2lLesB+glbK6NZ58MCnf7OCHLHcYLu/uX0sWwD?= =?us-ascii?Q?F/UxmegzrftqdWyt3bJN0qZeOdyuwxXAjtufAJ0NJIvaCXmGkpWj5kCwAgdN?= =?us-ascii?Q?Eo0=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 74586b4b-858f-409a-ced4-08db0c0c8df3 X-MS-Exchange-CrossTenant-AuthSource: BYAPR04MB4824.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Feb 2023 08:47:06.9075 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR04MB8363 X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SCC_10_SHORT_WORD_LINES,SCC_20_SHORT_WORD_LINES,SCC_35_SHORT_WORD_LINES,SCC_5_SHORT_WORD_LINES,SPF_HELO_PASS,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 List-Id: From: Pan Li Fix the bug for mode tieable of the rvv bool types. The vbool*_t cannot be tied as the actually load/store size is determinated by the vl. The mode size of rvv bool types are also adjusted for the underlying optimization pass. The rvv bool type is vbool*_t, aka vbool1_t, vbool2_t, vbool4_t, vbool8_t, vbool16_t, vbool32_t, and vbool64_t. PR 108185 PR 108654 gcc/ChangeLog: * config/riscv/riscv-modes.def (ADJUST_BYTESIZE): * config/riscv/riscv.cc (riscv_v_adjust_bytesize): (riscv_modes_tieable_p): * config/riscv/riscv.h (riscv_v_adjust_bytesize): * machmode.h (VECTOR_BOOL_MODE_P): * tree-ssa-sccvn.cc (visit_reference_op_load): gcc/testsuite/ChangeLog: * gcc.target/riscv/pr108185-1.c: New test. * gcc.target/riscv/pr108185-2.c: New test. * gcc.target/riscv/pr108185-3.c: New test. * gcc.target/riscv/pr108185-4.c: New test. * gcc.target/riscv/pr108185-5.c: New test. * gcc.target/riscv/pr108185-6.c: New test. * gcc.target/riscv/pr108185-7.c: New test. * gcc.target/riscv/pr108185-8.c: New test. Signed-off-by: Pan Li --- gcc/config/riscv/riscv-modes.def | 14 ++-- gcc/config/riscv/riscv.cc | 34 ++++++++- gcc/config/riscv/riscv.h | 2 + gcc/machmode.h | 3 + gcc/testsuite/gcc.target/riscv/pr108185-1.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-2.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-3.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-4.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-5.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-6.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-7.c | 68 ++++++++++++++++++ gcc/testsuite/gcc.target/riscv/pr108185-8.c | 77 +++++++++++++++++++++ gcc/tree-ssa-sccvn.cc | 13 +++- 13 files changed, 608 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-1.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-2.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-3.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-4.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-5.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-6.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-7.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr108185-8.c diff --git a/gcc/config/riscv/riscv-modes.def b/gcc/config/riscv/riscv-modes.def index d5305efa8a6..cc21d3c83a2 100644 --- a/gcc/config/riscv/riscv-modes.def +++ b/gcc/config/riscv/riscv-modes.def @@ -64,13 +64,13 @@ ADJUST_ALIGNMENT (VNx16BI, 1); ADJUST_ALIGNMENT (VNx32BI, 1); ADJUST_ALIGNMENT (VNx64BI, 1); -ADJUST_BYTESIZE (VNx1BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx2BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx4BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx8BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx16BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx32BI, riscv_vector_chunks * riscv_bytes_per_vector_chunk); -ADJUST_BYTESIZE (VNx64BI, riscv_v_adjust_nunits (VNx64BImode, 8)); +ADJUST_BYTESIZE (VNx1BI, riscv_v_adjust_bytesize (VNx1BImode, 1)); +ADJUST_BYTESIZE (VNx2BI, riscv_v_adjust_bytesize (VNx2BImode, 1)); +ADJUST_BYTESIZE (VNx4BI, riscv_v_adjust_bytesize (VNx4BImode, 1)); +ADJUST_BYTESIZE (VNx8BI, riscv_v_adjust_bytesize (VNx8BImode, 1)); +ADJUST_BYTESIZE (VNx16BI, riscv_v_adjust_bytesize (VNx16BImode, 2)); +ADJUST_BYTESIZE (VNx32BI, riscv_v_adjust_bytesize (VNx32BImode, 4)); +ADJUST_BYTESIZE (VNx64BI, riscv_v_adjust_bytesize (VNx64BImode, 8)); /* | Mode | MIN_VLEN=32 | MIN_VLEN=32 | MIN_VLEN=64 | MIN_VLEN=64 | diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 3b7804b7501..138c052e13c 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -1003,6 +1003,27 @@ riscv_v_adjust_nunits (machine_mode mode, int scale) return scale; } +/* Call from ADJUST_BYTESIZE in riscv-modes.def. Return the correct + BYTES size for corresponding machine_mode. */ + +poly_int64 +riscv_v_adjust_bytesize (machine_mode mode, int scale) +{ + gcc_assert (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL); + + if (riscv_v_ext_vector_mode_p (mode)) + { + poly_uint16 mode_size = GET_MODE_SIZE (mode); + + if (known_lt (mode_size, BYTES_PER_RISCV_VECTOR)) + return mode_size; + else + return BYTES_PER_RISCV_VECTOR; + } + + return scale; +} + /* Return true if X is a valid address for machine mode MODE. If it is, fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in effect. */ @@ -5807,11 +5828,22 @@ riscv_hard_regno_mode_ok (unsigned int regno, machine_mode mode) /* Implement TARGET_MODES_TIEABLE_P. Don't allow floating-point modes to be tied, since type punning of - single-precision and double-precision is implementation defined. */ + single-precision and double-precision is implementation defined. + + Don't allow different vbool*_t modes to be tied, since the type + size is determinated by vl. */ static bool riscv_modes_tieable_p (machine_mode mode1, machine_mode mode2) { + if (riscv_v_ext_vector_mode_p (mode1) && riscv_v_ext_vector_mode_p (mode2)) + { + if (VECTOR_BOOL_MODE_P (mode1) || VECTOR_BOOL_MODE_P (mode2)) + return false; + + return known_eq (GET_MODE_SIZE (mode1), GET_MODE_SIZE (mode2)); + } + return (mode1 == mode2 || !(GET_MODE_CLASS (mode1) == MODE_FLOAT && GET_MODE_CLASS (mode2) == MODE_FLOAT)); diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h index faffd5a77fe..f857223338c 100644 --- a/gcc/config/riscv/riscv.h +++ b/gcc/config/riscv/riscv.h @@ -1028,6 +1028,8 @@ extern unsigned riscv_stack_boundary; extern unsigned riscv_bytes_per_vector_chunk; extern poly_uint16 riscv_vector_chunks; extern poly_int64 riscv_v_adjust_nunits (enum machine_mode, int); +extern poly_int64 riscv_v_adjust_bytesize (machine_mode mode, int scale); + /* The number of bits and bytes in a RVV vector. */ #define BITS_PER_RISCV_VECTOR (poly_uint16 (riscv_vector_chunks * riscv_bytes_per_vector_chunk * 8)) #define BYTES_PER_RISCV_VECTOR (poly_uint16 (riscv_vector_chunks * riscv_bytes_per_vector_chunk)) diff --git a/gcc/machmode.h b/gcc/machmode.h index f1865c1ef42..6720472f2c9 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -242,6 +242,9 @@ extern const unsigned char mode_class[NUM_MACHINE_MODES]; || CLASS == MODE_ACCUM \ || CLASS == MODE_UACCUM) +/* Nonzero if MODE is an vector bool mode. */ +#define VECTOR_BOOL_MODE_P(MODE) (GET_MODE_CLASS(MODE) == MODE_VECTOR_BOOL) + /* An optional T (i.e. a T or nothing), where T is some form of mode class. */ template class opt_mode diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-1.c b/gcc/testsuite/gcc.target/riscv/pr108185-1.c new file mode 100644 index 00000000000..c3d0b10271a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-1.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool1_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool1_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool1_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool1_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool1_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool1_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-2.c b/gcc/testsuite/gcc.target/riscv/pr108185-2.c new file mode 100644 index 00000000000..bd13ba916da --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-2.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool2_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-3.c b/gcc/testsuite/gcc.target/riscv/pr108185-3.c new file mode 100644 index 00000000000..99928f7b1cc --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-3.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool4_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-4.c b/gcc/testsuite/gcc.target/riscv/pr108185-4.c new file mode 100644 index 00000000000..e70284fada8 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-4.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool8_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-5.c b/gcc/testsuite/gcc.target/riscv/pr108185-5.c new file mode 100644 index 00000000000..575a7842cdf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-5.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool16_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-6.c b/gcc/testsuite/gcc.target/riscv/pr108185-6.c new file mode 100644 index 00000000000..95a11d37016 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-6.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool32_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-7.c b/gcc/testsuite/gcc.target/riscv/pr108185-7.c new file mode 100644 index 00000000000..8f6f0b11f09 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-7.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool64_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 6 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 12 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr108185-8.c b/gcc/testsuite/gcc.target/riscv/pr108185-8.c new file mode 100644 index 00000000000..d96959dd064 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr108185-8.c @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */ + +#include "riscv_vector.h" + +void +test_vbool1_then_vbool1(int8_t * restrict in, int8_t * restrict out) { + vbool1_t v1 = *(vbool1_t*)in; + vbool1_t v2 = *(vbool1_t*)in; + + *(vbool1_t*)(out + 100) = v1; + *(vbool1_t*)(out + 200) = v2; +} + +void +test_vbool2_then_vbool2(int8_t * restrict in, int8_t * restrict out) { + vbool2_t v1 = *(vbool2_t*)in; + vbool2_t v2 = *(vbool2_t*)in; + + *(vbool2_t*)(out + 100) = v1; + *(vbool2_t*)(out + 200) = v2; +} + +void +test_vbool4_then_vbool4(int8_t * restrict in, int8_t * restrict out) { + vbool4_t v1 = *(vbool4_t*)in; + vbool4_t v2 = *(vbool4_t*)in; + + *(vbool4_t*)(out + 100) = v1; + *(vbool4_t*)(out + 200) = v2; +} + +void +test_vbool8_then_vbool8(int8_t * restrict in, int8_t * restrict out) { + vbool8_t v1 = *(vbool8_t*)in; + vbool8_t v2 = *(vbool8_t*)in; + + *(vbool8_t*)(out + 100) = v1; + *(vbool8_t*)(out + 200) = v2; +} + +void +test_vbool16_then_vbool16(int8_t * restrict in, int8_t * restrict out) { + vbool16_t v1 = *(vbool16_t*)in; + vbool16_t v2 = *(vbool16_t*)in; + + *(vbool16_t*)(out + 100) = v1; + *(vbool16_t*)(out + 200) = v2; +} + +void +test_vbool32_then_vbool32(int8_t * restrict in, int8_t * restrict out) { + vbool32_t v1 = *(vbool32_t*)in; + vbool32_t v2 = *(vbool32_t*)in; + + *(vbool32_t*)(out + 100) = v1; + *(vbool32_t*)(out + 200) = v2; +} + +void +test_vbool64_then_vbool64(int8_t * restrict in, int8_t * restrict out) { + vbool64_t v1 = *(vbool64_t*)in; + vbool64_t v2 = *(vbool64_t*)in; + + *(vbool64_t*)(out + 100) = v1; + *(vbool64_t*)(out + 200) = v2; +} + +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*m1,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf2,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf4,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vsetvli\s+[a-x][0-9]+,\s*zero,\s*e8,\s*mf8,\s*ta,\s*ma} 1 } } */ +/* { dg-final { scan-assembler-times {vlm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 7 } } */ +/* { dg-final { scan-assembler-times {vsm\.v\s+v[0-9]+,\s*0\([a-x][0-9]+\)} 14 } } */ diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index 028bedbc9a0..19fdba8cfa2 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple-fold.h" #include "tree-eh.h" #include "gimplify.h" +#include "target.h" #include "flags.h" #include "dojump.h" #include "explow.h" @@ -5657,10 +5658,16 @@ visit_reference_op_load (tree lhs, tree op, gimple *stmt) if (result && !useless_type_conversion_p (TREE_TYPE (result), TREE_TYPE (op))) { + machine_mode result_mode = TYPE_MODE (TREE_TYPE (result)); + machine_mode op_mode = TYPE_MODE (TREE_TYPE (op)); + poly_uint16 result_mode_precision = GET_MODE_PRECISION (result_mode); + poly_uint16 op_mode_precision = GET_MODE_PRECISION (op_mode); + /* Avoid the type punning in case the result mode has padding where - the op we lookup has not. */ - if (maybe_lt (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (result))), - GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (op))))) + the op we lookup has not. + Avoid the type punning in case the target mode cannot be tied. */ + if (maybe_lt (result_mode_precision, op_mode_precision) + || !targetm.modes_tieable_p (result_mode, op_mode)) result = NULL_TREE; else { -- 2.34.1