From patchwork Wed Sep 2 14:52:46 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 142723 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 E77954BAE7CE for ; Wed, 2 Sep 2026 14:56:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E77954BAE7CE 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=eg5qOvDj X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazlp170100005.outbound.protection.outlook.com [IPv6:2a01:111:f403:c111::5]) by sourceware.org (Postfix) with ESMTPS id EDD984BA79BD for ; Wed, 2 Sep 2026 14:53:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EDD984BA79BD 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 EDD984BA79BD Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:c111::5 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788360826; cv=pass; b=sR6m4WqrGYvPZU3cRiPehawGZlgG36Vmvu8iAlYKzloZGTRu7vCOrwjnK1LVqTWim54JqU7c85LPW9rjbJXdnby97DaKxDjYRd6JUMkDtCb7djnCGYarkcy9x5FczBV/ZZimhaQuhQd4+5nRdafWmeiK4La6aBbZECaK3ABWa6w= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788360826; c=relaxed/simple; bh=nKzw1JUMKa/GtfsoiRu31IBQNOAGupzL3hkFj8tEajY=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=WMFboKYnbeUsL2Rbcj4Qjw8mMxVQCWp1HbMxK/ihUBeaMUTcbQgAAuabr3JFTl7w1vdimjPSVDJihgn2N7xnPcnIeA7ejEB4nvRcx/8+MwQb1gcqhJeacnIwvbhmqAc1C8vDJTb5hI2Lkis7wbUEni8CP5pYGLBP9cuasGk1MXU= 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=eg5qOvDj DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EDD984BA79BD ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BGLxYGkJ8JlbzOIh2eTOG4LNvEQWbIQtnrKbUM/UpUEi5m5c8VPfdFwjbMMBALRfsRej3qtZARPdnL8R/O6ApMvLBHAYj2lJiKSliz7KFToAX7N1c2I/7idKTjlC53i+YKn09DWYxCABq4VPJdkwvjF7+COReJNt23wC5AGy3ifsyR2Vjkg1r9nEUuEUTaFj6YGT7J3sMu3IF7UzCCj847DdlX0ivO0364iOxZmcLiaE4jFZ11gZcssLqRyXNQwzy9P1RYRR02aknCaRRyiRU1QtMXHrzucjz1gLjJVQBIR4t4gYSa+tUXl04JKPF/9JdcX7ySFdubVQaUMGIJwuYg== 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=a6tYjBMFfjMc9PuXn+kKAf4iUuIen4ASz0ZmKXXkXxY=; b=eM1fwuhROeYrBZwL6mtTF9TdXJc0OCUoX0qH81rRcSZH3oFfjqcyhIk6ds1GFW+6H/HI840yjjsDq+A7Y5y9YeblEMQCF+l+uBwL5lwvDKovyYMgiK4aSWhylSddmbSH2hbux7aBDe6yZxrLJI7UXaVl8cEwB3boekRJWlkcMtVwQcwkT57kfLDZWwKcV1+KLKOPL2yy/GLbxKK422nxpnnNVuYZHHerjEcz7hrCb/ygoF+YAvzzywEMEXIQ+WraAcbTpR5a6jcohvCof2LnBZvFsSkBenEQa/dBbeBWLUzGNF6/8Pdx2g+13xgZJBcvEq4Q5tE8xODWtRIr7V4pmg== 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=a6tYjBMFfjMc9PuXn+kKAf4iUuIen4ASz0ZmKXXkXxY=; b=eg5qOvDjiHixQlsQj2xun/BVCJatUJLVZVDWvstJ8GqLeNKl+p1OXA3ZncQ7RCh4rO7If4SALRG5Y2KTfdwMvxE3/6l2Ypr/Y9nMAz9HkR+VAwoT5toEa4mD9BGh3w65lPB3fikPOZxRhrfpCFLE3elz0GWV5RQeQkr6juyb7CDNUMxDwtZyG9BHgr91xoccM7aVr+i85WpimzicFX4ypIuld+kpCmhpdGR18/8eCXkkyoLHhislqMMzpVxjqO8TCehCZTC+PNQGLuCKyO89rJMBu81O9mqnAixas4mqyraH+IFajDxzi6n2g4QhsIEbXE+tJCu9L8scXFtTl/UMlA== Received: from MN2PR07CA0028.namprd07.prod.outlook.com (2603:10b6:208:1a0::38) by BY5PR12MB4097.namprd12.prod.outlook.com (2603:10b6:a03:213::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 14:53:40 +0000 Received: from BN3PEPF0000B070.namprd21.prod.outlook.com (2603:10b6:208:1a0:cafe::4a) by MN2PR07CA0028.outlook.office365.com (2603:10b6:208:1a0::38) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.12 via Frontend Transport; Wed, 2 Sep 2026 14:53:40 +0000 X-MS-Exchange-Authentication-Results: mx.microsoft.com 1; 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 BN3PEPF0000B070.mail.protection.outlook.com (10.167.243.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.1 via Frontend Transport; Wed, 2 Sep 2026 14:53:40 +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.46; Wed, 2 Sep 2026 07:53:13 -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.46; Wed, 2 Sep 2026 07:53:11 -0700 From: To: CC: Kyrylo Tkachov Subject: [PATCH 05/13] match-sat-alu.pd: Recognize more unsigned saturating subtraction forms Date: Wed, 2 Sep 2026 16:52:46 +0200 Message-ID: <20260902145254.77832-7-ktkachov@nvidia.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260902145254.77832-1-ktkachov@nvidia.com> References: <20260902145254.77832-1-ktkachov@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.37] X-ClientProxiedBy: rnnvmail202.nvidia.com (10.129.68.7) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B070:EE_|BY5PR12MB4097:EE_ X-MS-Office365-Filtering-Correlation-Id: 1089288c-ee67-47c5-4b69-08df0901fa29 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|23010399003|82310400026|36860700016|1800799024|10067099003|6133799003|11063799006|18002099003|22082099003|56012099006|13003099007; X-Microsoft-Antispam-Message-Info: +wo9iCaOJ+6WV58Bc1Vhds5CXwuM2cwTm0QPll7+OGPzcyM8LrbOB6Fd5ncspic0nCKFx4ld5+GUNAvlVKBlF9npUyjVV803TGgRB0SF8aM836ju+rStozA+xcLf4V0XaXQBnvsWlqaCGETFERKpLw5Nu5NQDopl2nW89xUHu550rOTG8+75kRvPP95eLr9++wqm84zeRhHmI0RYxeqsLIzXFWTZ1mzrocJ5zGciCj+yf+O8hriUPcGAlvkGfDdBa6QTjjH+CxjLxdigYZtH7+k0HAidljg6wdRdq7zVCYtedhigx/kswz4FM1vYth70WcxZwiao1PjgyoHpy8vCqb1WKgWlPs5cifgdRd/z1TBFyzHnh3SaueZhLdeSJJ63xSOOgTwMOTGC4MnmJLLJogZiImzVEutnj6r7ebSaoLKO/Wp4QP8DDpZ58tgw78rsInnULNbEVJKgNKL7GD23006tGtsfzpDJlxYxTOl261gfWR1Af415+vgvIIbVx3OrRkLmQ68nj1XpMhRIaEFLvLldlFdLnRNf7FjFJIRHwFTZ//rz9cUmKNe3d8hwv0TI1Seg9/uP1Ie4iqExCxEshAsuuZIsNsuGfyrdGJiJZCLpW6OT2cDMlapmv++P8Ep2MPhh9yw1mvxurDTlCYfvLDmvekHv1efnm5YV1oguiFQ7hhhufrFabvQxjOwxnh1OJYP2bLrvRWR7b6kRzDbYZA== 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)(82310400026)(36860700016)(1800799024)(10067099003)(6133799003)(11063799006)(18002099003)(22082099003)(56012099006)(13003099007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: zdkVDol9A04Qkz1EzlwmCpSf/GDa9Uqb4dZ8wHguZ1lktNjgtS/F6jBC2LYIrAiCOpjNiGe9gdUT5YmoUwUWOKX8fL/qN1jQ6skMHPVzQXcP3jpBOQEzjNzvfzweVGBCmuVgAN1u2nRImqnPevC0XgSregFMiNxPWbqzrw/uHomOJ2wEp6bocsRT+1/lLXWiLj5BKiVvj6ztJdBEjOUsoyP3v2d+jks0YuipJdgGUcF2AYhXrK7l3u1nYz2Eoji/CgCbvZKrTBQSEDEI2w52bfMssWW5Vxxe9H/NybTrJnCtzgNX5atibIX8ADWgmOHrkAPSBQkzlcSuPM511O/7Up03HOmzcCqHAaLiUK8bZqOw7WsmUDlWJwEzHhdAdV3NLcXVGLiOKqfkFuRyHxN+iE+FMfkAYdOW4fgjXlKuK+uiLnlST9AiagwOH4OpIUoF X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 14:53:40.4576 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1089288c-ee67-47c5-4b69-08df0901fa29 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: BN3PEPF0000B070.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4097 X-Spam-Status: No, score=-8.1 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, KAM_SHORT, LOCAL_AUTHENTICATION_FAIL_SPF, RCVD_IN_DNSWL_NONE, 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 Equivalent unsigned saturating subtraction forms can reverse the comparison operands or the conditional arms: B < A ? A - B : 0 A < B ? 0 : A - B The middle end can keep either comparison operand order. Control flow with two returns can also reverse the conditional arms. Recognize both forms and reversed comparisons in the multiply-by-predicate form. AArch64 -O2: before: sub w2, w0, w1 cmp w1, w0 csel w0, w2, wzr, cc after: subs w0, w0, w1 csel w0, w0, wzr, cs The vector form replaces a comparison, a subtraction, and an AND with one UQSUB. Bootstrapped and tested on aarch64-none-linux-gnu. Ok for trunk? gcc/ChangeLog: * match-sat-alu.pd (unsigned_integer_sat_sub): Accept commuted comparison operand orders and the arm order from a two-return source. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sat_u_sub_swapped-1.c: New test. Signed-off-by: Kyrylo Tkachov --- gcc/match-sat-alu.pd | 29 +++++++++++++++++++ .../gcc.target/aarch64/sat_u_sub_swapped-1.c | 27 +++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c diff --git a/gcc/match-sat-alu.pd b/gcc/match-sat-alu.pd index dfb2eb9800f..b3dd8db0d27 100644 --- a/gcc/match-sat-alu.pd +++ b/gcc/match-sat-alu.pd @@ -131,6 +131,35 @@ along with GCC; see the file COPYING3. If not see /* SAT_U_SUB = (X - Y) * (X >= Y) */ (mult:c (minus @0 @1) (convert (ge @0 @1))) (if (types_match (type, @0, @1)))) + /* Accept the comparison with its operands in the opposite order. */ + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (lt @1 @0) (minus @0 @1) integer_zerop) + (if (types_match (type, @0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (le @1 @0) (convert? (minus (convert1? @0) (convert1? @1))) + integer_zerop) + (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && types_match (@0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (mult:c (minus @0 @1) (convert (lt @1 @0))) + (if (types_match (type, @0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (mult:c (minus @0 @1) (convert (le @1 @0))) + (if (types_match (type, @0, @1)))) + /* A source with two returns can keep zero on the taken arm. */ + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (lt @0 @1) integer_zerop (minus @0 @1)) + (if (types_match (type, @0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (le @0 @1) integer_zerop + (convert? (minus (convert1? @0) (convert1? @1)))) + (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && types_match (@0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (gt @1 @0) integer_zerop (minus @0 @1)) + (if (types_match (type, @0, @1)))) + (match (unsigned_integer_sat_sub @0 @1) + (cond^ (ge @1 @0) integer_zerop + (convert? (minus (convert1? @0) (convert1? @1)))) + (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && types_match (@0, @1)))) /* The wrapped difference exceeds the minuend exactly when the subtraction borrows, so a source that names the difference and then tests it against the minuend is a saturating subtract. */ diff --git a/gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c b/gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c new file mode 100644 index 00000000000..fb42b6b07e3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sat_u_sub_swapped-1.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; + +/* The same saturating subtract with the subtrahend written on the left of + the comparison. GIMPLE orders comparison operands by SSA version, so + which spelling survives does not follow the source. */ + +#define DEF(N, T) \ + T f1_##N (T a, T b) { return b < a ? a - b : 0; } \ + T f2_##N (T a, T b) { return b <= a ? a - b : 0; } \ + T f3_##N (T a, T b) { return (T) ((a - b) * (T) (b < a)); } \ + T f4_##N (T a, T b) { return (T) ((a - b) * (T) (b <= a)); } \ + T f5_##N (T a, T b) { if (b >= a) return 0; return a - b; } \ + T f6_##N (T a, T b) { return b >= a ? 0 : a - b; } \ + T f7_##N (T a, T b) { if (a < b) return 0; return a - b; } + +DEF (8, u8) +DEF (16, u16) +DEF (32, u32) +DEF (64, u64) + +/* { dg-final { scan-tree-dump-times "\\.SAT_SUB " 28 "optimized" } } */