From patchwork Tue Aug 4 09:51:59 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 140576 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 1C2EF4BA2E1A for ; Tue, 4 Aug 2026 09:53:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C2EF4BA2E1A 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=LxjihqJk X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010047.outbound.protection.outlook.com [52.101.201.47]) by sourceware.org (Postfix) with ESMTPS id 586254BA2E1A for ; Tue, 4 Aug 2026 09:52:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 586254BA2E1A 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 586254BA2E1A Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=52.101.201.47 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785837150; cv=pass; b=RIXphGt7wlBMmlFcfRnQxa8u7M7sIaB6eC6Dw/HmGMB8WbmeNRRWNqel5kgfH6cLu6fLHpyzJ/63zzMSHHP5Jew8sD4+6OLKiBBzedHHJ/zRguAQBraU/dCAseFy7DA3RWhY89m201X7TnQssAxor9QqIcqbRO+fbdY1ip5FGgE= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785837150; c=relaxed/simple; bh=dmU9C+YO/0RkzQW10iGRonsw722pwetGlaO3hnB+OO8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Mz6h0wvSJHu2bgQChmCKHWnegG8+5PQ0tAEcwry17Il7IxAgp8nkhf+aVOP9f7tpJ1JYNcmKShtmMRPYWNyw1OkiKagIxkufMkya2AONCtN0kaCmhTRPf/41+AjWkOjanhW+lZm9NSCIUrwlCfUGAW5rr4etSXoYQdV9Mx7QVNg= 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=LxjihqJk DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 586254BA2E1A ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dE2/Y6FwN+2z+dPCVU5o/7eU7yVrkIxLcZOe3ao0ulpOg/KS8UAu62qHZecgAyRUqWhbYTz9IW44NAEKMJfXA6JTC1ZdYKEGF46Ffu5kBWE6M66NFXBjXeIh3IjUhJea91dL+NqphrCdwS4VWX5wKFAdUNIHC6JIwYPKOp1ECyFxkl7F5COwl0Xr3DQBUWCyYSwowP8DKynEWWLHWtmfA73hfiguhUdgBfTuFrCNK+UfDiJfZ+vYE6RcKR249AxIzIgD8AqeFTtLsFWpFEXoWq7POqynapEtEc4p0w2SR48MFHxd650oWpJwcrsYlmImTB3m7CNbDgKVm7hnTuseTQ== 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=UEKFgkjXDlcYBuHmUDuV3YZpCjfAcTifOj4JIAuSJj4=; b=CkOwhY9iEsSpI4Z9GKJ1wPb4KzFmFTWv4Kr+eAaKCzZt7/hkCQVz3cloNP28KOMbGUJ0JRxhW3R0aN9eJ7EPnHl2VXYsDHDmidxfKeZl5EW5e6IHuxmB27s6k9wjihTSpUutS5mglSu32tEymFAJYHYkzmsRCovNgCgmeDNJMmFTX1oGkrJ6mnAtANLe1L+VSgd+wTj6fgBGc4/glZC60Eryi7ViSuA1WEyfzq02swxy7FShqSfH4g/RnhtOjaz1S1/NyuM+y14Alcsv6VDp4k15Ok7T8jrYDb4k38OoOGCKtG7Y8tBQhmCjCuOxFuMt4Y2nWKLVu8Dpe6rNsgl9tQ== 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=UEKFgkjXDlcYBuHmUDuV3YZpCjfAcTifOj4JIAuSJj4=; b=LxjihqJkwuDeYTdkPkyVnZsI+gZD1kSXH38xPIYmiAbrJmtVokxNmowx5mFLLGmlUWxi9/GtpE7R6tj3k98kL1p1CDKz9NaCJJahqwuPO9DQw+KZqNOHP9JtlpA8M1wS1ZQLaTifbDeAcDZAXXNaMr+aZH22WR9rMMlcF+34rgLaWz40Kzl3xOF/KWZFr/LYDnBHL5j6h8ohrddyRwapqfsMu142BXfveBs62BXs3YNMcHWmrVQwDH9fKDE1xfU9ZGJGawtv3tMZZws1Cz92Szmnj3qht85CFdXGyGBoTK7ZkUad4xZoTGDdXG7zAbgI2NPOtLrqz/RYcvFARl9uMA== Received: from CH0PR13CA0023.namprd13.prod.outlook.com (2603:10b6:610:b1::28) by DM4PR12MB8560.namprd12.prod.outlook.com (2603:10b6:8:189::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.16; Tue, 4 Aug 2026 09:52:23 +0000 Received: from CH1PEPF0000AD77.namprd04.prod.outlook.com (2603:10b6:610:b1:cafe::28) by CH0PR13CA0023.outlook.office365.com (2603:10b6:610:b1::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.292.15 via Frontend Transport; Tue, 4 Aug 2026 09:52:23 +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 CH1PEPF0000AD77.mail.protection.outlook.com (10.167.244.55) 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:52:23 +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:52:10 -0700 Received: from ktkachov-mlt.nvidia.com (10.126.231.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:52:08 -0700 From: To: CC: Kyrylo Tkachov Subject: [PATCH] match.pd: combine a pair of vector comparisons against zero Date: Tue, 4 Aug 2026 11:51:59 +0200 Message-ID: <20260804095159.55284-1-ktkachov@nvidia.com> X-Mailer: git-send-email 2.50.1 MIME-Version: 1.0 X-Originating-IP: [10.126.231.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: CH1PEPF0000AD77:EE_|DM4PR12MB8560:EE_ X-MS-Office365-Filtering-Correlation-Id: 4214a798-4853-441f-6bd8-08def20e1573 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700016|23010399003|376014|1800799024|82310400026|13003099007|10067099003|11063799006|56012099006|18002099003|6133799003; X-Microsoft-Antispam-Message-Info: MdL7AYOJorvC2UNSlw1LYkCQdcBim+xs9rZGsj/dO+GLmteylNxXiNabgEvtkOoL+Q5IuURIhLrbI2hGt0j/g9VDl7Ybnha68yIpzXO15YOTCv0uvk1YnJsv/6tWZuoR9BrsLa66GLGKecFag1BDdBzXuSbJCSEjBgvqfQmWueflYfN5RXsBetcdkl0eH5yXBmZHTA5aQn+1Asm1GMhcV/qjJlI++boKxjWlGQG9T+iwq33gKPfHum5BlydK1oqfdOwDJA7RI5RyRJIZCFFw6ZSTX9MqJWrBYa/hUBIPexDAxYEPF2Cw1Tw0tw6WBo74eGI7TIni2xzJiGEoqJFCJXzzMpr8GIPH8GwpfVUZjBhOHdaL+SPpNHBSvFklH29XuXoKbLaYa8WGQgcjijXUgS0S9ieQtcevo9McxIxbZiFVUVMn52mmQiihPOeMb6MlJ2zeOFjd6+3+ooR1bYEHWcb9Bfsp4byPhjs+aefnGTQczyKPwdbRFKGuSR+KZFhLLQvQ8W44JhCD6VYOp3CMDrxpOC41XW+q26/6LmUq+Ex+t+bQjouRBU7l1Hv69SpdsiIlZneJ3vWvVhSs4Nf214IclCeBC3Ch2HgTTw/8Lup9X30orviiqojF4TKhskhSmx+PtCZiRpXnQD8z2M4r8FkKfNZP/pfXmiFNTJUBNem4+fue3S6jGoIrpthvfrnvTZl7kKANAJ5zT+ixaqWSoQ== 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)(36860700016)(23010399003)(376014)(1800799024)(82310400026)(13003099007)(10067099003)(11063799006)(56012099006)(18002099003)(6133799003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: /JsI3I1oBtt/kW+bpcYODwl3V+LsK4C/giQUB19lrDuQe8JfDonFVZqpR/ipyemXfrrJiG+ChR/8RFNhfnm4g8TDx3resM2rNbSaohHefiivi+DLQrRdZZZe5UHcAkO785tDRKHvvrc6pCBp73baA9Kx25sfn99BiAkLeQ2IbuXJwNLkofcW2XQw2XqlwluBXsupqBuq+8srMAaVaIa2I5WZeWa4G8uTzVRwd7xyNdarLj/Xh4ev3URsrrBZSOrkfnPxKemUK6cxAJzkbd65Lh4lh4ETQOGAjPJtk3k3Kwc1KYOAVRO/4CWBIvnc+XCSXMBkXJv6u+62z/X+qZ2z7hbitlA2XNiLtiUtwkn/ZK7IyoQUrn6RJin5Ls0FNDGmvAjXZCwyL71xTPOQieM1Ezrt3CgxjMcHLoAYIX/xAcYgjMzSUJ9R0wLOUfjIHn0z X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Aug 2026 09:52:23.5192 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4214a798-4853-441f-6bd8-08def20e1573 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: CH1PEPF0000AD77.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB8560 X-Spam-Status: No, score=-8.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, LOCAL_AUTHENTICATION_FAIL_SPF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, 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 lane of A | B is zero exactly when the corresponding lanes of A and of B are both zero, so (A == 0) & (B == 0) -> (A | B) == 0 and the De Morgan dual for the inequality. One vector comparison goes away. Reassociation performs this for scalars, but it never runs on vector masks, so the vector form is left alone today. typedef int v4si __attribute__((vector_size (16))); v4si f (v4si a, v4si b) { v4si z = {0,0,0,0}; return (a == z) & (b == z); } aarch64 -O3 before: cmeq v0.4s, v0.4s, #0 cmeq v1.4s, v1.4s, #0 and v0.16b, v0.16b, v1.16b after: orr v0.16b, v0.16b, v1.16b cmeq v0.4s, v0.4s, #0 Bootstrapped and tested on aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill gcc/ChangeLog: * match.pd ((A == 0) & (B == 0), (A != 0) | (B != 0)): New simplifications for vector operands. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/vec-mask-zero-1.c: New test. Signed-off-by: Kyrylo Tkachov --- gcc/match.pd | 14 ++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vec-mask-zero-1.c | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vec-mask-zero-1.c diff --git a/gcc/match.pd b/gcc/match.pd index 22202af2cc1..fc81dfc5e66 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3823,6 +3823,20 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) { constant_boolean_node (true, type); }) )))))) +/* Combine two vector comparisons against zero into one: + (A == 0) & (B == 0) --> (A | B) == 0 + (A != 0) | (B != 0) --> (A | B) != 0 + Reassociation does this for scalars only, it never runs on vector + masks. */ +(for eqne (eq ne) + bitop (bit_and bit_ior) + (simplify + (bitop (eqne:s @0 integer_zerop) (eqne:s @1 integer_zerop)) + (if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (@0)) + && types_match (TREE_TYPE (@0), TREE_TYPE (@1))) + (eqne (bit_ior @0 @1) + { build_zero_cst (TREE_TYPE (@0)); })))) + /* Optimize (a CMP b) ^ (a CMP b) */ /* Optimize (a CMP b) != (a CMP b) */ (for op (bit_xor ne) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vec-mask-zero-1.c b/gcc/testsuite/gcc.dg/tree-ssa/vec-mask-zero-1.c new file mode 100644 index 00000000000..f8c669636fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vec-mask-zero-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* A lane of A | B is zero exactly when both lanes are, so a pair of vector + comparisons against zero becomes one. Reassociation does this for + scalars but never runs on vector masks. */ +typedef int v4si __attribute__((vector_size (16))); +v4si f (v4si a, v4si b) { v4si z = {0,0,0,0}; return (a == z) & (b == z); } +v4si g (v4si a, v4si b) { v4si z = {0,0,0,0}; return (a != z) | (b != z); } +/* { dg-final { scan-tree-dump-times " == " 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times " != " 1 "optimized" } } */ +/* Each function keeps one OR and one comparison. */ +/* { dg-final { scan-tree-dump-times " \\| " 2 "optimized" } } */