From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2071.outbound.protection.outlook.com [40.107.7.71]) by sourceware.org (Postfix) with ESMTPS id D8111385841B for ; Fri, 24 Nov 2023 10:18:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D8111385841B 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-Filter: OpenARC Filter v1.0.0 sourceware.org D8111385841B Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.7.71 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700821131; cv=pass; b=F8y5fkEko/az2+CSOM++7T9r8TCWxYqyXAEdDVTXQeKm29l6dFUMot4msKRuWIKqam0GRQU1Usxu1guDePtvwsdUSAycng1+jSo+tNoLz72jRZABY0YeXQkcumh8HlGnSrXVZ8HlMukZ3Kgt/JhoFzF5JKS3ymXeGhvptJsK+uo= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700821131; c=relaxed/simple; bh=dV+rWohqwyyG+HfIFqEc4v0z77EItomXWg0WZhdQLHM=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=T7dIfUQhhgadyMeNfn75RwADLDowOulfQfg2QGocZo2+uIpcK2flTKcXnqensQvG7D3xYrJMGnHRvMtr7qOCcT8shxS7Xl8Z9EDCtamRSLkj0h6ykol8k+pP5UhMqIE0oZ/XQuZByRCO9ylnUeGUQRBVd5ybpJ/wiDZmedDz46Q= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=K/xOPRpeC0FSz0J42POvLGoY2/BLnKB3WyvLsFlWqtUvoACil6cYZFSoNOmO8s1yxqSuJuRkv9Tb5RFBCr9zS7j8zIMs8zlbdOEsN9gXYnxb/Rx9BRi+OMKWwhvUMzSFDVn4EEu+Sw5N0htIG+4EyIoYCbXA0BllEg28yyaH5HknczHp4Z8pxXJf9VlcAvRp4JM49JMtSBoESJSPx7cIM0fZRyAdvQnyYQntqIV5rExFpFena7PmeGIWS/gAAGmO4Xo9yKz3gwZO7ts2GeqIJDwFwRM3r+5L113Dghod/zjzJuwIU2JzsNjcQ1rjENlDw88hgRcvFJyVNHsX+AYc4g== 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=Ockp8ub84Yy0J+dVH7G2vVCFggHtjHol8lo6ujLvKaA=; b=XJxoXuXn+/la7mQVZUx3yHXnSKarCjmP8a0qH3dzxz7/s34LFgG8/Exz4dWES8EJKooPcg6JSBuqU8xRc0eAucXcHDWiws3YEWBeTcZ8A8EiLyPLW0hvly94u9sE7jxngx1wzMrahQmPHX9B7XexbCoV+ME1p59Stj9opCOz96AAsObd+qrj2SPbLmBW1NoOAXfV0Mzn510k0kZcg2X/NT3jXGUbA6hlECQgd5X1v8iA2EDzfKDDCZR0iOHbDLgbAtg++wR5N59DOi/14fYb8HbTirmqtqgKzgDyk3h8uQVL19XC6GrUQBUQE0IDRCl+a4GkARl1knnQMOMJjbTvmQ== 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=Ockp8ub84Yy0J+dVH7G2vVCFggHtjHol8lo6ujLvKaA=; b=ki3nyLJgZ07NGyVcEUVpQyRaqhK0UWm4aY86Mzw3pWcHDRP58TU7YnfdvBdvpd/4rBk3u5s2Td2hL6YQvVN8+tcynS4Rpk2mzkgCUlQbdA6ktU3XRPbaYFCJllnBpi2lbvLJ4Qvmb1S2H3rb/FBoxh4iAytvnGKYFG1OxfSQv20= Received: from DUZPR01CA0348.eurprd01.prod.exchangelabs.com (2603:10a6:10:4b8::7) by PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.20; Fri, 24 Nov 2023 10:18:44 +0000 Received: from DB5PEPF00014B96.eurprd02.prod.outlook.com (2603:10a6:10:4b8:cafe::ae) by DUZPR01CA0348.outlook.office365.com (2603:10a6:10:4b8::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.21 via Frontend Transport; Fri, 24 Nov 2023 10:18:44 +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 DB5PEPF00014B96.mail.protection.outlook.com (10.167.8.234) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.12 via Frontend Transport; Fri, 24 Nov 2023 10:18:44 +0000 Received: ("Tessian outbound 26ee1d40577c:v228"); Fri, 24 Nov 2023 10:18:44 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: bbbf71f797b9517a X-CR-MTA-TID: 64aa7808 Received: from bda254ba0d50.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 4D1602D5-F288-48C6-BD95-6194C8197106.1; Fri, 24 Nov 2023 10:18:37 +0000 Received: from EUR03-AM7-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id bda254ba0d50.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 24 Nov 2023 10:18:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h9klipPTqgrt8MYldF6vYCpmmOzD69udzw4G7SLcilPBWe49J6JFyJ7UZMestYAh+Hezvs2mLZv5R9g6VEyar9G9hMgqewesJKNlNl04QOxP9HCX7I/sajl6tak3kZRSPSgSXZE/rYX6fNBYZxIYiNURABqMcSyE91KmrrkfrYrkRdfWAgXq248q+r/ZqTD22XX1W/n53zhZVp11AahazjxrLmuAG+ctFatpJmru/hGXcE8F+G2q7W7wmhX6Dza4pyD1hp3hq8Z2ddE4N5+gEhSAgJQBKyWMPPfX/hZYVU6+QeiLpTWA34zxk+0lYeyG9sCIkpbenJ+PqF5gakdAog== 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=Ockp8ub84Yy0J+dVH7G2vVCFggHtjHol8lo6ujLvKaA=; b=k+Iud1ElsC3gcbrycNai1j7FKraH3XiwfYEgVke7EXfMnczd+wqekbv738+sB94C7Bdyp3cHBLFj82Ksd+Otch2npbeP5BfUmk47fJDRhK1xxOthIjytycVEwpoGQpGBMxFVVwpgkvopeusWc9qeNMUkVK7rjscpxklyMpQMjeKy9VZAV8UFVBVdmrN9oPQC3x+wItTvWZ5pE4eaWUuUSzlLos6QSxf3ZzHj3Ex3YX8lAJkdYTq3xtOpdaHdjYH/LS+3l+tjCz2qu8oC9HIMkSn/h51JP2Vgq4DY+Vgi5F35tlqz+9tpmSujwE++6bH6YAb1KLAP0Ro7nunEG4j2EQ== 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=Ockp8ub84Yy0J+dVH7G2vVCFggHtjHol8lo6ujLvKaA=; b=ki3nyLJgZ07NGyVcEUVpQyRaqhK0UWm4aY86Mzw3pWcHDRP58TU7YnfdvBdvpd/4rBk3u5s2Td2hL6YQvVN8+tcynS4Rpk2mzkgCUlQbdA6ktU3XRPbaYFCJllnBpi2lbvLJ4Qvmb1S2H3rb/FBoxh4iAytvnGKYFG1OxfSQv20= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by AS8PR08MB8371.eurprd08.prod.outlook.com (2603:10a6:20b:56a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.21; Fri, 24 Nov 2023 10:18:35 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::9679:2ab0:99c6:54a3]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::9679:2ab0:99c6:54a3%6]) with mapi id 15.20.7025.021; Fri, 24 Nov 2023 10:18:35 +0000 From: Tamar Christina To: Tamar Christina , Richard Biener CC: "gcc-patches@gcc.gnu.org" , nd , "jlaw@ventanamicro.com" Subject: RE: [PATCH 7/21]middle-end: update IV update code to support early breaks and arbitrary exits Thread-Topic: [PATCH 7/21]middle-end: update IV update code to support early breaks and arbitrary exits Thread-Index: AQHaEIRUWLSyh++pSEG+iB4lA+c+BLB6jLQwgADZ7QCAAAD4UIAABQiAgAALGkCAAVnUgIAAAkUAgAAK9ACAAAX/4IAAC6cAgAACTBCAAA/GgIAACPOwgAAC2ICAAA3PkIAAN+aQgAENK8CAAByrgIAFWK8AgAWHHJA= Date: Fri, 24 Nov 2023 10:18:35 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|AS8PR08MB8371:EE_|DB5PEPF00014B96:EE_|PAWPR08MB8958:EE_ X-MS-Office365-Filtering-Correlation-Id: f5daca86-2988-4882-0cac-08dbecd6bd32 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: 4j3lOVKEVOLciURi95BrrOlV0PnyIyinKejWRwOkCwi2rc+eiRvT5Cwiln4k9vYqvEOam72LvvS0jMYbXpoEFelifjEDtG9D4sdUMfUQDVwXQHZKh4h7J9Kiy76YqWuaRoEPYqz26jrfi2q5nRK86Jofx+9VGbMaCcbggerOmYx8bvKxH1r+m6CX4MEiQfl82zjb8osRX5TYuFIt4pXSsDKU/CCPHmZZXqBYiaMiekUuFNIBxhGF+WJYsoIPfiySsNfLRb/xKE0FfXUZjArlYPXwBvdVJy4ITwNAu1VlKEkwlcFHYi/kJZ2YO4hBuPmSuINVQ+9V3U9JmbX6OU7nnDsKbItKwG5j+gh9oPIbux6ktwqtLRnXTaUHYYFw+9zYf1evZdBTMjJp5yV+jrA+TRfjxk6QZvYs+1kF/aEDYaHTcOXZgFnWMb4thyNJ5blzq+o0fE+AMOc2VmmbqCe6HRMxp2yxHnUGB1t+sottTQrQ+0+bdyc3SgqDtaIQtLNjzNrC7HSk0e77hxBZygF0GPdf+BcklDv6+ZGMKvH8TGM4/4Br7X9QyiRwpNUdI1CweNNZStzAO0a7oxOv5eXKWVMbDsXT3+PctjL7L140lU9f2CEIJFkaLPJRhQPSf4Sg 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:(13230031)(396003)(39860400002)(366004)(136003)(346002)(376002)(230922051799003)(451199024)(1800799012)(186009)(64100799003)(41300700001)(2906002)(15650500001)(52536014)(86362001)(33656002)(5660300002)(38070700009)(99936003)(122000001)(9686003)(71200400001)(6506007)(7696005)(26005)(55016003)(83380400001)(478600001)(38100700002)(8936002)(54906003)(110136005)(76116006)(64756008)(316002)(66946007)(66556008)(66476007)(66446008)(4326008)(8676002);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB53259B1F5A3E8BA07574BB16FFB8AVI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8371 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: DB5PEPF00014B96.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 96f6457d-b081-4f8c-40ec-08dbecd6b7af X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CImwuECDWyUm26/L1+toGGiVA4GlKVM2qWeSATwuitic7FOXFx00JqHAbi2AkgJhSXm9CuPAWjH6zxzD63OgoVQHYd/2c89brTruNBmrd3Hr86olrzQ9ZTUrgV/bggdiojMBG89hc/GMHTm9oll51qL/iDf085XeJJs4cCYwPKbaWd00eQojJ0+Xn4xS5lWSUEIGNLFqb8bURFdCGEimt0f7fcOS0dD+rpkfQoH2utBOppPxiikfagfV4uj+Se/CAyNJR7iADUHfy/HLOuUm8vrY+MrwjSHLxMnNeAKWLMDlygeZLoWyDepRkUxkvSFwlNaRCJYzBTn5uLCjzCUGpMbtBYzTHBNRXnjJpET9egDtzjDMKmywwaSU0/siKZ82YcRJJc53xSOWZ669mWCHPt49dEbo/5x/1r2Dz9EUiUwC57CLQ/ggwUoQq3QpLhFLTQJ4rhotnsEYgc34GVbWrJ2Zc3dOqSQrXRJd4rx0BHyOwPZdGuU/kciucD9IcGIARYHINiqB4dl5OBkccU+eAPLunLDvVeEEbrs9fVPmgKf6kJp9ppQ3ssfqJRRTj42Uz0M8qhi27vhO9tyEX8E3sSz3c7d1vCjOm2Mqs539jK26BjEFPgMU/+AF5qKrAuArHFS+JtKjGrv3zBEtAxbfdhK7xc8jj+0Xn/xuChuNSC1qAX4keraU7yyzdsrQfq9nRxrXy2clQL5dCJ/4AQ5G1tpbkAxEEUMJZesDOYNBMeq77DApa+mbydptOYzRR0zz 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:(13230031)(4636009)(39860400002)(396003)(376002)(346002)(136003)(230922051799003)(451199024)(82310400011)(186009)(1800799012)(64100799003)(36840700001)(46966006)(40470700004)(9686003)(107886003)(26005)(336012)(316002)(7696005)(8936002)(36860700001)(47076005)(54906003)(6506007)(2906002)(5660300002)(15650500001)(235185007)(41300700001)(52536014)(70586007)(110136005)(478600001)(4326008)(70206006)(8676002)(40460700003)(86362001)(82740400003)(99936003)(356005)(81166007)(33656002)(55016003)(40480700001)(83380400001);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Nov 2023 10:18:44.4231 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f5daca86-2988-4882-0cac-08dbecd6bd32 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: DB5PEPF00014B96.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR08MB8958 X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,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_VI1PR08MB53259B1F5A3E8BA07574BB16FFB8AVI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, Having simplified peeling this patch becomes smaller as well: This changes the PHI node updates to support early breaks. It has to support both the case where the loop's exit matches the normal lo= op exit and one where the early exit is "inverted", i.e. it's an early exit ed= ge. In the latter case we must always restart the loop for VF iterations. For = an early exit the reason is obvious, but there are cases where the "normal" ex= it is located before the early one. This exit then does a check on ivtmp resu= lting in us leaving the loop since it thinks we're done. In these case we may still have side-effects to perform so we also go to th= e scalar loop. For the "normal" exit niters has already been adjusted for peeling, for the early exits we must find out how many iterations we actually did. So we ha= ve to recalculate the new position for each exit. For the "inverse" case we essentially peel a vector iteration *after* the v= ector loop has finished. i.e. conceptually it's the same as vect epilogue peeling= but without generating code for the peeled iteration. That'll be handled by th= e scalar loop. To do this we just adjust niters_vector_mult_vf and remove one VF and for m= asked cases we do the same with final_iv. The normal IV update code will then generate the correct values for us. Eventually VRP will simplify the constant bounds and we get the proper scal= ar unrolling. This means we don't have to make any changes at all to vect_update_ivs_after_vectorizer but dropping some asserts. Ok for master? Thanks, Tamar gcc/ChangeLog: * tree-vect-loop-manip.cc (vect_set_loop_condition_partial_vectors, vect_set_loop_condition_partial_vectors_avx512, vect_gen_vector_loop_niters_mult_vf): Support peeling a vector iteration. (vect_update_ivs_after_vectorizer): Drop asserts. (vect_do_peeling): Skip forwarder edge. (vect_is_loop_exit_latch_pred): New. * tree-vectorizer.h (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED): New. --- inline copy of patch --- diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index d61d7c3a189b279fc3bcbb58c3c0e32521db3cf8..476be8a0bb6da2d06c4ca7052cb= 07bacecca60b1 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -951,7 +951,18 @@ vect_set_loop_condition_partial_vectors (class loop *l= oop, edge exit_edge, =20 if (final_iv) { - gassign *assign =3D gimple_build_assign (final_iv, orig_niters); + gassign *assign; + /* If vectorizing an inverted early break loop we have to restart th= e + scalar loop at niters - vf. This matches what we do in + vect_gen_vector_loop_niters_mult_vf for non-masked loops. */ + if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) + { + tree ftype =3D TREE_TYPE (orig_niters); + tree vf =3D build_int_cst (ftype, LOOP_VINFO_VECT_FACTOR (loop_vinfo)); + assign =3D gimple_build_assign (final_iv, MINUS_EXPR, orig_niters, vf); + } + else + assign =3D gimple_build_assign (final_iv, orig_niters); gsi_insert_on_edge_immediate (exit_edge, assign); } =20 @@ -1188,8 +1199,19 @@ vect_set_loop_condition_partial_vectors_avx512 (clas= s loop *loop, =20 if (final_iv) { - gassign *assign =3D gimple_build_assign (final_iv, orig_niters); - gsi_insert_on_edge_immediate (single_exit (loop), assign); + gassign *assign; + /* If vectorizing an inverted early break loop we have to restart th= e + scalar loop at niters - vf. This matches what we do in + vect_gen_vector_loop_niters_mult_vf for non-masked loops. */ + if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) + { + tree ftype =3D TREE_TYPE (orig_niters); + tree vf =3D build_int_cst (ftype, LOOP_VINFO_VECT_FACTOR (loop_vinfo)); + assign =3D gimple_build_assign (final_iv, MINUS_EXPR, orig_niters, vf); + } + else + assign =3D gimple_build_assign (final_iv, orig_niters); + gsi_insert_on_edge_immediate (exit_edge, assign); } =20 return cond_stmt; @@ -2157,11 +2179,8 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop= _vinfo, gphi_iterator gsi, gsi1; class loop *loop =3D LOOP_VINFO_LOOP (loop_vinfo); basic_block update_bb =3D update_e->dest; - basic_block exit_bb =3D LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; - - /* Make sure there exists a single-predecessor exit bb: */ - gcc_assert (single_pred_p (exit_bb)); + gimple_stmt_iterator last_gsi =3D gsi_last_bb (exit_bb); =20 for (gsi =3D gsi_start_phis (loop->header), gsi1 =3D gsi_start_phis (upd= ate_bb); !gsi_end_p (gsi) && !gsi_end_p (gsi1); @@ -2171,7 +2190,6 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_= vinfo, tree step_expr, off; tree type; tree var, ni, ni_name; - gimple_stmt_iterator last_gsi; =20 gphi *phi =3D gsi.phi (); gphi *phi1 =3D gsi1.phi (); @@ -2207,7 +2225,8 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_= vinfo, { tree stype =3D TREE_TYPE (step_expr); off =3D fold_build2 (MULT_EXPR, stype, - fold_convert (stype, niters), step_expr); + fold_convert (stype, niters), step_expr); + if (POINTER_TYPE_P (type)) ni =3D fold_build_pointer_plus (init_expr, off); else @@ -2226,9 +2245,9 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_= vinfo, =20 var =3D create_tmp_var (type, "tmp"); =20 - last_gsi =3D gsi_last_bb (exit_bb); gimple_seq new_stmts =3D NULL; ni_name =3D force_gimple_operand (ni, &new_stmts, false, var); + /* Exit_bb shouldn't be empty. */ if (!gsi_end_p (last_gsi)) { @@ -2726,11 +2745,19 @@ vect_gen_vector_loop_niters_mult_vf (loop_vec_info = loop_vinfo, int vf =3D LOOP_VINFO_VECT_FACTOR (loop_vinfo).to_constant (); tree type =3D TREE_TYPE (niters_vector); tree log_vf =3D build_int_cst (type, exact_log2 (vf)); + tree tree_vf =3D build_int_cst (type, vf); basic_block exit_bb =3D LOOP_VINFO_IV_EXIT (loop_vinfo)->dest; =20 gcc_assert (niters_vector_mult_vf_ptr !=3D NULL); tree niters_vector_mult_vf =3D fold_build2 (LSHIFT_EXPR, type, niters_vector, log_vf); + + /* If we've peeled a vector iteration then subtract one full vector + iteration. */ + if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) + niters_vector_mult_vf =3D fold_build2 (MINUS_EXPR, type, + niters_vector_mult_vf, tree_vf); + if (!is_gimple_val (niters_vector_mult_vf)) { tree var =3D create_tmp_var (type, "niters_vector_mult_vf"); @@ -3328,6 +3355,10 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree nite= rs, tree nitersm1, niters_vector_mult_vf steps. */ gcc_checking_assert (vect_can_advance_ivs_p (loop_vinfo)); update_e =3D skip_vector ? e : loop_preheader_edge (epilog); + if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) + update_e =3D single_succ_edge (e->dest); + + /* Update the main exit. */ vect_update_ivs_after_vectorizer (loop_vinfo, niters_vector_mult_vf, update_e); =20 diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 39aa4d1250efe308acccf484d370f8adfd1ba843..de60da31e2a3030a7fbc302d3f6= 76af9683fd019 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1016,6 +1016,8 @@ public: #define LOOP_VINFO_PEELING_FOR_GAPS(L) (L)->peeling_for_gaps #define LOOP_VINFO_PEELING_FOR_NITER(L) (L)->peeling_for_niter #define LOOP_VINFO_EARLY_BREAKS(L) (L)->early_breaks +#define LOOP_VINFO_EARLY_BREAKS_VECT_PEELED(L) \ + (single_pred ((L)->loop->latch) !=3D (L)->vec_loop_iv_exit->src) #define LOOP_VINFO_EARLY_BRK_CONFLICT_STMTS(L) (L)->early_break_conflict #define LOOP_VINFO_EARLY_BRK_DEST_BB(L) (L)->early_break_dest_bb #define LOOP_VINFO_EARLY_BRK_VUSES(L) (L)->early_break_vuses @@ -2224,6 +2226,7 @@ extern dump_user_location_t find_loop_location (class= loop *); extern bool vect_can_advance_ivs_p (loop_vec_info); extern void vect_update_inits_of_drs (loop_vec_info, tree, tree_code); extern edge vec_init_loop_exit_info (class loop *); +extern void vect_iv_increment_position (edge, gimple_stmt_iterator *, bool= *); =20 /* In tree-vect-stmts.cc. */ extern tree get_related_vectype_for_scalar_type (machine_mode, tree, --_002_VI1PR08MB53259B1F5A3E8BA07574BB16FFB8AVI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb17967.patch" Content-Description: rb17967.patch Content-Disposition: attachment; filename="rb17967.patch"; size=6061; creation-date="Fri, 24 Nov 2023 10:18:13 GMT"; modification-date="Fri, 24 Nov 2023 10:18:34 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jYyBiL2djYy90cmVlLXZlY3Qt bG9vcC1tYW5pcC5jYwppbmRleCBkNjFkN2MzYTE4OWIyNzlmYzNiY2JiNThjM2MwZTMyNTIxZGIz Y2Y4Li40NzZiZThhMGJiNmRhMmQwNmM0Y2E3MDUyY2IwN2JhY2VjY2E2MGIxIDEwMDY0NAotLS0g YS9nY2MvdHJlZS12ZWN0LWxvb3AtbWFuaXAuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1sb29wLW1h bmlwLmNjCkBAIC05NTEsNyArOTUxLDE4IEBAIHZlY3Rfc2V0X2xvb3BfY29uZGl0aW9uX3BhcnRp YWxfdmVjdG9ycyAoY2xhc3MgbG9vcCAqbG9vcCwgZWRnZSBleGl0X2VkZ2UsCiAKICAgaWYgKGZp bmFsX2l2KQogICAgIHsKLSAgICAgIGdhc3NpZ24gKmFzc2lnbiA9IGdpbXBsZV9idWlsZF9hc3Np Z24gKGZpbmFsX2l2LCBvcmlnX25pdGVycyk7CisgICAgICBnYXNzaWduICphc3NpZ247CisgICAg ICAvKiBJZiB2ZWN0b3JpemluZyBhbiBpbnZlcnRlZCBlYXJseSBicmVhayBsb29wIHdlIGhhdmUg dG8gcmVzdGFydCB0aGUKKwkgc2NhbGFyIGxvb3AgYXQgbml0ZXJzIC0gdmYuICBUaGlzIG1hdGNo ZXMgd2hhdCB3ZSBkbyBpbgorCSB2ZWN0X2dlbl92ZWN0b3JfbG9vcF9uaXRlcnNfbXVsdF92ZiBm b3Igbm9uLW1hc2tlZCBsb29wcy4gICovCisgICAgICBpZiAoTE9PUF9WSU5GT19FQVJMWV9CUkVB S1NfVkVDVF9QRUVMRUQgKGxvb3BfdmluZm8pKQorCXsKKwkgIHRyZWUgZnR5cGUgPSBUUkVFX1RZ UEUgKG9yaWdfbml0ZXJzKTsKKwkgIHRyZWUgdmYgPSBidWlsZF9pbnRfY3N0IChmdHlwZSwgTE9P UF9WSU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5mbykpOworCSAgYXNzaWduID0gZ2ltcGxlX2J1 aWxkX2Fzc2lnbiAoZmluYWxfaXYsIE1JTlVTX0VYUFIsIG9yaWdfbml0ZXJzLCB2Zik7CisJfQor ICAgICAgIGVsc2UKKwlhc3NpZ24gPSBnaW1wbGVfYnVpbGRfYXNzaWduIChmaW5hbF9pdiwgb3Jp Z19uaXRlcnMpOwogICAgICAgZ3NpX2luc2VydF9vbl9lZGdlX2ltbWVkaWF0ZSAoZXhpdF9lZGdl LCBhc3NpZ24pOwogICAgIH0KIApAQCAtMTE4OCw4ICsxMTk5LDE5IEBAIHZlY3Rfc2V0X2xvb3Bf Y29uZGl0aW9uX3BhcnRpYWxfdmVjdG9yc19hdng1MTIgKGNsYXNzIGxvb3AgKmxvb3AsCiAKICAg aWYgKGZpbmFsX2l2KQogICAgIHsKLSAgICAgIGdhc3NpZ24gKmFzc2lnbiA9IGdpbXBsZV9idWls ZF9hc3NpZ24gKGZpbmFsX2l2LCBvcmlnX25pdGVycyk7Ci0gICAgICBnc2lfaW5zZXJ0X29uX2Vk Z2VfaW1tZWRpYXRlIChzaW5nbGVfZXhpdCAobG9vcCksIGFzc2lnbik7CisgICAgICBnYXNzaWdu ICphc3NpZ247CisgICAgICAvKiBJZiB2ZWN0b3JpemluZyBhbiBpbnZlcnRlZCBlYXJseSBicmVh ayBsb29wIHdlIGhhdmUgdG8gcmVzdGFydCB0aGUKKwkgc2NhbGFyIGxvb3AgYXQgbml0ZXJzIC0g dmYuICBUaGlzIG1hdGNoZXMgd2hhdCB3ZSBkbyBpbgorCSB2ZWN0X2dlbl92ZWN0b3JfbG9vcF9u aXRlcnNfbXVsdF92ZiBmb3Igbm9uLW1hc2tlZCBsb29wcy4gICovCisgICAgICBpZiAoTE9PUF9W SU5GT19FQVJMWV9CUkVBS1NfVkVDVF9QRUVMRUQgKGxvb3BfdmluZm8pKQorCXsKKwkgIHRyZWUg ZnR5cGUgPSBUUkVFX1RZUEUgKG9yaWdfbml0ZXJzKTsKKwkgIHRyZWUgdmYgPSBidWlsZF9pbnRf Y3N0IChmdHlwZSwgTE9PUF9WSU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5mbykpOworCSAgYXNz aWduID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAoZmluYWxfaXYsIE1JTlVTX0VYUFIsIG9yaWdfbml0 ZXJzLCB2Zik7CisJfQorICAgICAgIGVsc2UKKwlhc3NpZ24gPSBnaW1wbGVfYnVpbGRfYXNzaWdu IChmaW5hbF9pdiwgb3JpZ19uaXRlcnMpOworICAgICAgZ3NpX2luc2VydF9vbl9lZGdlX2ltbWVk aWF0ZSAoZXhpdF9lZGdlLCBhc3NpZ24pOwogICAgIH0KIAogICByZXR1cm4gY29uZF9zdG10OwpA QCAtMjE1NywxMSArMjE3OSw4IEBAIHZlY3RfdXBkYXRlX2l2c19hZnRlcl92ZWN0b3JpemVyIChs b29wX3ZlY19pbmZvIGxvb3BfdmluZm8sCiAgIGdwaGlfaXRlcmF0b3IgZ3NpLCBnc2kxOwogICBj bGFzcyBsb29wICpsb29wID0gTE9PUF9WSU5GT19MT09QIChsb29wX3ZpbmZvKTsKICAgYmFzaWNf YmxvY2sgdXBkYXRlX2JiID0gdXBkYXRlX2UtPmRlc3Q7Ci0KICAgYmFzaWNfYmxvY2sgZXhpdF9i YiA9IExPT1BfVklORk9fSVZfRVhJVCAobG9vcF92aW5mbyktPmRlc3Q7Ci0KLSAgLyogTWFrZSBz dXJlIHRoZXJlIGV4aXN0cyBhIHNpbmdsZS1wcmVkZWNlc3NvciBleGl0IGJiOiAgKi8KLSAgZ2Nj X2Fzc2VydCAoc2luZ2xlX3ByZWRfcCAoZXhpdF9iYikpOworICBnaW1wbGVfc3RtdF9pdGVyYXRv ciBsYXN0X2dzaSA9IGdzaV9sYXN0X2JiIChleGl0X2JiKTsKIAogICBmb3IgKGdzaSA9IGdzaV9z dGFydF9waGlzIChsb29wLT5oZWFkZXIpLCBnc2kxID0gZ3NpX3N0YXJ0X3BoaXMgKHVwZGF0ZV9i Yik7CiAgICAgICAgIWdzaV9lbmRfcCAoZ3NpKSAmJiAhZ3NpX2VuZF9wIChnc2kxKTsKQEAgLTIx NzEsNyArMjE5MCw2IEBAIHZlY3RfdXBkYXRlX2l2c19hZnRlcl92ZWN0b3JpemVyIChsb29wX3Zl Y19pbmZvIGxvb3BfdmluZm8sCiAgICAgICB0cmVlIHN0ZXBfZXhwciwgb2ZmOwogICAgICAgdHJl ZSB0eXBlOwogICAgICAgdHJlZSB2YXIsIG5pLCBuaV9uYW1lOwotICAgICAgZ2ltcGxlX3N0bXRf aXRlcmF0b3IgbGFzdF9nc2k7CiAKICAgICAgIGdwaGkgKnBoaSA9IGdzaS5waGkgKCk7CiAgICAg ICBncGhpICpwaGkxID0gZ3NpMS5waGkgKCk7CkBAIC0yMjA3LDcgKzIyMjUsOCBAQCB2ZWN0X3Vw ZGF0ZV9pdnNfYWZ0ZXJfdmVjdG9yaXplciAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLAogCXsK IAkgIHRyZWUgc3R5cGUgPSBUUkVFX1RZUEUgKHN0ZXBfZXhwcik7CiAJICBvZmYgPSBmb2xkX2J1 aWxkMiAoTVVMVF9FWFBSLCBzdHlwZSwKLQkJCSAgICAgZm9sZF9jb252ZXJ0IChzdHlwZSwgbml0 ZXJzKSwgc3RlcF9leHByKTsKKwkJCSAgICAgICBmb2xkX2NvbnZlcnQgKHN0eXBlLCBuaXRlcnMp LCBzdGVwX2V4cHIpOworCiAJICBpZiAoUE9JTlRFUl9UWVBFX1AgKHR5cGUpKQogCSAgICBuaSA9 IGZvbGRfYnVpbGRfcG9pbnRlcl9wbHVzIChpbml0X2V4cHIsIG9mZik7CiAJICBlbHNlCkBAIC0y MjI2LDkgKzIyNDUsOSBAQCB2ZWN0X3VwZGF0ZV9pdnNfYWZ0ZXJfdmVjdG9yaXplciAobG9vcF92 ZWNfaW5mbyBsb29wX3ZpbmZvLAogCiAgICAgICB2YXIgPSBjcmVhdGVfdG1wX3ZhciAodHlwZSwg InRtcCIpOwogCi0gICAgICBsYXN0X2dzaSA9IGdzaV9sYXN0X2JiIChleGl0X2JiKTsKICAgICAg IGdpbXBsZV9zZXEgbmV3X3N0bXRzID0gTlVMTDsKICAgICAgIG5pX25hbWUgPSBmb3JjZV9naW1w bGVfb3BlcmFuZCAobmksICZuZXdfc3RtdHMsIGZhbHNlLCB2YXIpOworCiAgICAgICAvKiBFeGl0 X2JiIHNob3VsZG4ndCBiZSBlbXB0eS4gICovCiAgICAgICBpZiAoIWdzaV9lbmRfcCAobGFzdF9n c2kpKQogCXsKQEAgLTI3MjYsMTEgKzI3NDUsMTkgQEAgdmVjdF9nZW5fdmVjdG9yX2xvb3Bfbml0 ZXJzX211bHRfdmYgKGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbywKICAgaW50IHZmID0gTE9PUF9W SU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5mbykudG9fY29uc3RhbnQgKCk7CiAgIHRyZWUgdHlw ZSA9IFRSRUVfVFlQRSAobml0ZXJzX3ZlY3Rvcik7CiAgIHRyZWUgbG9nX3ZmID0gYnVpbGRfaW50 X2NzdCAodHlwZSwgZXhhY3RfbG9nMiAodmYpKTsKKyAgdHJlZSB0cmVlX3ZmID0gYnVpbGRfaW50 X2NzdCAodHlwZSwgdmYpOwogICBiYXNpY19ibG9jayBleGl0X2JiID0gTE9PUF9WSU5GT19JVl9F WElUIChsb29wX3ZpbmZvKS0+ZGVzdDsKIAogICBnY2NfYXNzZXJ0IChuaXRlcnNfdmVjdG9yX211 bHRfdmZfcHRyICE9IE5VTEwpOwogICB0cmVlIG5pdGVyc192ZWN0b3JfbXVsdF92ZiA9IGZvbGRf YnVpbGQyIChMU0hJRlRfRVhQUiwgdHlwZSwKIAkJCQkJICAgIG5pdGVyc192ZWN0b3IsIGxvZ192 Zik7CisKKyAgLyogSWYgd2UndmUgcGVlbGVkIGEgdmVjdG9yIGl0ZXJhdGlvbiB0aGVuIHN1YnRy YWN0IG9uZSBmdWxsIHZlY3RvcgorICAgICBpdGVyYXRpb24uICAqLworICBpZiAoTE9PUF9WSU5G T19FQVJMWV9CUkVBS1NfVkVDVF9QRUVMRUQgKGxvb3BfdmluZm8pKQorICAgIG5pdGVyc192ZWN0 b3JfbXVsdF92ZiA9IGZvbGRfYnVpbGQyIChNSU5VU19FWFBSLCB0eXBlLAorCQkJCQkgbml0ZXJz X3ZlY3Rvcl9tdWx0X3ZmLCB0cmVlX3ZmKTsKKwogICBpZiAoIWlzX2dpbXBsZV92YWwgKG5pdGVy c192ZWN0b3JfbXVsdF92ZikpCiAgICAgewogICAgICAgdHJlZSB2YXIgPSBjcmVhdGVfdG1wX3Zh ciAodHlwZSwgIm5pdGVyc192ZWN0b3JfbXVsdF92ZiIpOwpAQCAtMzMyOCw2ICszMzU1LDEwIEBA IHZlY3RfZG9fcGVlbGluZyAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLCB0cmVlIG5pdGVycywg dHJlZSBuaXRlcnNtMSwKIAkgbml0ZXJzX3ZlY3Rvcl9tdWx0X3ZmIHN0ZXBzLiAgKi8KICAgICAg IGdjY19jaGVja2luZ19hc3NlcnQgKHZlY3RfY2FuX2FkdmFuY2VfaXZzX3AgKGxvb3BfdmluZm8p KTsKICAgICAgIHVwZGF0ZV9lID0gc2tpcF92ZWN0b3IgPyBlIDogbG9vcF9wcmVoZWFkZXJfZWRn ZSAoZXBpbG9nKTsKKyAgICAgIGlmIChMT09QX1ZJTkZPX0VBUkxZX0JSRUFLUyAobG9vcF92aW5m bykpCisJdXBkYXRlX2UgPSBzaW5nbGVfc3VjY19lZGdlIChlLT5kZXN0KTsKKworICAgICAgLyog VXBkYXRlIHRoZSBtYWluIGV4aXQuICAqLwogICAgICAgdmVjdF91cGRhdGVfaXZzX2FmdGVyX3Zl Y3Rvcml6ZXIgKGxvb3BfdmluZm8sIG5pdGVyc192ZWN0b3JfbXVsdF92ZiwKIAkJCQkJdXBkYXRl X2UpOwogCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0b3JpemVyLmggYi9nY2MvdHJlZS12ZWN0 b3JpemVyLmgKaW5kZXggMzlhYTRkMTI1MGVmZTMwOGFjY2NmNDg0ZDM3MGY4YWRmZDFiYTg0My4u ZGU2MGRhMzFlMmEzMDMwYTdmYmMzMDJkM2Y2NzZhZjk2ODNmZDAxOSAxMDA2NDQKLS0tIGEvZ2Nj L3RyZWUtdmVjdG9yaXplci5oCisrKyBiL2djYy90cmVlLXZlY3Rvcml6ZXIuaApAQCAtMTAxNiw2 ICsxMDE2LDggQEAgcHVibGljOgogI2RlZmluZSBMT09QX1ZJTkZPX1BFRUxJTkdfRk9SX0dBUFMo TCkgICAgIChMKS0+cGVlbGluZ19mb3JfZ2FwcwogI2RlZmluZSBMT09QX1ZJTkZPX1BFRUxJTkdf Rk9SX05JVEVSKEwpICAgIChMKS0+cGVlbGluZ19mb3Jfbml0ZXIKICNkZWZpbmUgTE9PUF9WSU5G T19FQVJMWV9CUkVBS1MoTCkgICAgICAgICAoTCktPmVhcmx5X2JyZWFrcworI2RlZmluZSBMT09Q X1ZJTkZPX0VBUkxZX0JSRUFLU19WRUNUX1BFRUxFRChMKSAgXAorICAoc2luZ2xlX3ByZWQgKChM KS0+bG9vcC0+bGF0Y2gpICE9IChMKS0+dmVjX2xvb3BfaXZfZXhpdC0+c3JjKQogI2RlZmluZSBM T09QX1ZJTkZPX0VBUkxZX0JSS19DT05GTElDVF9TVE1UUyhMKSAoTCktPmVhcmx5X2JyZWFrX2Nv bmZsaWN0CiAjZGVmaW5lIExPT1BfVklORk9fRUFSTFlfQlJLX0RFU1RfQkIoTCkgICAgKEwpLT5l YXJseV9icmVha19kZXN0X2JiCiAjZGVmaW5lIExPT1BfVklORk9fRUFSTFlfQlJLX1ZVU0VTKEwp ICAgICAgKEwpLT5lYXJseV9icmVha192dXNlcwpAQCAtMjIyNCw2ICsyMjI2LDcgQEAgZXh0ZXJu IGR1bXBfdXNlcl9sb2NhdGlvbl90IGZpbmRfbG9vcF9sb2NhdGlvbiAoY2xhc3MgbG9vcCAqKTsK IGV4dGVybiBib29sIHZlY3RfY2FuX2FkdmFuY2VfaXZzX3AgKGxvb3BfdmVjX2luZm8pOwogZXh0 ZXJuIHZvaWQgdmVjdF91cGRhdGVfaW5pdHNfb2ZfZHJzIChsb29wX3ZlY19pbmZvLCB0cmVlLCB0 cmVlX2NvZGUpOwogZXh0ZXJuIGVkZ2UgdmVjX2luaXRfbG9vcF9leGl0X2luZm8gKGNsYXNzIGxv b3AgKik7CitleHRlcm4gdm9pZCB2ZWN0X2l2X2luY3JlbWVudF9wb3NpdGlvbiAoZWRnZSwgZ2lt cGxlX3N0bXRfaXRlcmF0b3IgKiwgYm9vbCAqKTsKIAogLyogSW4gdHJlZS12ZWN0LXN0bXRzLmNj LiAgKi8KIGV4dGVybiB0cmVlIGdldF9yZWxhdGVkX3ZlY3R5cGVfZm9yX3NjYWxhcl90eXBlICht YWNoaW5lX21vZGUsIHRyZWUsCg== --_002_VI1PR08MB53259B1F5A3E8BA07574BB16FFB8AVI1PR08MB5325eurp_--