From patchwork Tue Aug 4 10:03:43 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 140581 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 90C004BB3B8D for ; Tue, 4 Aug 2026 10:04:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 90C004BB3B8D 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=Eap3dI+n X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010011.outbound.protection.outlook.com [40.93.198.11]) by sourceware.org (Postfix) with ESMTPS id 0F2CB4BA23DB for ; Tue, 4 Aug 2026 10:04:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0F2CB4BA23DB 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 0F2CB4BA23DB Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=40.93.198.11 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785837857; cv=pass; b=cdons7WCgLzbf9iDDwOSS9HTyugxdxr9cjVf/ixzeW9rQYk+Uxiq9p4lnhGhHMcEdEDjqWNsaH1fJaP/Tf7c9fAWyUiILkj6cV4cXxmd4SkOsTZMkfY8OJNaZ/neHbzaCAXLqUlYk5XdqI029MOg9FNXWChiXjM7bViX5loEsiE= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1785837857; c=relaxed/simple; bh=QYP0onw8Z67GODlTxGL1PkFYgCTmPdPt+WDm6cs8NyQ=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=u2WhGc4gwFfp8PU8g4we7HHL5ukawEtUJRfbDOd8HHlV4emiUFXLlYzeJtF3+z/t6aDVLkOkeg42h33vTubOQWLy9Ztv5y2f0xTDKM64S7KRocsTu5zr2rXtXZcvyDl+3AMXHygP57w0sB7hI89lIu0CEZJaDk03NNRDfftVbDM= 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=Eap3dI+n DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0F2CB4BA23DB ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WN6YkcSG1ZD5yYnATzwDhzDt1tkObolYuohJL2ORb1uA+XkhTN8aGEiTw09Wcl4LdV9/zKXshzc6o+YFlCvTDIPqnfjFy3jTho6MNyt6a/LBSgDSs+0D8ZrnEuRqpEyJmjIG4Pxe8rRKrPC4m7iBo669rt5wTZINlW1Sj/iFZP+Bm+LdCWWKtDgQ5LkfVoXCeYvOVWSge+4mVQl4/vpTWGWHDgSqhkjXNQoxr2jcQHu2y5T2UIOuCxF2NDEx0F7mXMNAzKpybzgYyazGTx9yClnSYrIlwmKqRWX1LnDCHOn+7Kz71h06hpjk3DT89gi5SK5fl4n0PWkm+9dw7rx8bg== 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=CGyq98gXrbt2fQOpCTiyB3Uq9KVdkcTAQ58i5xDvJm4=; b=sdH3+sVcKR/VGqbX7Mt/80sg021+7job1R9py8Iu+ASCNfjiP+XJJS0kvlsrNKQZl3V34Yl3w/g1qlL7a1hq3b9697fLXyFFVZ2M2S9cWyW26m/EFIWQVhwqbZxOMOX4LJOGBUbhpm7gwYPqCFxqZf8GG8OA+4qw3NZ7SmXFT7Fgws7oXdJW/ZFwooC+8D2wBv8OORxiVSmUKeFelW9oFnrJ7Gp6HN9VtYxY++RXN1UMlJjI8eaRjWRRDTy1FYo/oorZnnfzz8426sZ3rfhf7Qyc9THhicE3EXcmVr9Pod1L7k5Z9pAhrIj/q6O3ZiIa9y7+Od7HphXYs1JJbM5a0g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) 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=CGyq98gXrbt2fQOpCTiyB3Uq9KVdkcTAQ58i5xDvJm4=; b=Eap3dI+n2RmXgTXRgiK/swIK0y6zHbbLUyWx1hHiyOjTGBwFqwReRI9DXOADRQdA2RR4Gpv9qXqgHlZLBoE7aZAv3S+ICelpc1RSw66uADvFQ3PWgimseDfs5qCuqfMqsubHEW6FAjUaxRsi5EIyhX0IsbpmkKal0tfnR/g/c5r64KoBv+u1dR7n1iMKMGXOJ21RJmoofXJhME8FKyvGHRoA/ZJCBRHmhHBW0P337ZWoHTH6FpoVBvU5QJ2v4Cx1ItH1QNZodw4ysnUv2NZHwuuOJn87ifRFTf/xKdXnPkbDB0PwleCeRDw3OYmvl0BYRuLiwnazcp61xL1/BimSUQ== Received: from PH8P220CA0052.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:2d9::6) by DM3PR12MB9436.namprd12.prod.outlook.com (2603:10b6:8:1af::20) 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 10:04:11 +0000 Received: from MW1PEPF0001615E.namprd21.prod.outlook.com (2603:10b6:510:2d9:cafe::91) by PH8P220CA0052.outlook.office365.com (2603:10b6:510:2d9::6) 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 10:04:11 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by MW1PEPF0001615E.mail.protection.outlook.com (10.167.249.89) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.315.0 via Frontend Transport; Tue, 4 Aug 2026 10:04:10 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) 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 03:03:52 -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 03:03:51 -0700 From: To: CC: Kyrylo Tkachov Subject: [PATCH] match.pd: add the inclusive or dual of the masked comparison rule Date: Tue, 4 Aug 2026 12:03:43 +0200 Message-ID: <20260804100343.56241-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: MW1PEPF0001615E:EE_|DM3PR12MB9436:EE_ X-MS-Office365-Filtering-Correlation-Id: 8b40ba9c-6afc-4f04-35b8-08def20fbb1d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|82310400026|23010399003|36860700016|376014|13003099007|6133799003|11063799006|56012099006|10067099003|18002099003; X-Microsoft-Antispam-Message-Info: fyY/jpn13dDyt/kxl8LxvO4tO+JsD5oR7sI82C8G8GbZIiQtZFeh91kvrWWpbgVrWHMe/go/iQbFzztnfsfAjITCw1AIuRpJN14tUeFR9Y3fSxXgVNBASu2VnnzhIQwOBsI2z/K4qx95Kv6a+Ff3kSNzpPn920swzCNB0lotksPPQULr6m0ibssL2jaDOuLW/+QdTuHrtg3rf7eAvQYeIcDfCwkK2Xg8ay6NkV73s3w0I0etu3MIFyPgT0qOcQHJxX0Q89o+icJVWVhqIH0fY6wELQcVvxF8VXjHd1b4imK5b7fIHa5GR0xEjbfUBKfFuuEj0QOp8t166h6kjJBi8fWP8IwDPw+ic0KNZjL32mY5/jxCl2XqRuu6QXIW3hv1JvJ9kBrYZFpG3EkG6HcZ11NOXETcOSBeFWjkuoa7H05+0Pd40XCLQwcASVJuAhIkxjiW71p44joxfqtdpPWyLLdMByCi5fN/BEtGma0iGXRVj44LmKt74+TtCJP6ZfNlBF3x/g8nAGO+LDDDaSI+lH3APFxqGJSUu3s7by6jjK7IvmO7qPhj1EWo4txjF9fKJ+15a1LPDqhLGABF7zoKSpT/sTroXOMTZ17e2mGKTalCes7m5lGQSMiF8kqmXSKTX/esFpQ2fFJ+GE0IDzE2Dv66tYDkjemoaBVChsFfwWhpMTbsWJaQWXp3KDjSn9i8N4qobVkNMLykCew9+kO/0A== X-Forefront-Antispam-Report: CIP:216.228.117.161; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge2.nvidia.com; CAT:NONE; SFS:(13230040)(1800799024)(82310400026)(23010399003)(36860700016)(376014)(13003099007)(6133799003)(11063799006)(56012099006)(10067099003)(18002099003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: y8lJdWdIz6BycPTZ9jyTckffZEvSemd1XXoVWhe0QMDTEYUdAv/yU1KywpnelePonqod/2hNPkjZ5CzgbtCl6+QsJ1DqQfc2ooKYU8NPYPueBQ+SZ1gm7oDLGNmMufQZyBmbGvlSJh7DrCdR79AzDzlbr24DyhkUI5QNxuHIeav4qKzfie+1g4mS2gulRNYHteRyy93UAps5HiAgCIgl8c0pgCuVv81r3mbBaD4EgiUrOY9f1IHW9rRgCJFigGhRSLh3kxtGR0Ylk0cHkxgKBtnEYAbcH0f88692IZR1TnTlJTlYPAlNaI7BpVWvifBLNV0OhjXTTJOVJELg6Cd9G7N8wEM4G/szlEBbLkKvPGIJw6gDxo8D2V2P6gbnTzDq7NDgaidNpmz4b+I/oDebuLKu7uq8EK7TIvnNgNW9BSmEy9n5sxUuxTquL1cVZJS0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Aug 2026 10:04:10.9493 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8b40ba9c-6afc-4f04-35b8-08def20fbb1d 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.161]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: MW1PEPF0001615E.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR12MB9436 X-Spam-Status: No, score=-8.4 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 (X & C) == (Y & C) already folds to ((X ^ Y) & C) == 0. The dual was missing: two values ored with the same constant agree on the bits that constant forces, so only the bits outside it can differ. int f (unsigned char a, unsigned char b) { return (a | 32) == (b | 32); } aarch64 -O2 before: orr w1, w1, 32 orr w0, w0, 32 cmp w1, w0 cset w0, eq after: eor w0, w0, w1 tst w0, 223 cset w0, eq This is the case insensitive ASCII comparison, and any equality of two values on a masked field. The rule sits directly beside its bit_and dual, inside the same eq and ne iterator. Bootstrapped and tested on aarch64-none-linux-gnu. Ok for trunk? Thanks, Kyrill gcc/ChangeLog: * match.pd ((X | C) ==/!= (Y | C)): New simplification. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/ior-cmp-xor-1.c: New test. Signed-off-by: Kyrylo Tkachov --- gcc/match.pd | 11 ++++++++++- gcc/testsuite/gcc.dg/tree-ssa/ior-cmp-xor-1.c | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ior-cmp-xor-1.c diff --git a/gcc/match.pd b/gcc/match.pd index 85fea9fa18f..d5b5924d41f 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -8555,7 +8555,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* (X & C) op (Y & C) into (X ^ Y) & C op 0. */ (simplify (cmp (bit_and:cs @0 @2) (bit_and:cs @1 @2)) - (cmp (bit_and (bit_xor @0 @1) @2) { build_zero_cst (TREE_TYPE (@2)); }))) + (cmp (bit_and (bit_xor @0 @1) @2) + { build_zero_cst (TREE_TYPE (@2)); })) + + /* (X | C) op (Y | C) into (X ^ Y) & ~C op 0, the dual of the rule above. + The two values agree on the bits C forces, so only the bits outside C + can differ. */ + (simplify + (cmp (bit_ior:cs @0 @2) (bit_ior:cs @1 @2)) + (cmp (bit_and (bit_xor @0 @1) (bit_not! @2)) + { build_zero_cst (TREE_TYPE (@2)); }))) /* (X < 0) != (Y < 0) into (X ^ Y) < 0. (X >= 0) != (Y >= 0) into (X ^ Y) < 0. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ior-cmp-xor-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ior-cmp-xor-1.c new file mode 100644 index 00000000000..0abd54049c3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ior-cmp-xor-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +/* Two values ored with the same constant agree on the bits that constant + forces, so only the bits outside it can differ. The dual of the existing + (X & C) == (Y & C) rule. */ + +int f1 (unsigned char a, unsigned char b) { return (a | 32) == (b | 32); } +int f2 (unsigned a, unsigned b) { return (a | 32) != (b | 32); } +int f3 (unsigned a, unsigned b) { return (a | 0xff000000u) == (b | 0xff000000u); } + +/* { dg-final { scan-tree-dump-not " \\| 32" "optimized" } } */ +/* { dg-final { scan-tree-dump-not " \\| 4278190080" "optimized" } } */ +/* { dg-final { scan-tree-dump-times " \\^ " 3 "optimized" } } */