From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from na01-obe.outbound.protection.outlook.com (mail-cusazon11020015.outbound.protection.outlook.com [52.101.61.15]) by sourceware.org (Postfix) with ESMTPS id D3EAA3858404 for ; Tue, 9 Nov 2021 16:25:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D3EAA3858404 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HAJ7g5lYffw2GOtTzJ0ojjCqC8nk/2issAcfJFTWSgfQBsYL2loDhwXMTr1O/avlab4pIUgFL4qepm50wvCT0aS/F9cuM6jOMxOHLNnLqCCFyYQcUoCfvaA/g4OrnFKP2ncJP20/3sdZkiwuxok7FsJ6vD3FwU/yb4Hovlww8o8lURXz/oNG8XjPOSs6GkxqwNbe5c2uL9jdqnM+4MSm9d4DxozjOerwxpt4YDpml3OB3wSIuwnHpCPB3d0rjgnSmt8DOHxNPfkQyvY4RUh+zQU8FtQEefqTYSSjU/5jAOHTGbyCF78PcqrrEcj6AbVexVgqlYvU/fNDOWMKyfPUzg== 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=mLnFFlGJykGvHMdoVhYq20Ot6W9YdgNXp2nwZWQMcYs=; b=mpCzefP2ElI8rXkT4j5xAVDObWIUe+qi4oa7auhAovgbux1P4n8oa7EJCuX2v1kAVy7hjXXijWgwRMUqBWV0CQW6mdCc/vZZAMnP77lzH/4AJzaTWrGE6NXw2JmFlo5NmPdRtCKzABBNJljLttRCKs2BdC6C4r7RbBpbkVZWXarsn8orPCcgC4rQAz8lTceZny8ondR/u0xBnE6YfXsW+e/kaoURvqImRF/K/5qxSwL6jSa7U87q2jzU7gkWL81GMEMPsWS9E4Fsa1gsYx6Kd8c5WwTb9Md5+mKhAEd9i1CGjTnsa5BoYeYvTE/cAVo8X5tYhpL7Ub0tvhf5byZ8Uw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none Received: from BN6PR21MB0162.namprd21.prod.outlook.com (2603:10b6:404:94::8) by BN8PR21MB1299.namprd21.prod.outlook.com (2603:10b6:408:a3::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4713.1; Tue, 9 Nov 2021 16:25:10 +0000 Received: from BN6PR21MB0162.namprd21.prod.outlook.com ([fe80::1198:6681:a1ca:85b9]) by BN6PR21MB0162.namprd21.prod.outlook.com ([fe80::1198:6681:a1ca:85b9%4]) with mapi id 15.20.4713.004; Tue, 9 Nov 2021 16:25:09 +0000 From: Navid Rahimi To: Richard Biener CC: "gcc-patches@gcc.gnu.org" Subject: Re: [EXTERNAL] Re: [PATCH] PR tree-optimization/102232 Adding a missing pattern to match.pd Thread-Topic: [EXTERNAL] Re: [PATCH] PR tree-optimization/102232 Adding a missing pattern to match.pd Thread-Index: AQHX1NSYUqHeu1GsQEaW+y6J8F2KnKv7AcgAgABZ6Mo= Date: Tue, 9 Nov 2021 16:25: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: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2021-11-09T16:25:09.103Z; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=General; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ContentBits=0; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Method=Standard; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d7831d75-abc9-4897-3a76-08d9a39d7fd3 x-ms-traffictypediagnostic: BN8PR21MB1299: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:6790; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: rmzbAwslEAd7JKq45wUNKfDs5KXTv9ibQEXOsvLy9zeHQhwMeutFJNBGIynenrBQhUV4G6vrlThY30rMn49yDdxPgDIQZziXI0Pn+9KOH3EiyDn6PAo1ppoRZu2xtBVjSGgcsGHVUOpfk7/6g+0CaonxAsTIi3MycRTa5FHYc8fZ21P0X/iMfXC3Tm7Y8FYLwPdVl2orry5w/01bU8w8g5LzVyL7PVOCVU6S+pLSS7dhPdb5c0jgm0PwDDorr84rblm7iZWFusyJdV8sxORpO9gSpOFMha2yrCS68ExKWoPflR0qHFajO1aSEb6K6956TN3H7Wk501WGxm5EV/ENV8QXelECVi7TbwJkQaZh3jUBEZfEE/9pmwNXsSi0d9HsiO/1SqRKSf69AFPJ35/HfXI/etCFEiDbc2KNrbP41TvA0YaIZZHTi0Ff8+dzVK3/ectInPtB0VQO5+GY4UueVo94vwetO2o22l416yeVuVv2xbzuyya4QOou5xI7VsE8xUD+bJ8Y0HUSU0GJxCAvVvgN01b6UCezQ6ZEfUUs637Lu/SqVQJ7YCRhv9EY7wp6lPCBeUcuKsrMkw4mOkH5IuiWyqdpBztdX6nHiYq4YH1VTsxwjH2DDR+ifjv/Ujabf4SVEHVKiIKlfd95xMAoTo8u1b+btP5PpsrK3J7qxz/1Dybr4NR45RpyhK4d1AM3ZJdXsnQ8uVpQ2umXT8cQQ8gifySWxOzZQtl1CTJkDWm2dig5k7NWuApC+ept3QoJ41qPy+hIYiEyp3E/WLdUkd+o3JpKi7pa97QT1J89El8= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BN6PR21MB0162.namprd21.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(86362001)(66556008)(66476007)(508600001)(966005)(9686003)(64756008)(66446008)(99936003)(38070700005)(38100700002)(71200400001)(82960400001)(122000001)(82950400001)(66946007)(6916009)(53546011)(2906002)(186003)(76116006)(91956017)(5660300002)(83380400001)(7696005)(8990500004)(6506007)(8676002)(52536014)(8936002)(33656002)(10290500003)(316002)(4326008); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?y6W9UXmr2pG9ZGFW+4JfHg+ri2gMZfugYcEZgcHEwSEH/YUzSyeV5IbTsq9B?= =?us-ascii?Q?c9uJxl724/RYY+qrHeNxpS8Rg0hDJNBP8PEIOkkeb9w+iryczqpbyQATxJI7?= =?us-ascii?Q?+PXrxXfo3+0Lhd1hMS/4kR1nyb+9b5yMhaTgYIAwPH7blDPXyznZWDlJBoaQ?= =?us-ascii?Q?YayqAkWE0q1pZau9L08jxIBt0ci8vsU3y7GYrgj42/yYv+nROF/GNE2RUpFo?= =?us-ascii?Q?32fGW0A1uOwnKzUss3L8Ru40aGDsMtdM091S41kcN1/O1RTHz7NMVBqX5I2R?= =?us-ascii?Q?gLfgAOHWBk4aSlX5DG2WCkrK1crAEWtyoYm1KaLIxjT61YlmASuLxeLBJXVe?= =?us-ascii?Q?8gzc49B5y5+Juqh9mfCpx29RYlqXyaj+hVDvgtXvS7ACnn03lL1MPGT3xjqn?= =?us-ascii?Q?ejTiFbI6dz9sCC/pTncwISOlL/Lgw69wG6g/Q882agLPqvKnvPGOVlKoB/Wa?= =?us-ascii?Q?JpD89H0GIt0McYPEFj/BmIgWyl5QtGD5U6CtjpEVYQXNIW+BQnPLNEMBIFYr?= =?us-ascii?Q?+Dfzu2Y6wBnXho2Fnpb3EetniMAw1LFg6HqtYJcn/iAUJ8QUvayvYVgJRsVa?= =?us-ascii?Q?0s+e4Pi93/sDg+4Lf48Le//rxpSYwFZgPMzuhpbkFOcP+bSRkAr50YvSDLQS?= =?us-ascii?Q?Q4tpLhR/hrb3HdSucurwVDvDXeC8efbpLwyAX9R1+cHmjc+BFq3Kas0r4HcA?= =?us-ascii?Q?m3wmkT/VYuCr72FzsJHqkHmspx4VLK2RS4qt+/MFNge9ePxkna8RYTJ+nwO6?= =?us-ascii?Q?knTHss0XBs4h9ovy8lhyxgcco0akUL+JpipLZ3n0p8r664rHzo+cEkBhOnPJ?= =?us-ascii?Q?v7JPQ/YS/0na1BnGn+4V9/dS5EvhGYhx3p+Jof7S8AURhGhAfIRVOE1pjB2e?= =?us-ascii?Q?P6peUqvbZnqDjNgL/WWNoDe9KBPDVUWCzcWADV6ObX8nyGeuw1AZf/7e4ffU?= =?us-ascii?Q?VnYw8bti9XoEyZd2/Kb/j/x9VNAM/86hSU9fP60USg1kss/3zoVb1bY7iXME?= =?us-ascii?Q?uGuQsS79DiXJzR219BfqxRsvu/5GOnpbqrt99M9PzoT5VHLoyAIzDotw1FIU?= =?us-ascii?Q?EEs5XxUCW6x82P5sva3CKTJVmPzaHpt7QlPESuPvQFlixwNx9MkSDaECLv4j?= =?us-ascii?Q?wFAxQE//Bqzzi41oC6SI2IdEvDOyuWYBjC3CQI7IfWJA9IoBogPS0ij2Kh2E?= =?us-ascii?Q?xDioB/L2Uah0RjMHRM/aBV7xOmYEiKkTAIwwIrynQBsFhZeBvxYy12ycBJ5F?= =?us-ascii?Q?Mys1GpLA08076QnLIwW0f5iF+CCuObp/inpUUz/6IZ5obB3C6LXm6upHxohP?= =?us-ascii?Q?f/8aJ5NHO1dNOOYNCIgwEYelu+tgqQF324I7VOeFY6VxuH5Y6/7eEtbY5Als?= =?us-ascii?Q?J6PWDJZeRSzJtrW6x4kYBPJMiVZx557vjFlxkngohRGpneU6SiRD3RPvF6dQ?= =?us-ascii?Q?+yKmvJFXUBLYj3I9U+zwhE6z0NedmIRxC3P6YjjsBs8SduQ7G5FI61mNAkRX?= =?us-ascii?Q?qUxI65fKDfLOvsRk+cfk/7T7evYDV65ivIkhhHzdj5st7D7+cwMRk83oV/zR?= =?us-ascii?Q?1VJfi3WofdE9K39ChFRM5YyjRVPoZvNo98XvAq4CIGHPZsZFxFsnCTXlaBNC?= =?us-ascii?Q?ywNyrB18R+obrIVQkxR2Ybruq9Pvs0jPCbXO1ZaUu9hm?= Content-Type: multipart/mixed; boundary="_002_BN6PR21MB01623DD0A86A50DDFD615055A3929BN6PR21MB0162namp_" MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN6PR21MB0162.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d7831d75-abc9-4897-3a76-08d9a39d7fd3 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Nov 2021 16:25:09.8528 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: c7zvClVVWb9jTcdrPKz2XJM0csRheRU7zfR7UyAUNkGDnb2oXio+/lxIiWWrGwoZnHoF7ikOxJWj1cGhCHl3pSRFVuAy861QbIaXT6mlvEU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN8PR21MB1299 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP autolearn=no autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Nov 2021 16:25:19 -0000 --_002_BN6PR21MB01623DD0A86A50DDFD615055A3929BN6PR21MB0162namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Richard, Thank you so much for your detailed feedback. I am attaching another versio= n of the patch which does include all the changes you mentioned. Bellow you can see my response to your feedbacks: > the canonical order of the plus is (plus:s (trunc_div ...) integer_onep) = as > constants come last - you can then remove the 'c' Fixed. I was not aware of the canonical order. > you can use INTEGRAL_TYPE_P (type). Fixed. Didn't know about "type" either. > this test is not necessary Fixed. > But should we also optimize x * (2 + y/x) - y -> 2*x - y % x? So > it looks like a conflict with the x * (1 + b) <-> x + x * b transform > (fold_plusminus_mult)? That said, the special case of one > definitely makes the result cheaper (one less operation). For this special case, it does remove operation indeed. But I was not able = to reproduce it for any other constant [1]. If it was possible to do it wit= h other constants I would've changed the pattern to have be more general li= ke "x * (C + y/x) - y -> C*x - y % x". Basically anything other than 1 wasn= 't a win. Regarding the "x * (1 + b) <-> x + x * b" transformation, it appe= ars to me when there is a "- y" at the end "x * (1 + b)", there is opportun= ity to optimize. Without that "- y" I was not able to make any operation mo= re performant. Either direction, looks like same amount of computation. 1) https://compiler-explorer.com/z/dWsq7Tzf4 > Please move the pattern next to the most relatest which I think is Fixed. > the return value of 1 is an unreliable way to fail, please instead call > __builtin_abort (); Fixed. > do we really need -O3 for this? I think that -O should be enough here? We don't specifically need that. But I realized that the optimization can h= appen in two different level at the compiler. It seems if you spread the co= mputation over multiple statement like: int c =3D a/b; int y =3D b * (1 + c); return y - a; instead of : return b * (1 + a / b) - a; Then you have to have at least -O1 to have it optimized. Granted, I am not = doing that in the testcase. In the new patch I am changing it to -O. Let me= know if you have any suggestions. Best wishes, Navid. ________________________________________ From: Richard Biener Sent: Tuesday, November 9, 2021 02:36 To: Navid Rahimi Cc: gcc-patches@gcc.gnu.org Subject: [EXTERNAL] Re: [PATCH] PR tree-optimization/102232 Adding a missin= g pattern to match.pd On Tue, Nov 9, 2021 at 5:12 AM Navid Rahimi via Gcc-patches wrote: > > Hi GCC community, > > This patch will add the missed pattern described in bug 102232 [1] to the= match.pd. The testcase will test whether the multiplication and division h= as been removed from the code or not. The correctness proof for this patter= n is here [2] in case anyone is curious. > > PR tree-optimization/102232 > * match.pd (x * (1 + y / x) - y) -> (x - y % x): New optimization. +/* x * (1 + y / x) - y -> x - y % x */ +(simplify + (minus (mult:cs @0 (plus:cs integer_onep (trunc_div:s @1 @0))) @1) the canonical order of the plus is (plus:s (trunc_div ...) integer_onep) as constants come last - you can then remove the 'c' + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) you can use INTEGRAL_TYPE_P (type). + && types_match (@0, @1)) this test is not necessary + (minus @0 (trunc_mod @1 @0)))) But should we also optimize x * (2 + y/x) - y -> 2*x - y % x? So it looks like a conflict with the x * (1 + b) <-> x + x * b transform (fold_plusminus_mult)? That said, the special case of one definitely makes the result cheaper (one less operation). Please move the pattern next to the most relatest which I think is /* X - (X / Y) * Y is the same as X % Y. */ (simplify (minus (convert1? @0) (convert2? (mult:c (trunc_div @@0 @@1) @1))) (if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type)) (convert (trunc_mod @0 @1)))) +int +main (void) +{ + // few randomly generated test cases + if (foo (71856034, 238) !=3D 212) + { + return 1; the return value of 1 is an unreliable way to fail, please instead call __builtin_abort (); +/* { dg-options "-O3 -fdump-tree-optimized" } */ do we really need -O3 for this? I think that -O should be enough here? Thanks, Richard. > * gcc.dg/tree-ssa/pr102232.c: testcase for this optimization. > > > 1) https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fgc= c.gnu.org%2Fbugzilla%2Fshow_bug.cgi%3Fid%3D102232&data=3D04%7C01%7Cnavi= drahimi%40microsoft.com%7Cbc89643c6a14411d11ac08d9a36ce282%7C72f988bf86f141= af91ab2d7cd011db47%7C1%7C0%7C637720510334697749%7CUnknown%7CTWFpbGZsb3d8eyJ= WIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&= sdata=3DBr7B1ShCT4ynLwypyM29LqaNF9GBJF3%2BIR6sZrDRTKM%3D&reserved=3D0 > 2) https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fal= ive2.llvm.org%2Fce%2Fz%2F2VScjD&data=3D04%7C01%7Cnavidrahimi%40microsof= t.com%7Cbc89643c6a14411d11ac08d9a36ce282%7C72f988bf86f141af91ab2d7cd011db47= %7C1%7C0%7C637720510334707741%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL= CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=3DFH0%2BwEHm= aGjyclNFD2HrKMXtXDscPAlc9uUs3p6UMkw%3D&reserved=3D0 > > Best wishes, > Navid. --_002_BN6PR21MB01623DD0A86A50DDFD615055A3929BN6PR21MB0162namp_ Content-Type: application/octet-stream; name="0001-PR-tree-optimization-102232.patch" Content-Description: 0001-PR-tree-optimization-102232.patch Content-Disposition: attachment; filename="0001-PR-tree-optimization-102232.patch"; size=2563; creation-date="Tue, 09 Nov 2021 16:18:24 GMT"; modification-date="Tue, 09 Nov 2021 16:18:24 GMT" Content-Transfer-Encoding: base64 RnJvbSAzZDczNTU0NTBmMDE4ODk4ZTUwYzRhNWM5YzE5NTFjOTNiODIyNGFlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXZpZCBSYWhpbWkgPG5hdmlkcmFoaW1pQG1pY3Jvc29mdC5j b20+CkRhdGU6IE1vbiwgOCBOb3YgMjAyMSAxMzo1NzoxOSAtMDgwMApTdWJqZWN0OiBbUEFUQ0hd IFBSIHRyZWUtb3B0aW1pemF0aW9uLzEwMjIzMgoKCSogbWF0Y2gucGQgKHggKiAoMSArIHkgLyB4 KSAtIHkpIC0+ICh4IC0geSAlIHgpOiBOZXcgb3B0aW1pemF0aW9uLgoJKiBnY2MuZGcvdHJlZS1z c2EvcHIxMDIyMzIuYzogdGVzdGNhc2UgZm9yIHRoaXMgb3B0aW1pemF0aW9uLgotLS0KIGdjYy9t YXRjaC5wZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNiArKysKIGdjYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL3ByMTAyMjMyLmMgfCA1MiArKysrKysrKysrKysrKysrKysrKysr KysKIDIgZmlsZXMgY2hhbmdlZCwgNTggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ByMTAyMjMyLmMKCmRpZmYgLS1naXQgYS9n Y2MvbWF0Y2gucGQgYi9nY2MvbWF0Y2gucGQKaW5kZXggNzFjZjZmOWRmMGEuLmM5MWZmZjQ2OTM2 IDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNoLnBkCkBAIC02MDgsNiAr NjA4LDEyIEBAIERFRklORV9JTlRfQU5EX0ZMT0FUX1JPVU5EX0ZOIChSSU5UKQogIChpZiAoSU5U RUdSQUxfVFlQRV9QICh0eXBlKSB8fCBWRUNUT1JfSU5URUdFUl9UWVBFX1AgKHR5cGUpKQogICAo Y29udmVydCAodHJ1bmNfbW9kIEAwIEAxKSkpKQogCisvKiB4ICogKDEgKyB5IC8geCkgLSB5IC0+ IHggLSB5ICUgeCAqLworKHNpbXBsaWZ5CisgKG1pbnVzIChtdWx0OmNzIEAwIChwbHVzOnMgKHRy dW5jX2RpdjpzIEAxIEAwKSBpbnRlZ2VyX29uZXApKSBAMSkKKyAoaWYgKElOVEVHUkFMX1RZUEVf UCAodHlwZSkpCisgIChtaW51cyBAMCAodHJ1bmNfbW9kIEAxIEAwKSkpKQorCiAvKiBPcHRpbWl6 ZSBUUlVOQ19NT0RfRVhQUiBieSBhIHBvd2VyIG9mIHR3byBpbnRvIGEgQklUX0FORF9FWFBSLAog ICAgaS5lLiAiWCAlIEMiIGludG8gIlggJiAoQyAtIDEpIiwgaWYgWCBhbmQgQyBhcmUgcG9zaXRp dmUuCiAgICBBbHNvIG9wdGltaXplIEEgJSAoQyA8PCBOKSAgd2hlcmUgQyBpcyBhIHBvd2VyIG9m IDIsCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjEwMjIzMi5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvcHIxMDIyMzIuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjJiY2E2OTIyYWIKLS0tIC9kZXYvbnVsbAorKysg Yi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9wcjEwMjIzMi5jCkBAIC0wLDAgKzEsNTIg QEAKKy8qIFBSIHRyZWUtb3B0aW1pemF0aW9uLzEwMjIzMiAqLworLyogeyBkZy1kbyBydW4gfSAq LworLyogeyBkZy1vcHRpb25zICItTyAtZmR1bXAtdHJlZS1vcHRpbWl6ZWQiIH0gKi8KKworaW50 IF9fYXR0cmlidXRlX18gKChub2lwYSkpIGZvbyAoaW50IGEsIGludCBiKQoreworICByZXR1cm4g YiAqICgxICsgYSAvIGIpIC0gYTsKK30KKworaW50CittYWluICh2b2lkKQoreworICAvLyBmZXcg cmFuZG9tbHkgZ2VuZXJhdGVkIHRlc3QgY2FzZXMKKyAgaWYgKGZvbyAoNzE4NTYwMzQsIDIzOCkg IT0gMjEyKQorICAgIHsKKyAgICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgICB9CisgIGlmIChm b28gKDcxODU2MDM0LCAxMDkwOSkgIT0gMTU0OSkKKyAgICB7CisgICAgICBfX2J1aWx0aW5fYWJv cnQgKCk7CisgICAgfQorICBpZiAoZm9vICgyMDM1MCwgMTc0NCkgIT0gNTc4KQorICAgIHsKKyAg ICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgICB9CisgIGlmIChmb28gKDQ0NDgxMywgODg1NjMp ICE9IDg2NTY1KQorICAgIHsKKyAgICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgICB9CisgIGlm IChmb28gKDExMjIzNywgNjMwMDQpICE9IDEzNzcxKQorICAgIHsKKyAgICAgIF9fYnVpbHRpbl9h Ym9ydCAoKTsKKyAgICB9CisgIGlmIChmb28gKDY4MjY4Mzg2LCA3ODcxMTYpICE9IDIxMDcwNikK KyAgICB7CisgICAgICBfX2J1aWx0aW5fYWJvcnQgKCk7CisgICAgfQorICBpZiAoZm9vICgtNDQ0 ODEzLCA4ODU2MykgIT0gOTA1NjEpCisgICAgeworICAgICAgX19idWlsdGluX2Fib3J0ICgpOwor ICAgIH0KKyAgaWYgKGZvbyAoLTY4MjY4Mzg2LCA3ODcxMTYpICE9IDEzNjM1MjYpCisgICAgewor ICAgICAgX19idWlsdGluX2Fib3J0ICgpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyog VmVyaWZ5IHRoYXQgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGhhcyBiZWVuIHJlbW92ZWQu ICAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiIFxcKiAiICJvcHRpbWl6 ZWQiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiIC8gIiAib3B0 aW1pemVkIiB9IH0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCi0tIAoyLjI1LjEKCg== --_002_BN6PR21MB01623DD0A86A50DDFD615055A3929BN6PR21MB0162namp_--