From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20061.outbound.protection.outlook.com [40.107.2.61]) by sourceware.org (Postfix) with ESMTPS id E6B47385800A for ; Fri, 23 Sep 2022 09:16:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E6B47385800A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=ikDWhUaDP9rLqEeMwkwZjHzkNTbqOpIhcA+1arpmx23RN+skIjyndxGFiJ2hNQUxCzdCrFj0ozDX5l59OEVVWZxLfN947QgwD1T5Sb2slsmrYWA5W2MS4MXzZyuzLCZ9m5PpXpCj7lvXR9+qs/m0taBtw9jZGi1DWSgDBH1qkrIA4KqqXxGPWyo5mVLzAa1AMfXtKVkj7nEgfFvGfjzc9QRttLnJxAm+++LvIOz3bCP99O1frwtHQnyuvxn44KtrfVt7vNimIRelXrhLNwAFZs44eez3Pyam1K6Hr23hBsnrH6EolenIcjnSzJMdvFDfp50O703hKflrz6EPOmjP+A== ARC-Message-Signature: i=2; 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=FmGKLnIFRzmIfTQ8AmLt5yWLWG1+2FWeusq5cu4176c=; b=JOoNda0Vmi8iZ12cR0cvrIZPWBiMFRD/om5z9e1lZurJ3LUuhfpMgA8zuWdoqiZcAF2mWlMTXGXxjOg8u8VZcWgbafpngkf5S2oeIIU/cqsUPc3WnGvV+ELEh53hUl+wHWyo3PKS0kVxZu00p8DMEX7oMbwXcWGhpwXYfSsPu0xKkMh9cd+XnoROk+qvT0zagEqEr4JRjQWxGQ/hmdFHQU0+J5cS8hphrsAhaOGiUe39EXmY7R1LqRo9uDTOOzCRG7OcK8LiuQXHPM760pUGrEGi816jf48XvY/EUUPMj9SGXxBcgAMj/Nf9v+NuaVi+vRORP4OEoGERbLVY3pPQcw== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FmGKLnIFRzmIfTQ8AmLt5yWLWG1+2FWeusq5cu4176c=; b=yWOUaTM1xxZaX41i4+IqghoBEzYI6Gcwr+2RcP9Gog3FFjBPowSeHNuEarm9lvSgX0BdbWd/C/E0U9yLiruv6so/FGx/W9ShLAFKwNl+ldsl3gLQs1hBiFs0CAdGdE0yUNgPqsWGsB3apfQB7E8MphYqLugievXKSSU6x53HJfQ= Received: from DB6PR0801CA0062.eurprd08.prod.outlook.com (2603:10a6:4:2b::30) by VI1PR08MB5423.eurprd08.prod.outlook.com (2603:10a6:803:133::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.16; Fri, 23 Sep 2022 09:16:19 +0000 Received: from DBAEUR03FT019.eop-EUR03.prod.protection.outlook.com (2603:10a6:4:2b:cafe::d1) by DB6PR0801CA0062.outlook.office365.com (2603:10a6:4:2b::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.20 via Frontend Transport; Fri, 23 Sep 2022 09:16:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT019.mail.protection.outlook.com (100.127.142.129) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.14 via Frontend Transport; Fri, 23 Sep 2022 09:16:19 +0000 Received: ("Tessian outbound 88978e6d60db:v124"); Fri, 23 Sep 2022 09:16:18 +0000 X-CR-MTA-TID: 64aa7808 Received: from a9971a877c73.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id A6174852-1A20-43F8-8843-38FEC5889D28.1; Fri, 23 Sep 2022 09:16:12 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id a9971a877c73.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 23 Sep 2022 09:16:12 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HSTMs/Ohoa/iE87NtNTgW7uwXR3eUp9H0mbK2XVnPl9V3iEjXwq9eKilb5awxwsHFFjxBYNFvpL96zce8pG39SUcJ2wGXgBP0sZrAybNiczYplhFP0Qn9JZ+m4m1BTwsWtywxFGOFiFyyNv13vC2I6FlAkKcjMn0kWbT2kAnoDnory33yl7fYSGTbJ7+0qk8LE3AmdYYiAzeZUCYQ/IpgxHYcBk2mjrw1eVA7ZUpQMk/KQDLRzb35++Z8kL3oqv/Zh413GbbiGdkMR0IJnxGQNROGKbzja/jghu/SSS6MbHYWoMsqNpPp7ZZRbXXLSKkAkqJ7ZzwNHA2B4MGsAsIlQ== 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=FmGKLnIFRzmIfTQ8AmLt5yWLWG1+2FWeusq5cu4176c=; b=k3f8lB31cPnJwbPplXIvnKSBWWGhkmDcva/8WVKqDMjQUiTWiGMxmDvuGz0cTJmvxNCjH/mehvAKP9hSP0sUstvACu3am51kvI4OmG0wL8yy60bnw6KEiuBFZbNbNki/20ycYMFwFcBGpFUNoMY15KtBkP5pgwWp7gFdNlQqWeroLt20HkOUbQIEJiM0E1qql00feo1UQD+cs5snAwkj0tAkFONcdhEitok8Oal8Q27MQ8iaz6gvkMMgx6EianDMkZubz0kssEOlsN5a/cA0inakV6qFvddKESKuZRF+BEVJp6casshkzWXy4oPoON/Gp3k8eKf8Ga6WGCuXonBD6A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FmGKLnIFRzmIfTQ8AmLt5yWLWG1+2FWeusq5cu4176c=; b=yWOUaTM1xxZaX41i4+IqghoBEzYI6Gcwr+2RcP9Gog3FFjBPowSeHNuEarm9lvSgX0BdbWd/C/E0U9yLiruv6so/FGx/W9ShLAFKwNl+ldsl3gLQs1hBiFs0CAdGdE0yUNgPqsWGsB3apfQB7E8MphYqLugievXKSSU6x53HJfQ= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by DB9PR08MB6444.eurprd08.prod.outlook.com (2603:10a6:10:23c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.20; Fri, 23 Sep 2022 09:16:10 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::6529:66e5:e7d4:1a40]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::6529:66e5:e7d4:1a40%4]) with mapi id 15.20.5632.021; Fri, 23 Sep 2022 09:16:09 +0000 From: Tamar Christina To: Richard Biener CC: Andrew Pinski , nd , "gcc-patches@gcc.gnu.org" Subject: RE: [PATCH]middle-end simplify complex if expressions where comparisons are inverse of one another. Thread-Topic: [PATCH]middle-end simplify complex if expressions where comparisons are inverse of one another. Thread-Index: AQHYgYV05EjYER2K3U6QUesqLBCP9q1YBFAAgBf6HbCAALlnAIAA4k0AgABCX4CAAMr7gIAByk8AgHjkW2A= Date: Fri, 23 Sep 2022 09:16:09 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: 40322C6709D8384F9539C73F532143F4.0 x-checkrecipientchecked: true Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|DB9PR08MB6444:EE_|DBAEUR03FT019:EE_|VI1PR08MB5423:EE_ X-MS-Office365-Filtering-Correlation-Id: 13bd1256-f940-4921-e9a3-08da9d444673 x-checkrecipientrouted: true nodisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: drffLzxUjl/b70cHGw6A31cUkWGRLPIDnjBt7nKTgKJbgyGWoSkyVmvCg8/LksXZdQAoN+P9PZ8VQJYwNi6atzmHOy6ksiyODaQNzd27aGdNopZR+YPIjeMiOwlASfk5rKnrommT5bM5IBdicn3jsF9H0MaMOCPsynU2Cw7ofB608EfrM+1BCS6LHJPP7X57DF9sv1KIGfHouQYnc7JvsyA97qsu+3kijsQo9Y9pEwSaA3CGevZkGrmzLNO0JnPKFZv7USI8VPYvZCEKeuCyq2pS0ibscaLXBnWVcTvlfeqb8vo/MKymtK5qQyjNgGa+UZdTwYdJH3y/uoknVNcFvmn9k5FD/sEdecBZ7ZdBJ215ETourdEdbrrTs0y2FcYsr6q0sS0AjDutW6kJfDHln27sUyGv7CbTBmACMf8gpboYmEbW4u/dmlSlwtDkkQeECOBtqEVZpUSlxBWbPtT3otPnAI9DDgPgrKofQzZxtTeH8ywgQfpWw6xcWoexUzdWEihbwBUxfnvbHxyxc45VLiUoGOxydo+lABPb0r8BnwQ8lRkyYWl6PIyNgdFxhQdlaOHxGY8nMqbsaFF2AEf2T6uaINuTNM8ViZa4lsuYp0NwXgPuPqt8QndDd2kgV7EC8um2jogQNyzNsKYY0HiN6SA0KSr4tiPrcCLIbMuUiVYm3dDhtKT+4+rLGghjdtLr8uLGlAmKDtio4TOaUVaCpePBGrBOgzHq39K9oaJ6EKpvNksn5HkmQLYO/cU3BNNhqHjG/4v2k8xjjed58asVew0kCd8LtURVPMGDxmMgQdhcsKE0NyO4xpcnHUkBwfbRfcbesqF8YFAELo/xZ2aXWw== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB5325.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(346002)(376002)(136003)(366004)(396003)(39860400002)(451199015)(2906002)(66476007)(41300700001)(5660300002)(64756008)(76116006)(4326008)(66556008)(66446008)(66946007)(8676002)(52536014)(8936002)(71200400001)(84970400001)(478600001)(186003)(6916009)(122000001)(38070700005)(9686003)(7696005)(99936003)(6506007)(316002)(54906003)(26005)(38100700002)(86362001)(55016003)(33656002);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB53250B2BCAC9D321B88DB088FF519VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB6444 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT019.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 9a980613-5c81-4e61-d297-08da9d4440c6 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BaU6FYLvSITcbwE1A9jPpzkTwIMIobqclTpZ6pywhP01kzoNeQ9s/us9Pc7QdOtITPw79WtgSPjO9B/HH3y4SaIM1/G91WvdIio4zoBuiDzB8gCFBRfK5mefXL1WInMsDpJ9SJpZ9S8HYrLjcHc7ddYskcl5lssZ249Gg/D0Ag02mr5svqZkt5AL3BKIo8iHPxj/3xnd2oraJa6SpO2ekEq7v2HB57XP7CXwxtQKuSEYlp5E3W9EEtCLCSyNYHKljuJaT3hDTIeYm5UM1KeGh1vJEM/P3sXWLiF5GUR0hxotfGdiXdEAvijFLQckJwQF9fQ+10jQ5crlZVNJvdi0ALMIAZOk3lqlPZuc8EPJK1LYG7gGWaSHyO2zESf2e9xR+mwgVwl4u4Ki2CJ2npEFCWyUhdpb6JEqcRjSUQgwB4q6HWwn0HNouKYbtGpaaf0xxskemjKlbK48ZwMlWzTZgSDx0AcFvFCirkzI+RbCqq8HtWwWBCg2xz20H1cqesRlTplrTMEGS/uMJ2qb9sUMwTTEOo5bJJHAXno0bHk5Y4/lRjNjcRuzHFfkFz1QSWDnIufzEbaFDRLd2OsdBgv3octaHYmrv0d+Fgn8GUlAHa7LZYDF1ObnqKLPUfe2ggbtXeK24qHfnAFMlvbevoPCoMMpttcn7DObjI/RQE/JsTiJzSCgQ2KQJ3AevjI0Jo6XZ7vPxEMBi1rGuK+AI6irbLCEGg+2fqAeyWkHKrEBmBOpCRNyf6C8CGOUMtXgjdtaj+vehxQJ27O/BlUb691tsqu/0OXrf+LSRJaSRbywhfB5Hpmr9MI+FeNEOw3kLZcfyfba4bePC889u5RB3Xn0PQ== X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230022)(4636009)(376002)(396003)(39860400002)(346002)(136003)(451199015)(40470700004)(36840700001)(46966006)(82310400005)(5660300002)(82740400003)(26005)(6506007)(8936002)(6862004)(40480700001)(41300700001)(70206006)(4326008)(81166007)(99936003)(7696005)(70586007)(8676002)(186003)(54906003)(52536014)(86362001)(336012)(36860700001)(55016003)(316002)(47076005)(2906002)(356005)(9686003)(33656002)(235185007)(40460700003)(84970400001)(478600001);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2022 09:16:19.1528 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 13bd1256-f940-4921-e9a3-08da9d444673 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT019.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB5423 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY 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: --_002_VI1PR08MB53250B2BCAC9D321B88DB088FF519VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello, > where logical_inverted is somewhat contradicting using zero_one_valued > instead of truth_valued_p (I think the former might not work for vector > booleans?). >=20 > In the end I'd prefer zero_one_valued_p but avoiding inverse_conditions_p > would be nice. >=20 > Richard. It's not pretty but I've made it work and added more tests. Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: * match.pd: Add new rule. gcc/testsuite/ChangeLog: * gcc.target/aarch64/if-compare_1.c: New test. * gcc.target/aarch64/if-compare_2.c: New test. --- inline copy of patch --- diff --git a/gcc/match.pd b/gcc/match.pd index b61ed70e69b881a49177f10f20c1f92712bb8665..39da61bf117a6eb2924fc8a6473= fb37ddadd60e9 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1903,6 +1903,101 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (INTEGRAL_TYPE_P (type)) (bit_and @0 @1))) =20 +(for cmp (tcc_comparison) + icmp (inverted_tcc_comparison) + /* Fold (((a < b) & c) | ((a >=3D b) & d)) into (a < b ? c : d) & 1. */ + (simplify + (bit_ior + (bit_and:c (convert? zero_one_valued_p@0) @2) + (bit_and:c (convert? zero_one_valued_p@1) @3)) + (with { + enum tree_code c1 + =3D (TREE_CODE (@0) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@0)) : TREE_CODE (@0)); + + enum tree_code c2 + =3D (TREE_CODE (@1) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@1)) : TREE_CODE (@1)); + } + (if (INTEGRAL_TYPE_P (type) + && c1 =3D=3D cmp + && c2 =3D=3D icmp + /* The scalar version has to be canonicalized after vectorization + because it makes unconditional loads conditional ones, which + means we lose vectorization because the loads may trap. */ + && canonicalize_math_after_vectorization_p ()) + (bit_and (cond @0 @2 @3) { build_one_cst (type); })))) + + /* Fold ((-(a < b) & c) | (-(a >=3D b) & d)) into a < b ? c : d. */ + (simplify + (bit_ior + (cond zero_one_valued_p@0 @2 zerop) + (cond zero_one_valued_p@1 @3 zerop)) + (with { + enum tree_code c1 + =3D (TREE_CODE (@0) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@0)) : TREE_CODE (@0)); + + enum tree_code c2 + =3D (TREE_CODE (@1) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@1)) : TREE_CODE (@1)); + } + (if (INTEGRAL_TYPE_P (type) + && c1 =3D=3D cmp + && c2 =3D=3D icmp + /* The scalar version has to be canonicalized after vectorization + because it makes unconditional loads conditional ones, which + means we lose vectorization because the loads may trap. */ + && canonicalize_math_after_vectorization_p ()) + (cond @0 @2 @3)))) + + /* Vector Fold (((a < b) & c) | ((a >=3D b) & d)) into a < b ? c : d.=20 + and ((~(a < b) & c) | (~(a >=3D b) & d)) into a < b ? c : d. */ + (simplify + (bit_ior + (bit_and:c (vec_cond:s @0 @4 @5) @2) + (bit_and:c (vec_cond:s @1 @4 @5) @3)) + (with { + enum tree_code c1 + =3D (TREE_CODE (@0) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@0)) : TREE_CODE (@0)); + + enum tree_code c2 + =3D (TREE_CODE (@1) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@1)) : TREE_CODE (@1)); + } + (if (c1 =3D=3D cmp && c2 =3D=3D icmp) + (if (integer_zerop (@5)) + (switch + (if (integer_onep (@4)) + (bit_and (vec_cond @0 @2 @3) @4)) + (if (integer_minus_onep (@4)) + (vec_cond @0 @2 @3))) + (if (integer_zerop (@4)) + (switch + (if (integer_onep (@5)) + (bit_and (vec_cond @0 @3 @2) @5)) + (if (integer_minus_onep (@5)) + (vec_cond @0 @3 @2)))))))) + + /* Scalar Vectorized Fold ((-(a < b) & c) | (-(a >=3D b) & d)) + into a < b ? d : c. */ + (simplify + (bit_ior + (vec_cond:s @0 @2 integer_zerop) + (vec_cond:s @1 @3 integer_zerop)) + (with { + enum tree_code c1 + =3D (TREE_CODE (@0) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@0)) : TREE_CODE (@0)); + + enum tree_code c2 + =3D (TREE_CODE (@1) =3D=3D SSA_NAME + ? gimple_assign_rhs_code (SSA_NAME_DEF_STMT (@1)) : TREE_CODE (@1)); + } + (if (c1 =3D=3D cmp && c2 =3D=3D icmp) + (vec_cond @0 @2 @3))))) + /* Transform X & -Y into X * Y when Y is { 0 or 1 }. */ (simplify (bit_and:c (convert? (negate zero_one_valued_p@0)) @1) diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_1.c b/gcc/testsuit= e/gcc.target/aarch64/if-compare_1.c new file mode 100644 index 0000000000000000000000000000000000000000..53bbd779a30e1a30e0ce0e4e5ea= f589bfaf570fe --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_1.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-additional-options "-O -save-temps" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +extern void abort (); + +/* +**zoo1: +** cmp w0, w1 +** csel w0, w2, w3, lt +** and w0, w0, 1 +** ret +*/ +__attribute((noipa, noinline)) +int zoo1 (int a, int b, int c, int d) +{ + return ((a < b) & c) | ((a >=3D b) & d); +} + +/* +**zoo2: +** cmp w0, w1 +** csel w0, w2, w3, lt +** ret +*/ +__attribute((noipa, noinline)) +int zoo2 (int a, int b, int c, int d) +{ + return (-(a < b) & c) | (-(a >=3D b) & d); +} + +int main () +{ + if (zoo1 (-3, 3, 5, 8) !=3D 1) + abort (); + + if (zoo1 (3, -3, 5, 8) !=3D 0) + abort (); + + if (zoo2 (-3, 3, 5, 8) !=3D 5) + abort (); + + if (zoo2 (3, -3, 5, 8) !=3D 8) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/aarch64/if-compare_2.c b/gcc/testsuit= e/gcc.target/aarch64/if-compare_2.c new file mode 100644 index 0000000000000000000000000000000000000000..14988abac45989578b198f28c7c= 0ea203959c08b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/if-compare_2.c @@ -0,0 +1,96 @@ +/* { dg-do run } */ +/* { dg-additional-options "-O3 -std=3Dc99 -save-temps" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +#pragma GCC target "+nosve" + +#include + +typedef int v4si __attribute__ ((vector_size (16))); + +/* +**foo1: +** cmgt v0.4s, v1.4s, v0.4s +** bsl v0.16b, v2.16b, v3.16b +** ret +*/ +v4si foo1 (v4si a, v4si b, v4si c, v4si d) { + return ((a < b) & c) | ((a >=3D b) & d); +} + +/* +**foo2: +** cmgt v0.4s, v1.4s, v0.4s +** bsl v0.16b, v3.16b, v2.16b +** ret +*/ +v4si foo2 (v4si a, v4si b, v4si c, v4si d) { + return (~(a < b) & c) | (~(a >=3D b) & d); +} + + +/** +**bar1: +**... +** cmge v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** bsl v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +** and v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +**... +*/ +void bar1 (int * restrict a, int * restrict b, int * restrict c, + int * restrict d, int * restrict res, int n) +{ + for (int i =3D 0; i < (n & -4); i++) + res[i] =3D ((a[i] < b[i]) & c[i]) | ((a[i] >=3D b[i]) & d[i]); +} + +/** +**bar2: +**... +** cmge v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** bsl v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b +**... +*/ +void bar2 (int * restrict a, int * restrict b, int * restrict c, + int * restrict d, int * restrict res, int n) +{ + for (int i =3D 0; i < (n & -4); i++) + res[i] =3D (-(a[i] < b[i]) & c[i]) | (-(a[i] >=3D b[i]) & d[i]); +} + +extern void abort (); + +int main () +{ + + v4si a =3D { -3, -3, -3, -3 }; + v4si b =3D { 3, 3, 3, 3 }; + v4si c =3D { 5, 5, 5, 5 }; + v4si d =3D { 8, 8, 8, 8 }; + + v4si res1 =3D foo1 (a, b, c, d); + if (memcmp (&res1, &c, 16UL) !=3D 0) + abort (); + + v4si res2 =3D foo2 (a, b, c, d); + if (memcmp (&res2, &d, 16UL) !=3D 0) + abort (); + + int ar[4] =3D { -3, -3, -3, -3 }; + int br[4] =3D { 3, 3, 3, 3 }; + int cr[4] =3D { 5, 5, 5, 5 }; + int dr[4] =3D { 8, 8, 8, 8 }; + + int exp1[4] =3D { 1, 1, 1, 1 }; + int res3[4]; + bar1 ((int*)&ar, (int*)&br, (int*)&cr, (int*)&dr, (int*)&res3, 4); + if (memcmp (&res3, &exp1, 16UL) !=3D 0) + abort (); + + int res4[4]; + bar2 ((int*)&ar, (int*)&br, (int*)&cr, (int*)&dr, (int*)&res4, 4); + if (memcmp (&res4, &cr, 16UL) !=3D 0) + abort (); + + return 0; +} --_002_VI1PR08MB53250B2BCAC9D321B88DB088FF519VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb15679.patch" Content-Description: rb15679.patch Content-Disposition: attachment; filename="rb15679.patch"; size=7184; creation-date="Fri, 23 Sep 2022 09:15:22 GMT"; modification-date="Fri, 23 Sep 2022 09:16:09 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9tYXRjaC5wZCBiL2djYy9tYXRjaC5wZAppbmRleCBiNjFlZDcwZTY5 Yjg4MWE0OTE3N2YxMGYyMGMxZjkyNzEyYmI4NjY1Li4zOWRhNjFiZjExN2E2ZWIyOTI0ZmM4YTY0 NzNmYjM3ZGRhZGQ2MGU5IDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNo LnBkCkBAIC0xOTAzLDYgKzE5MDMsMTAxIEBAIERFRklORV9JTlRfQU5EX0ZMT0FUX1JPVU5EX0ZO IChSSU5UKQogIChpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBlKSkKICAgKGJpdF9hbmQgQDAgQDEp KSkKIAorKGZvciBjbXAgKHRjY19jb21wYXJpc29uKQorICAgICBpY21wIChpbnZlcnRlZF90Y2Nf Y29tcGFyaXNvbikKKyAvKiBGb2xkICgoKGEgPCBiKSAmIGMpIHwgKChhID49IGIpICYgZCkpIGlu dG8gKGEgPCBiID8gYyA6IGQpICYgMS4gICovCisgKHNpbXBsaWZ5CisgIChiaXRfaW9yCisgICAo Yml0X2FuZDpjIChjb252ZXJ0PyB6ZXJvX29uZV92YWx1ZWRfcEAwKSBAMikKKyAgIChiaXRfYW5k OmMgKGNvbnZlcnQ/IHplcm9fb25lX3ZhbHVlZF9wQDEpIEAzKSkKKyAgICAod2l0aCB7CisgICAg ICBlbnVtIHRyZWVfY29kZSBjMQorCT0gKFRSRUVfQ09ERSAoQDApID09IFNTQV9OQU1FCisJICAg PyBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChTU0FfTkFNRV9ERUZfU1RNVCAoQDApKSA6IFRSRUVf Q09ERSAoQDApKTsKKworICAgICAgZW51bSB0cmVlX2NvZGUgYzIKKwk9IChUUkVFX0NPREUgKEAx KSA9PSBTU0FfTkFNRQorCSAgID8gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoU1NBX05BTUVfREVG X1NUTVQgKEAxKSkgOiBUUkVFX0NPREUgKEAxKSk7CisgICAgIH0KKyAgICAoaWYgKElOVEVHUkFM X1RZUEVfUCAodHlwZSkKKwkgJiYgYzEgPT0gY21wCisJICYmIGMyID09IGljbXAKKwkgLyogVGhl IHNjYWxhciB2ZXJzaW9uIGhhcyB0byBiZSBjYW5vbmljYWxpemVkIGFmdGVyIHZlY3Rvcml6YXRp b24KKwkgICAgYmVjYXVzZSBpdCBtYWtlcyB1bmNvbmRpdGlvbmFsIGxvYWRzIGNvbmRpdGlvbmFs IG9uZXMsIHdoaWNoCisJICAgIG1lYW5zIHdlIGxvc2UgdmVjdG9yaXphdGlvbiBiZWNhdXNlIHRo ZSBsb2FkcyBtYXkgdHJhcC4gICovCisJICYmIGNhbm9uaWNhbGl6ZV9tYXRoX2FmdGVyX3ZlY3Rv cml6YXRpb25fcCAoKSkKKyAgICAgKGJpdF9hbmQgKGNvbmQgQDAgQDIgQDMpIHsgYnVpbGRfb25l X2NzdCAodHlwZSk7IH0pKSkpCisKKyAvKiBGb2xkICgoLShhIDwgYikgJiBjKSB8ICgtKGEgPj0g YikgJiBkKSkgaW50byBhIDwgYiA/IGMgOiBkLiAgKi8KKyAoc2ltcGxpZnkKKyAgKGJpdF9pb3IK KyAgIChjb25kIHplcm9fb25lX3ZhbHVlZF9wQDAgQDIgemVyb3ApCisgICAoY29uZCB6ZXJvX29u ZV92YWx1ZWRfcEAxIEAzIHplcm9wKSkKKyAgICAod2l0aCB7CisgICAgICBlbnVtIHRyZWVfY29k ZSBjMQorCT0gKFRSRUVfQ09ERSAoQDApID09IFNTQV9OQU1FCisJICAgPyBnaW1wbGVfYXNzaWdu X3Joc19jb2RlIChTU0FfTkFNRV9ERUZfU1RNVCAoQDApKSA6IFRSRUVfQ09ERSAoQDApKTsKKwor ICAgICAgZW51bSB0cmVlX2NvZGUgYzIKKwk9IChUUkVFX0NPREUgKEAxKSA9PSBTU0FfTkFNRQor CSAgID8gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoU1NBX05BTUVfREVGX1NUTVQgKEAxKSkgOiBU UkVFX0NPREUgKEAxKSk7CisgICAgIH0KKyAgICAoaWYgKElOVEVHUkFMX1RZUEVfUCAodHlwZSkK KwkgJiYgYzEgPT0gY21wCisJICYmIGMyID09IGljbXAKKwkgLyogVGhlIHNjYWxhciB2ZXJzaW9u IGhhcyB0byBiZSBjYW5vbmljYWxpemVkIGFmdGVyIHZlY3Rvcml6YXRpb24KKwkgICAgYmVjYXVz ZSBpdCBtYWtlcyB1bmNvbmRpdGlvbmFsIGxvYWRzIGNvbmRpdGlvbmFsIG9uZXMsIHdoaWNoCisJ ICAgIG1lYW5zIHdlIGxvc2UgdmVjdG9yaXphdGlvbiBiZWNhdXNlIHRoZSBsb2FkcyBtYXkgdHJh cC4gICovCisJICYmIGNhbm9uaWNhbGl6ZV9tYXRoX2FmdGVyX3ZlY3Rvcml6YXRpb25fcCAoKSkK KyAgICAoY29uZCBAMCBAMiBAMykpKSkKKworIC8qIFZlY3RvciBGb2xkICgoKGEgPCBiKSAmIGMp IHwgKChhID49IGIpICYgZCkpIGludG8gYSA8IGIgPyBjIDogZC4gCisgICAgYW5kICgofihhIDwg YikgJiBjKSB8ICh+KGEgPj0gYikgJiBkKSkgaW50byBhIDwgYiA/IGMgOiBkLiAgKi8KKyAoc2lt cGxpZnkKKyAgKGJpdF9pb3IKKyAgIChiaXRfYW5kOmMgKHZlY19jb25kOnMgQDAgQDQgQDUpIEAy KQorICAgKGJpdF9hbmQ6YyAodmVjX2NvbmQ6cyBAMSBANCBANSkgQDMpKQorICAgICh3aXRoIHsK KyAgICAgIGVudW0gdHJlZV9jb2RlIGMxCisJPSAoVFJFRV9DT0RFIChAMCkgPT0gU1NBX05BTUUK KwkgICA/IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKFNTQV9OQU1FX0RFRl9TVE1UIChAMCkpIDog VFJFRV9DT0RFIChAMCkpOworCisgICAgICBlbnVtIHRyZWVfY29kZSBjMgorCT0gKFRSRUVfQ09E RSAoQDEpID09IFNTQV9OQU1FCisJICAgPyBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChTU0FfTkFN RV9ERUZfU1RNVCAoQDEpKSA6IFRSRUVfQ09ERSAoQDEpKTsKKyAgICAgfQorICAgICAoaWYgKGMx ID09IGNtcCAmJiBjMiA9PSBpY21wKQorICAgICAgKGlmIChpbnRlZ2VyX3plcm9wIChANSkpCisg ICAgICAgKHN3aXRjaAorCShpZiAoaW50ZWdlcl9vbmVwIChANCkpCisJIChiaXRfYW5kICh2ZWNf Y29uZCBAMCBAMiBAMykgQDQpKQorCShpZiAoaW50ZWdlcl9taW51c19vbmVwIChANCkpCisJICh2 ZWNfY29uZCBAMCBAMiBAMykpKQorICAgICAgKGlmIChpbnRlZ2VyX3plcm9wIChANCkpCisgICAg ICAgKHN3aXRjaAorCShpZiAoaW50ZWdlcl9vbmVwIChANSkpCisJIChiaXRfYW5kICh2ZWNfY29u ZCBAMCBAMyBAMikgQDUpKQorCShpZiAoaW50ZWdlcl9taW51c19vbmVwIChANSkpCisJICh2ZWNf Y29uZCBAMCBAMyBAMikpKSkpKSkpCisKKyAvKiBTY2FsYXIgVmVjdG9yaXplZCBGb2xkICgoLShh IDwgYikgJiBjKSB8ICgtKGEgPj0gYikgJiBkKSkKKyAgICBpbnRvIGEgPCBiID8gZCA6IGMuICAq LworIChzaW1wbGlmeQorICAoYml0X2lvcgorICAgKHZlY19jb25kOnMgQDAgQDIgaW50ZWdlcl96 ZXJvcCkKKyAgICh2ZWNfY29uZDpzIEAxIEAzIGludGVnZXJfemVyb3ApKQorICAgICh3aXRoIHsK KyAgICAgIGVudW0gdHJlZV9jb2RlIGMxCisJPSAoVFJFRV9DT0RFIChAMCkgPT0gU1NBX05BTUUK KwkgICA/IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKFNTQV9OQU1FX0RFRl9TVE1UIChAMCkpIDog VFJFRV9DT0RFIChAMCkpOworCisgICAgICBlbnVtIHRyZWVfY29kZSBjMgorCT0gKFRSRUVfQ09E RSAoQDEpID09IFNTQV9OQU1FCisJICAgPyBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChTU0FfTkFN RV9ERUZfU1RNVCAoQDEpKSA6IFRSRUVfQ09ERSAoQDEpKTsKKyAgICAgfQorICAgICAoaWYgKGMx ID09IGNtcCAmJiBjMiA9PSBpY21wKQorICAgICAgKHZlY19jb25kIEAwIEAyIEAzKSkpKSkKKwog LyogVHJhbnNmb3JtIFggJiAtWSBpbnRvIFggKiBZIHdoZW4gWSBpcyB7IDAgb3IgMSB9LiAgKi8K IChzaW1wbGlmeQogIChiaXRfYW5kOmMgKGNvbnZlcnQ/IChuZWdhdGUgemVyb19vbmVfdmFsdWVk X3BAMCkpIEAxKQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQv aWYtY29tcGFyZV8xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9pZi1jb21w YXJlXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwLi41M2JiZDc3OWEzMGUxYTMwZTBjZTBlNGU1ZWFmNTg5YmZhZjU3 MGZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQv aWYtY29tcGFyZV8xLmMKQEAgLTAsMCArMSw0NyBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyog eyBkZy1hZGRpdGlvbmFsLW9wdGlvbnMgIi1PIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWZp bmFsIHsgY2hlY2stZnVuY3Rpb24tYm9kaWVzICIqKiIgIiIgIiIgeyB0YXJnZXQgeyBsZSB9IH0g fSB9ICovCisKK2V4dGVybiB2b2lkIGFib3J0ICgpOworCisvKgorKip6b28xOgorKioJY21wCXcw LCB3MQorKioJY3NlbAl3MCwgdzIsIHczLCBsdAorKioJYW5kCXcwLCB3MCwgMQorKioJcmV0Cisq LworX19hdHRyaWJ1dGUoKG5vaXBhLCBub2lubGluZSkpCitpbnQgem9vMSAoaW50IGEsIGludCBi LCBpbnQgYywgaW50IGQpCit7CisgICByZXR1cm4gKChhIDwgYikgJiBjKSB8ICgoYSA+PSBiKSAm IGQpOworfQorCisvKgorKip6b28yOgorKioJY21wCXcwLCB3MQorKioJY3NlbAl3MCwgdzIsIHcz LCBsdAorKioJcmV0CisqLworX19hdHRyaWJ1dGUoKG5vaXBhLCBub2lubGluZSkpCitpbnQgem9v MiAoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpCit7CisgICByZXR1cm4gKC0oYSA8IGIpICYg YykgfCAoLShhID49IGIpICYgZCk7Cit9CisKK2ludCBtYWluICgpCit7CisgIGlmICh6b28xICgt MywgMywgNSwgOCkgIT0gMSkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoem9vMSAoMywgLTMsIDUs IDgpICE9IDApCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKHpvbzIgKC0zLCAzLCA1LCA4KSAhPSA1 KQorICAgIGFib3J0ICgpOworCisgIGlmICh6b28yICgzLCAtMywgNSwgOCkgIT0gOCkKKyAgICBh Ym9ydCAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hYXJjaDY0L2lmLWNvbXBhcmVfMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FhcmNoNjQvaWYtY29tcGFyZV8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTQ5ODhhYmFjNDU5ODk1NzhiMTk4 ZjI4YzdjMGVhMjAzOTU5YzA4YgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hYXJjaDY0L2lmLWNvbXBhcmVfMi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIHsgZGct ZG8gcnVuIH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItTzMgLXN0ZD1jOTkgLXNh dmUtdGVtcHMiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBjaGVjay1mdW5jdGlvbi1ib2RpZXMgIioq IiAiIiAiIiB7IHRhcmdldCB7IGxlIH0gfSB9IH0gKi8KKworI3ByYWdtYSBHQ0MgdGFyZ2V0ICIr bm9zdmUiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBpbnQgdjRzaSBfX2F0dHJp YnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOworCisvKgorKipmb28xOgorKioJY21ndAl2MC40 cywgdjEuNHMsIHYwLjRzCisqKglic2wJdjAuMTZiLCB2Mi4xNmIsIHYzLjE2YgorKioJcmV0Cisq LwordjRzaSBmb28xICh2NHNpIGEsIHY0c2kgYiwgdjRzaSBjLCB2NHNpIGQpIHsKKyAgICByZXR1 cm4gKChhIDwgYikgJiBjKSB8ICgoYSA+PSBiKSAmIGQpOworfQorCisvKgorKipmb28yOgorKioJ Y21ndAl2MC40cywgdjEuNHMsIHYwLjRzCisqKglic2wJdjAuMTZiLCB2My4xNmIsIHYyLjE2Ygor KioJcmV0CisqLwordjRzaSBmb28yICh2NHNpIGEsIHY0c2kgYiwgdjRzaSBjLCB2NHNpIGQpIHsK KyAgICByZXR1cm4gKH4oYSA8IGIpICYgYykgfCAofihhID49IGIpICYgZCk7Cit9CisKKworLyoq CisqKmJhcjE6CisqKi4uLgorKioJY21nZQl2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0r LjRzCisqKglic2wJdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YgorKioJYW5k CXZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIKKyoqLi4uCisqLwordm9pZCBi YXIxIChpbnQgKiByZXN0cmljdCBhLCBpbnQgKiByZXN0cmljdCBiLCBpbnQgKiByZXN0cmljdCBj LAorCSAgaW50ICogcmVzdHJpY3QgZCwgaW50ICogcmVzdHJpY3QgcmVzLCBpbnQgbikKK3sKKyAg Zm9yIChpbnQgaSA9IDA7IGkgPCAobiAmIC00KTsgaSsrKQorICAgIHJlc1tpXSA9ICgoYVtpXSA8 IGJbaV0pICYgY1tpXSkgfCAoKGFbaV0gPj0gYltpXSkgJiBkW2ldKTsKK30KKworLyoqCisqKmJh cjI6CisqKi4uLgorKioJY21nZQl2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzCisq Kglic2wJdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YgorKiouLi4KKyovCit2 b2lkIGJhcjIgKGludCAqIHJlc3RyaWN0IGEsIGludCAqIHJlc3RyaWN0IGIsIGludCAqIHJlc3Ry aWN0IGMsCisJICBpbnQgKiByZXN0cmljdCBkLCBpbnQgKiByZXN0cmljdCByZXMsIGludCBuKQor eworICBmb3IgKGludCBpID0gMDsgaSA8IChuICYgLTQpOyBpKyspCisgICAgcmVzW2ldID0gKC0o YVtpXSA8IGJbaV0pICYgY1tpXSkgfCAoLShhW2ldID49IGJbaV0pICYgZFtpXSk7Cit9CisKK2V4 dGVybiB2b2lkIGFib3J0ICgpOworCitpbnQgbWFpbiAoKQoreworCisgIHY0c2kgYSA9IHsgLTMs IC0zLCAtMywgLTMgfTsKKyAgdjRzaSBiID0geyAzLCAzLCAzLCAzIH07CisgIHY0c2kgYyA9IHsg NSwgNSwgNSwgNSB9OworICB2NHNpIGQgPSB7IDgsIDgsIDgsIDggfTsKKworICB2NHNpIHJlczEg PSBmb28xIChhLCBiLCBjLCBkKTsKKyAgaWYgKG1lbWNtcCAoJnJlczEsICZjLCAxNlVMKSAhPSAw KQorICAgIGFib3J0ICgpOworCisgIHY0c2kgcmVzMiA9IGZvbzIgKGEsIGIsIGMsIGQpOworICBp ZiAobWVtY21wICgmcmVzMiwgJmQsIDE2VUwpICE9IDApCisgICBhYm9ydCAoKTsKKworICBpbnQg YXJbNF0gPSB7IC0zLCAtMywgLTMsIC0zIH07CisgIGludCBicls0XSA9IHsgMywgMywgMywgMyB9 OworICBpbnQgY3JbNF0gPSB7IDUsIDUsIDUsIDUgfTsKKyAgaW50IGRyWzRdID0geyA4LCA4LCA4 LCA4IH07CisKKyAgaW50IGV4cDFbNF0gPSB7IDEsIDEsIDEsIDEgfTsKKyAgaW50IHJlczNbNF07 CisgIGJhcjEgKChpbnQqKSZhciwgKGludCopJmJyLCAoaW50KikmY3IsIChpbnQqKSZkciwgKGlu dCopJnJlczMsIDQpOworICBpZiAobWVtY21wICgmcmVzMywgJmV4cDEsIDE2VUwpICE9IDApCisg ICAgYWJvcnQgKCk7CisKKyAgaW50IHJlczRbNF07CisgIGJhcjIgKChpbnQqKSZhciwgKGludCop JmJyLCAoaW50KikmY3IsIChpbnQqKSZkciwgKGludCopJnJlczQsIDQpOworICBpZiAobWVtY21w ICgmcmVzNCwgJmNyLCAxNlVMKSAhPSAwKQorICAgIGFib3J0ICgpOworCisgIHJldHVybiAwOwor fQo= --_002_VI1PR08MB53250B2BCAC9D321B88DB088FF519VI1PR08MB5325eurp_--