From patchwork Tue Aug 4 09:48:56 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 140574 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7B13D4BA2E1A for ; Tue, 4 Aug 2026 09:50:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7B13D4BA2E1A Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=bIjCotVL X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010033.outbound.protection.outlook.com [52.101.46.33]) by sourceware.org (Postfix) with ESMTPS id 77F3C4BA2E07 for ; Tue, 4 Aug 2026 09:49:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 77F3C4BA2E07 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nvidia.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 77F3C4BA2E07 Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=52.101.46.33 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785836968; cv=pass; b=wJ7gBO6AWUc0MxXfEPtrRUvgukwVO4oQA96PuxJYgkRtp0bg4bXu6TcpxAbYBR6+z7tGlP1ejc29O8/aoVPoSY9SouHi+bZfFpjk+wsgoQ1MtYamMN4OECRATi4ExQ7NAyBjKek+sb+rIue8VEsNksIVs65/H+o4gCQfUmyGvE4= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785836968; c=relaxed/simple; bh=NGXIJ7IV/ap8Ll9pXV05XjIdswVaBrubSXF0GKOWPu8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=dkU1sC9pd/zzI5kek2x9TxvG3LShZp0b+b0+r5aKn/TJB2ePbX2PBYRxfMmEkh377FU6Y+zJFruYUAnk7T3971Ph4m69BlL9oOEHtQ5G75hfrLKf4H7LWp1v7xX8z/lcsQuWOs3g2uCMX4pCW7fqQJpWY/CLRyAt/wUyPvduA3E= ARC-Authentication-Results: i=2; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=bIjCotVL DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 77F3C4BA2E07 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KMQmBr5soxMzswDaCZpu+eGRvHvaHt5uDVGKgoYXl1KBRbh+RZmfwPbJRjrATsGHcahsZwIT9J6J5UOUHSzk4+9Uq5K2IMc9XKDUu2XZtInBn4hxYNUTS/aJj2pi384SAaeikMASRkTmZX+QhD7+iYYRcS7LNxold8qMFtVoXrR+KazqJIrhLHeKC9ImwhJELrNswuYZuvX83nlnhQva/oYsvI/4UsBIUP7kfuMLKkj1809Ejb9o0namh2Ht2vJCJnBoVgHDXsQ/M4OO4hQpphcXiRtaVLvk/NG9pJdSmchzeIFMTLDHOX0uZbB6seA/oxoxjcGPDSwyf+Y0uSplng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Hk4UCmVMhH86MMYaQjgRmqlBGd/3wRSuVaew22EXiSM=; b=TN1xPouS94Xh5BcwYrBtaJ9ZDOHMI04vSyV0H+J7Pc010rOH1xnjaGX88QMIe+5ut6mm4/CSDpo+Gyn1xZA7sE7WMZFNBcPwbrgj6BjjPmRSOoZ4EOSt0MAatgRGkePYmYPNQie27b/nGhGmKXAz3/zRQZuzAaa4HPl+aoqBzxzmSgarer0/uI2A0P6M/ZvnNYBjJWCq/3Ab6fomCRtFvlRHUHXpojrLPS/tp4VX0THKMvfZ1kZ8k2L24bYCpqHwv6UeaIBDVmLojefyN3he3YKI5HOv293aE06hj1yp0ZP7I3wjb0Fr4299YEv7DbleFEtHk7CwshTRnzf8knhJNg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Hk4UCmVMhH86MMYaQjgRmqlBGd/3wRSuVaew22EXiSM=; b=bIjCotVL/J0JVFG+iuyRkJWemZDYAs4y5KnPXF6itRXvZRrGLFUdORrKkihRdx2wKk7nS5qC5/9YOFFc9U8YwOKwQnuHcmTsGeaRV8RS4w1Nc0Agaiu28NHbmEEKrkKrvnX13oRxStSZf9RuuWSzOSgkLOLz+HgoMBv1WJfXaB4CGvT+vJpffWYu1NcfrcidCw9anvJi1hXxmrOwnw3HNi8Sfhk+pbK9dsyw53HQiwB2spYQc4LTm1mIqzRuRM5wnDQmQhGxo2qiLXA2OB/zx953DFdpRip8oX+qnwzRYRGzllXvTJqUjNEl3XB2r6fg2w80HmduOjFe+W0fGEQarg== Received: from CH0PR03CA0267.namprd03.prod.outlook.com (2603:10b6:610:e5::32) by SA5PPF590085732.namprd12.prod.outlook.com (2603:10b6:80f:fc04::8ca) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.270.18; Tue, 4 Aug 2026 09:49:24 +0000 Received: from CH1PEPF0000AD74.namprd04.prod.outlook.com (2603:10b6:610:e5:cafe::1a) by CH0PR03CA0267.outlook.office365.com (2603:10b6:610:e5::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.270.18 via Frontend Transport; Tue, 4 Aug 2026 09:49:24 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CH1PEPF0000AD74.mail.protection.outlook.com (10.167.244.52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.8 via Frontend Transport; Tue, 4 Aug 2026 09:49:24 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Tue, 4 Aug 2026 02:49:11 -0700 Received: from ktkachov-mlt.nvidia.com (10.126.230.37) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 4 Aug 2026 02:49:09 -0700 From: To: CC: Kyrylo Tkachov Subject: [PATCH] match.pd: sink a unary operation through a vector permute Date: Tue, 4 Aug 2026 11:48:56 +0200 Message-ID: <20260804094856.55059-1-ktkachov@nvidia.com> X-Mailer: git-send-email 2.50.1 MIME-Version: 1.0 X-Originating-IP: [10.126.230.37] X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000AD74:EE_|SA5PPF590085732:EE_ X-MS-Office365-Filtering-Correlation-Id: 8bef25e5-1218-49dd-e080-08def20daa75 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|23010399003|36860700016|82310400026|1800799024|13003099007|6133799003|56012099006|11063799006|10067099003|18002099003; X-Microsoft-Antispam-Message-Info: nomoxf6KN9PbnwBAEkRFxvo+kZ2tMrW4rz+B8wLxIoRCWIkRfS7ENB/01XiMD9jR0IhlyZ2xt8ircVnkOO8Bm4X96nlye+Af86GG2mLxu9jOYonjTPMNigUBVD5kREllY0RF0wh14OpdiuehUYlGKECt3bZ9mpUekEadv4/APAgPuGhLw7Z577kgBQFUZgaTSFydzbQyaqHDdqwsSUbHfYJgclXesWYHuMKCKui9XiXXKGdXTV0i6P9fF3lVJLo/kZlmWU314bMt0aqckdMm/JmAc209CZSNvH+fvDwS3fo6h7ol5fk7bcmFowjbXeaiTF3oLgwmpOnqe8UnCP8oWsmiZXtH5hFpPEA10ykWQOXcVBCvQR12D0P/QMvs0nS4WSHYqsovG4sRF4eeklxHa5DyUf7xIza1+HtB1lXkdxOwjLRVM8t2B+sR50QSZTCQvT874YZdk3mpgsF6ABauxe7SQ2b/rmagS/0yTzvDpvt00j4LE3/RdiZqCGEZxlb/h7omv2OJDA1+n2w5pB5XOs1q4Wx9pDXhlkJwFEuLomSGhQBwQ74wzFfWOzLW5d07keJP20qiF1m2S9evdgJF9v+yJrm91JOgGuvoYqvJQrO+IclawFKYDvd7A1iBfaaO62hk1LS9UOdAJM0tU/ivaDWVFywyO/F2t93bRZdSGrOvQxZKXCKAxrTEzk8k9mVR+LnvS5C3Oqi6WJNmpI3LKg== X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230040)(376014)(23010399003)(36860700016)(82310400026)(1800799024)(13003099007)(6133799003)(56012099006)(11063799006)(10067099003)(18002099003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cK07bViSQnSjsUoOOXACic1XcOB6E6V4VDT0vaXkpjMGzviC23Krc3SCXMQaYGoGF+Eb+LvoTjg8hJNxcW27T1/jUK+mozdgq3KbyEA5yJCbxGcxSCah6bZLTMIccp+99cOKGUnJyDXUs+HvjUVlgoLfwPsKU+IzQy7S56VzV+N4ggIbKrLjDMWf3pO/cGZCWsC1Z9iDuTFX4853jPMDnP+TETWF/0r4flSyO9cqWS5t91RwQRuvh6lN/lsYpLIYZhJSt+MOSGykgU7OUTPRXstSOM/tyPwoN4KURWaUY11Be0UcWfazbNy1CXW+QL6H7KcTRDqaPNaFlxYq0hd/Z2I3PJvW4c26Fo/HzR74CB3D+W6uazsz9JAkosTktvrDtzDpozDVrwmEaBD8RK3Js3IFVl0z0U3+r6desOleDj28jWbFDP/7+pgb+sdso4FN X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Aug 2026 09:49:24.0095 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8bef25e5-1218-49dd-e080-08def20daa75 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH1PEPF0000AD74.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA5PPF590085732 X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, GIT_PATCH_0, LOCAL_AUTHENTICATION_FAIL_SPF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on 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: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org From: Kyrylo Tkachov A permute of two results of the same unary operation needs only one such operation, applied to the permuted vector. The selector and both vector types are unchanged, so the permute itself costs the same, and the lanes that the permute drops are no longer computed at all. typedef float v4f __attribute__((vector_size (16))); typedef int v4i __attribute__((vector_size (16))); v4f f (v4f a, v4f b) { v4i m = { 3, 6, 1, 4 }; return __builtin_shuffle (-a, -b, m); } aarch64 -O2 before: fneg v0.4s, v0.4s adrp x0, .LANCHOR0 fneg v1.4s, v1.4s ldr q29, [x0, #:lo12:.LANCHOR0] mov v30.16b, v0.16b mov v31.16b, v1.16b tbl v0.16b, {v30.16b - v31.16b}, v29.16b after: adrp x0, .LANCHOR0 ldr q31, [x0, #:lo12:.LANCHOR0] tbl v0.16b, {v0.16b - v1.16b}, v31.16b fneg v0.4s, v0.4s The two register-pair moves also go away, because the permute can now take the incoming argument registers directly. Bootstrapped and tested on aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill gcc/ChangeLog: * match.pd (vec_perm of two identical unary operations): New simplification sinking the operation through the permute. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/vec-perm-unary-1.c: New test. Signed-off-by: Kyrylo Tkachov --- gcc/match.pd | 9 ++++ .../gcc.dg/tree-ssa/vec-perm-unary-1.c | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vec-perm-unary-1.c diff --git a/gcc/match.pd b/gcc/match.pd index ec00347a968..4fca75d6fb6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -12532,6 +12532,15 @@ and, && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0))) (convert @0))) +/* VEC_PERM_EXPR of two results of the same unary operation needs only one + such operation, applied to the permuted vector. The selector and both + vector types are unchanged, so the permute itself costs the same, and + the lanes that the permute drops are no longer computed. */ +(for uop (negate bit_not abs absu) + (simplify + (vec_perm (uop:s @0) (uop:s @1) @2) + (uop (vec_perm @0 @1 @2)))) + /* Optimize c1 = VEC_PERM_EXPR (a, a, mask) c2 = VEC_PERM_EXPR (b, b, mask) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vec-perm-unary-1.c b/gcc/testsuite/gcc.dg/tree-ssa/vec-perm-unary-1.c new file mode 100644 index 00000000000..7ff2498a6ce --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vec-perm-unary-1.c @@ -0,0 +1,44 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +/* A permute of two results of the same unary operation needs only one such + operation, applied to the permuted vector. */ + +typedef float v4f __attribute__((vector_size (16))); +typedef int v4i __attribute__((vector_size (16))); + +v4f +f (v4f a, v4f b) +{ + v4i m = { 3, 6, 1, 4 }; + return __builtin_shuffle (-a, -b, m); +} + +v4i +g (v4i a, v4i b) +{ + v4i m = { 0, 4, 1, 5 }; + return __builtin_shuffle (~a, ~b, m); +} + +v4i +h (v4i a, v4i b) +{ + v4i m = { 0, 4, 1, 5 }; + return __builtin_shuffle (-a, -b, m); +} + +/* The absolute value written as a sign mask folds to ABS_EXPR first, so + this exercises the abs case of the same rule. */ +v4i +k (v4i a, v4i b) +{ + v4i m = { 0, 4, 1, 5 }; + v4i sa = a >> 31, sb = b >> 31; + return __builtin_shuffle ((a ^ sa) - sa, (b ^ sb) - sb, m); +} + +/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 4 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "ABS_EXPR" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-not " = -a" "optimized" } } */ +/* { dg-final { scan-tree-dump-not " = ~a" "optimized" } } */