From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2049.outbound.protection.outlook.com [40.107.7.49]) by sourceware.org (Postfix) with ESMTPS id 56C153858D3C for ; Mon, 20 Nov 2023 21:51:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 56C153858D3C 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 56C153858D3C Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.7.49 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700517117; cv=pass; b=AErjgySUtFdTXCT7G08BxiWDmTmzsx/dAbw6oOtIqKfatkMMoPoyILqhYZV6LfaSopjLaPCC8J5HRr+gDwhhr/mOw6GjF2OsWhwVn9HfIyai/axFo8psd5UrCGhVGmfiWAN5xzFhV2XJoSEmY3d2ZV9dW47BIgIwv512mDTTmsE= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1700517117; c=relaxed/simple; bh=0yJFDy0hiQ2aLGE3Nu8a5S5XtT9lA0XmaZxpYikFfHY=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=eULtdUYITuh+cJYF/GT9/KeJy9cU0T24N5Ac8PaRtsJHCUdIZi6F+ZuzKMNWGl8pk3MX/6frzVHePGBiM2tq09pHK4znh5nWWWs9zir3fFt3UPPy0Z1GyDqy77jO6YnNJKFGZJ3YsAL3wr95DXiv9TAWplzFz2YaYvDgupPtLvM= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=h7BfzGQdVDulcJPiD9t3T3qRgtWIFFmjQq8DfkjG0aMdnDqWzZ5EFxrtEZW2zKvUZcS0SfgpbmFivchE2l882BLf5mh127gBCjJWRNyX6xliFDzrts8EFUzcaR+3ZdAHDLiAtnoVGzCezhSYYSb4HBOMYT7yxYt0zMzO3nb/lfgdWGnj4+RG2wmA0LzskJztkM1Qt3kbohJTU7HFa5mWumqNHguiUy7RpSA2vYQ03+LyMamO6jMDMJdhknPcJ5JZUyzhDrsrkW3w10SwK4GlVdXtMwvTu/M8Ahj8A4roTu6TudyEg46GotXXy5sdLanD7Dv7XmKWN47L7wqRAZpoJg== 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=V/wWyt/ocuJdzHt5C5m8AnkvD/3OtzzaZ9yw6D5BQmQ=; b=P3+3al9YgQ4AhM0R82IKjbsv5tsCq3Z0IIpVcs6Q+HX4fo1qvCI0h6x55pSPwm8/jkPufXd6wLWeZB8oC4bpJSgR0oNczKE1dWDr1rM/zbG3OOUgbiaGSRcEwhiqsKXYVez+P0aRMbsyuM+jixhk5LVtNQ43sR0roA5GUu/RXV4hZt8TcSTErn6vLjf4vTHTMM/kT9NNcYIGZRX0gvmSF3StTaEUYTU2CmcyDzpZS4D8xuIsVYC1EkaXk7hcKspbKIs6bmzj+O0DZutv5gxEFNmUpWLmUWan6uC5yxJnb5nhR8KgbMMC4HIkmaHBkiO8TvdZGmHjMjQ6wx3OARPv2A== 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=V/wWyt/ocuJdzHt5C5m8AnkvD/3OtzzaZ9yw6D5BQmQ=; b=yJiBFWq/tAXUhmS6XZHJNs2BiVDW35doCl+hR9ombmxYJ2ijpDnJaQ0jkVSf2GWYh/nNIW3y395XcH/xof3/siPBO2IrnpAUDNfy0cPuAeCO6W4swD12HMZHZNzBgEGxCIk5VsiD/CBevs33Fgd06eBrsNQw8HgPPMhWHVH2wzo= Received: from DU6P191CA0054.EURP191.PROD.OUTLOOK.COM (2603:10a6:10:53e::21) by PAWPR08MB9831.eurprd08.prod.outlook.com (2603:10a6:102:2ee::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.26; Mon, 20 Nov 2023 21:51:48 +0000 Received: from DU6PEPF0000952A.eurprd02.prod.outlook.com (2603:10a6:10:53e:cafe::33) by DU6P191CA0054.outlook.office365.com (2603:10a6:10:53e::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.27 via Frontend Transport; Mon, 20 Nov 2023 21:51:47 +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 DU6PEPF0000952A.mail.protection.outlook.com (10.167.8.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.13 via Frontend Transport; Mon, 20 Nov 2023 21:51:47 +0000 Received: ("Tessian outbound 7671e7ddc218:v228"); Mon, 20 Nov 2023 21:51:47 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: c26f469b8a9856e7 X-CR-MTA-TID: 64aa7808 Received: from eac4a6f9517b.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id D1609940-6D51-44DC-A9F4-7035D11A1DF8.1; Mon, 20 Nov 2023 21:51:40 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id eac4a6f9517b.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 20 Nov 2023 21:51:40 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IxQvBmEdFQRo1+JHludVXXKA2OhnHlyJF7vxqB/O+UAhGVBdDtTK3wlkI3knAx9nyInMYcjZA1YHWmsNgtf2rBLpNLEghiNUsuxFuRh8kEaVv3ANiOtNFQZ7TKinSmumCFeR4pqo2tAh5mRQbQTarmjRc84jHhociW76PceRTKwDTkrLeAM3V2/6R3rbjKWTQnKXRwzQVrspM8657rT4wcdMITM5wVm7qwX+uT6jHhaUNssMIBRuxQAARt1RQhC25TS/lWbUqCXYzpdug63gxKEVAgtkiHu2ljQ+/WetWGBYrX1ebHce0NG7GlegpnvauWWqj/xO+nPvV28CGM8Vuw== 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=V/wWyt/ocuJdzHt5C5m8AnkvD/3OtzzaZ9yw6D5BQmQ=; b=l7lWMt+CyFUwNoptXwfpUCYH5RMCPHWicN52cjO0m+R8GSBKckf84Xu4n7Ou9LOKYOOGAWYft8vWjEPnJY7gyRixScgRzQypoHPkuOGoIhjFWjLM5CoqKN68I8atUWjPuHlcvQZyI0yYsk/DqkBNOjckz3P8rdYji3ivwfNAXZRRACD5p9RdoZcSS251SzP0ITL1BkM49x6u+bD17bQxNjmX+JpEDTU2DpzL+aYwxnK+3ZmA5bgyrc1qTu4bkQ0/MDoDbSe2pqjYcgAJgsu+pCUQQJAvCK4H/u+xgjPC/8EIIJkNnDHFg3gxvUyUMZ9JziAVLhPttRTdKKwCGMnc6A== 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=V/wWyt/ocuJdzHt5C5m8AnkvD/3OtzzaZ9yw6D5BQmQ=; b=yJiBFWq/tAXUhmS6XZHJNs2BiVDW35doCl+hR9ombmxYJ2ijpDnJaQ0jkVSf2GWYh/nNIW3y395XcH/xof3/siPBO2IrnpAUDNfy0cPuAeCO6W4swD12HMZHZNzBgEGxCIk5VsiD/CBevs33Fgd06eBrsNQw8HgPPMhWHVH2wzo= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by GV2PR08MB8097.eurprd08.prod.outlook.com (2603:10a6:150:75::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7002.26; Mon, 20 Nov 2023 21:51:38 +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.7002.028; Mon, 20 Nov 2023 21:51:38 +0000 From: Tamar Christina To: Richard Biener CC: "gcc-patches@gcc.gnu.org" , nd , "jlaw@ventanamicro.com" Subject: RE: [PATCH 4/21]middle-end: update loop peeling code to maintain LCSSA form for early breaks Thread-Topic: [PATCH 4/21]middle-end: update loop peeling code to maintain LCSSA form for early breaks Thread-Index: AQHaEIQzNfx0IW5sjkeDiQGlRVfnVrB6jCiAgADUtoCACHUqwA== Date: Mon, 20 Nov 2023 21:51:38 +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_|GV2PR08MB8097:EE_|DU6PEPF0000952A:EE_|PAWPR08MB9831:EE_ X-MS-Office365-Filtering-Correlation-Id: aabca4f3-0a11-466f-cd29-08dbea12e516 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: Dx/irXLMVNbVyOIddiWEZAnMNLTkSvJOl8C3y+vl/bZWvYxEYI84rkB9xmUGq2xi9C/Gt7CUGInqs2pyjwvn4nognMGoJLACD+JscQujhkA3+aJragVyfJlpiZCNhIirVe+oeLe0ByC62diakdiRSn7elfx0pTa8erETeFiIrAWyls46xEY5a6nhfxjGAt72kdx3TFJvvTRDbJnG3ht6r+WUJXMyEC8NLJzuZO0FU/BUwJ6Cz6QORB1jwVS2NMl41wlPs1jx1r8WVzq6JHuQzWYHML02UWbL/mHTizQ1kKTq7nMFdIB+2g+ujwziVH53On2ljJwLGgTAbm8/6gF+NeJZHX4F/ne2wlpZtZ67ahEfHLSyDLXw7eWF6QOfffQadGdlPNjcfoUa2T0XMmdj2uPPTUjkZF4bVqRglgCWWNwN2x3Df7EFiBnI4mmaxLcQK9ELQptIECoZu8zhI7sSIEPvoun8w3Zu6hOk+O/hMUlkJnfoi2L5FC66CpUJRyWvu8VxKe8iqaIHS3fxiROvOHvwUaopf5dlJdbe5w5MC6oxbgvFkjcmUNdLEfkqewRl4/lRb3hViTJQXK2253hhF4mibu6QIGsgEZ4PEvRguhQXjb3pP3QrABmvy+TiKA1yjunMSyVGIbaRisniAQIESg== 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)(39860400002)(396003)(366004)(376002)(346002)(136003)(230922051799003)(64100799003)(451199024)(1800799012)(186009)(2906002)(55016003)(41300700001)(8936002)(4326008)(8676002)(52536014)(15650500001)(5660300002)(30864003)(66476007)(66556008)(64756008)(66946007)(316002)(6916009)(66446008)(54906003)(76116006)(122000001)(99936003)(38100700002)(9686003)(6506007)(7696005)(71200400001)(86362001)(478600001)(38070700009)(83380400001)(33656002)(26005)(461764006);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB532511AC1FC7C80593B911B9FFB4AVI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8097 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: DU6PEPF0000952A.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 4f118c4e-ac40-43dd-73df-08dbea12df72 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: XlZ+C5+959nG1XD/u1zFeWIznrx+IeASf28sarvfsKOKWCz0qcnESqN32w7XxG/yhQMC+7/L8YVCcQ9X57QUe8A+Lkw/2gcUdBZZTtmjufNFaXaHXfHnoflhXAY1CbKFx8+1KqEDEGO8nd8H5AiqMGNTFM4RlX2MXq1KYdyEM5XPVUGrkxgU+8MfWkJLs53vwvqKjut3Rl2KqlmGoGpqo1A4CYr++UjH8SQTqQU7EOwk6otyMsk1NWz8+FcH8HhfHC2hI5cAZB4tkfGGNpBEMClPaqUIf/7eEpOOrO2A/KBrvAyY9XpiGEQyjTCzHFNmynaXIMmem9YmbyKgga2Np/bjNihzmijUOzhfHlQycKSAwtys5Bwk/GA4N77ebuV0YgLyv0vi6AWCHAwEgguQdAe4L1HJ/IXTV2P49Q6/cFgDZH53kaNkTRT7XV6yZVgEe8i6g6ER4UfNIYbr6Or0X6bBoLEQZ98/zyT44XdK86/xqk7D0G1K6jDsU892lFmcAH4s6h0RUXhfcg428ML+HiflBgkWDHRBvH6o605xGY3LzA9QURQTv/1SHdueWHWliK2DmzltaNtBVgWaVm2Eb+i0Ffp51PJv6tcsaDIzv6n7dD+pvd5ZoyhL9rA1hTm89M0KenxQLtdb6tQFi5WfoK6rQfuk54b21MtcpSCZ7xzLeKlMRH0uEeREQgVQHaJRPn1VLJMvPX9GxSrmnKGd0VCS92OZLAu/B9Eo8R+f8nVMIYhrI4c9Uk1cRvEfzZzkhaAGLu5dIB1d6HKti7bfsw== 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)(396003)(136003)(376002)(39860400002)(346002)(230922051799003)(451199024)(64100799003)(186009)(1800799012)(82310400011)(36840700001)(46966006)(40470700004)(40460700003)(70206006)(70586007)(54906003)(316002)(9686003)(7696005)(336012)(478600001)(6506007)(107886003)(26005)(82740400003)(81166007)(356005)(99936003)(83380400001)(33656002)(36860700001)(86362001)(47076005)(55016003)(40480700001)(2906002)(5660300002)(235185007)(30864003)(15650500001)(6862004)(4326008)(8676002)(8936002)(52536014)(41300700001)(461764006);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2023 21:51:47.6844 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: aabca4f3-0a11-466f-cd29-08dbea12e516 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: DU6PEPF0000952A.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR08MB9831 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,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_VI1PR08MB532511AC1FC7C80593B911B9FFB4AVI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi All, Here's the respun patch: This splits the part of the function that does peeling for loops at exits t= o a different function. In this new function we also peel for early breaks. Peeling for early breaks works by redirecting all early break exits to a single "early break" block and combine them and the normal exit edge togeth= er later in a different block which then goes into the epilog preheader. This allows us to re-use all the existing code for IV updates, Additionally= this also enables correct linking for multiple vector epilogues. flush_pending_stmts cannot be used in this scenario since it updates the PH= I nodes in the order that they are in the exit destination blocks. This mean= s they are in CFG visit order. With a single exit this doesn't matter but wi= th multiple exits with different live values through the different exits the o= rder usually does not line up. Additionally the vectorizer helper functions expect to be able to iterate o= ver the nodes in the order that they occur in the loop header blocks. This is = an invariant we must maintain. To do this we just inline the work flush_pending_stmts but maintain the order by using the header blocks to gu= ide the work. The way peeling is done result in LIM noticing that in some cases the condi= tion and the results are loop invariant and tries to move them out of the loop. While the resulting code is operationally sound, moving the compare out of = the gcond results in generating code that no longer branches, so cbranch is no longer applicable. As such I now add code to check during this motion to s= ee if the target supports flag setting vector comparison as general operation. One outstanding issue is probability scaling, testcases like vect-epilogues-2.c.176t.vect fails because during peeling I make an interme= diate edge that is used to keep IV updates simple. This edge seems to have the w= rong count: if (ivtmp_71 < bnd.8_54) goto ; [89.00%] else goto ; [11.00%] ;; succ: 8 [89.0% (guessed)] count:765459809 (estimated locally, = freq 6.4808) (TRUE_VALUE,EXECUTABLE) ;; 24 [11.0% (guessed)] count:94607391 (estimated locally, = freq 0.8010) (FALSE_VALUE,EXECUTABLE) ;; basic block 24, loop depth 0, count 105119324 (estimated locally, freq= 0.8900), maybe hot ;; Invalid sum of incoming counts 94607391 (estimated locally, freq 0.801= 0), should be 105119324 (estimated locally, freq 0.8900) ;; prev block 8, next block 30, flags: (NEW, VISITED) ;; pred: 3 [11.0% (guessed)] count:94607391 (estimated locally, f= req 0.8010) (FALSE_VALUE,EXECUTABLE) # res_46 =3D PHI If I'm reading this error correctly, the edge count should be 94607391 but = it got 105119324. My guess is that something scalled up the BB count, i.e. 94607391 * 1.11, but... I don't know why or what. Any thoughts? Bootstrapped Regtested on aarch64-none-linux-gnu and no issues aside from profile counts above. Ok for master? Thanks, Tamar gcc/ChangeLog: * gcc/tree-ssa-loop-im.cc (compute_invariantness): Import insn-codes.h and optabs-tree.h and check for vector compare motion out of gcond. * tree-vect-loop-manip.cc (slpeel_tree_duplicate_loop_for_vectorization): New. (slpeel_tree_duplicate_loop_to_edge_cfg): use it. * tree-vectorizer.h (is_loop_header_bb_p): Drop assert. (slpeel_tree_duplicate_loop_to_edge_cfg): Update signature. --- inline copy of patch --- diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc index 396963b6754c7671e2e5404302a69129918555e2..92a9318a1ca0a2da50ff2f29cf2= 71d2e78fddd77 100644 --- a/gcc/tree-ssa-loop-im.cc +++ b/gcc/tree-ssa-loop-im.cc @@ -48,6 +48,8 @@ along with GCC; see the file COPYING3. If not see #include "tree-dfa.h" #include "tree-ssa.h" #include "dbgcnt.h" +#include "insn-codes.h" +#include "optabs-tree.h" =20 /* TODO: Support for predicated code motion. I.e. =20 @@ -1138,6 +1140,24 @@ compute_invariantness (basic_block bb) continue; } =20 + /* Check if one of the depedent statement is a vector compare whether + the target supports it, otherwise it's invalid to hoist it out of + the gcond it belonged to. */ + for (auto dep_stmt : lim_data->depends) + { + if (is_gimple_assign (dep_stmt) + && VECTOR_TYPE_P (TREE_TYPE (gimple_assign_lhs (dep_stmt)))) + { + tree type =3D TREE_TYPE (gimple_assign_lhs (dep_stmt)); + auto code =3D gimple_assign_rhs_code (dep_stmt); + if (!target_supports_op_p (type, code, optab_vector)) + pos =3D MOVE_IMPOSSIBLE; + } + } + + if (pos =3D=3D MOVE_IMPOSSIBLE) + continue; + if (dump_file && (dump_flags & TDF_DETAILS)) { print_gimple_stmt (dump_file, stmt, 2); diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index b9161274ce401a7307f3e61ad23aa036701190d7..9d17e6877e1e16b359fdc86a92b= f33a9760f8f86 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -1403,13 +1403,16 @@ vect_set_loop_condition (class loop *loop, edge loo= p_e, loop_vec_info loop_vinfo copies remains the same. =20 If UPDATED_DOMS is not NULL it is update with the list of basic blocks = whoms - dominators were updated during the peeling. */ + dominators were updated during the peeling. When doing early break vec= torization + then LOOP_VINFO needs to be provided and is used to keep track of any n= ewly created + memory references that need to be updated should we decide to vectorize= . */ =20 class loop * slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, class loop *scalar_loop, edge scalar_exit, edge e, edge *new_e, - bool flow_loops) + bool flow_loops, + vec *updated_doms) { class loop *new_loop; basic_block *new_bbs, *bbs, *pbbs; @@ -1526,7 +1529,9 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *l= oop, edge loop_exit, } =20 auto loop_exits =3D get_loop_exit_edges (loop); + bool multiple_exits_p =3D loop_exits.length () > 1; auto_vec doms; + class loop *update_loop =3D NULL; =20 if (at_exit) /* Add the loop copy at exit. */ { @@ -1536,39 +1541,61 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop = *loop, edge loop_exit, flush_pending_stmts (new_exit); } =20 + bool multiple_exits_p =3D loop_exits.length () > 1; + basic_block main_loop_exit_block =3D new_preheader; + basic_block alt_loop_exit_block =3D NULL; + /* Create intermediate edge for main exit. */ + edge loop_e =3D single_succ_edge (new_preheader); + new_preheader =3D split_edge (loop_e); + auto_vec new_phis; hash_map new_phi_args; /* First create the empty phi nodes so that when we flush the statements they can be filled in. However because there is no order between the PHI nodes in the exits and the loop headers we need to order them base on the order of the two headers. First record the new - phi nodes. */ - for (auto gsi_from =3D gsi_start_phis (scalar_exit->dest); + phi nodes. Then redirect the edges and flush the changes. This writes + out the new SSA names. */ + for (auto gsi_from =3D gsi_start_phis (loop_exit->dest); !gsi_end_p (gsi_from); gsi_next (&gsi_from)) { gimple *from_phi =3D gsi_stmt (gsi_from); tree new_res =3D copy_ssa_name (gimple_phi_result (from_phi)); - gphi *res =3D create_phi_node (new_res, new_preheader); + gphi *res =3D create_phi_node (new_res, main_loop_exit_block); new_phis.safe_push (res); } =20 - /* Then redirect the edges and flush the changes. This writes out t= he new - SSA names. */ - for (edge exit : loop_exits) + for (auto exit : loop_exits) { - edge temp_e =3D redirect_edge_and_branch (exit, new_preheader); - flush_pending_stmts (temp_e); + basic_block dest =3D main_loop_exit_block; + if (exit !=3D loop_exit) + { + if (!alt_loop_exit_block) + { + alt_loop_exit_block =3D split_edge (exit); + edge res =3D redirect_edge_and_branch ( + single_succ_edge (alt_loop_exit_block), + new_preheader); + flush_pending_stmts (res); + continue; + } + dest =3D alt_loop_exit_block; + } + edge e =3D redirect_edge_and_branch (exit, dest); + flush_pending_stmts (e); } + /* Record the new SSA names in the cache so that we can skip materia= lizing them again when we fill in the rest of the LCSSA variables. */ for (auto phi : new_phis) { - tree new_arg =3D gimple_phi_arg (phi, 0)->def; + tree new_arg =3D gimple_phi_arg (phi, loop_exit->dest_idx)->def; =20 if (!SSA_VAR_P (new_arg)) continue; + /* If the PHI MEM node dominates the loop then we shouldn't create - a new LC-SSSA PHI for it in the intermediate block. */ + a new LC-SSSA PHI for it in the intermediate block. */ /* A MEM phi that consitutes a new DEF for the vUSE chain can either be a .VDEF or a PHI that operates on MEM. And said definition must not be inside the main loop. Or we must be a parameter. @@ -1584,6 +1611,9 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *l= oop, edge loop_exit, remove_phi_node (&gsi, true); continue; } + + /* If we decide to remove the PHI node we should also not + rematerialize it later on. */ new_phi_args.put (new_arg, gimple_phi_result (phi)); =20 if (TREE_CODE (new_arg) !=3D SSA_NAME) @@ -1595,34 +1625,58 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop = *loop, edge loop_exit, preheader block and still find the right LC nodes. */ edge loop_entry =3D single_succ_edge (new_preheader); if (flow_loops) - for (auto gsi_from =3D gsi_start_phis (loop->header), - gsi_to =3D gsi_start_phis (new_loop->header); - !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); - gsi_next (&gsi_from), gsi_next (&gsi_to)) - { - gimple *from_phi =3D gsi_stmt (gsi_from); - gimple *to_phi =3D gsi_stmt (gsi_to); - tree new_arg =3D PHI_ARG_DEF_FROM_EDGE (from_phi, - loop_latch_edge (loop)); + { + /* Link through the main exit first. */ + for (auto gsi_from =3D gsi_start_phis (loop->header), + gsi_to =3D gsi_start_phis (new_loop->header); + !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); + gsi_next (&gsi_from), gsi_next (&gsi_to)) + { + gimple *from_phi =3D gsi_stmt (gsi_from); + gimple *to_phi =3D gsi_stmt (gsi_to); + tree new_arg =3D PHI_ARG_DEF_FROM_EDGE (from_phi, + loop_latch_edge (loop)); =20 - /* Check if we've already created a new phi node during edge - redirection. If we have, only propagate the value downwards. */ - if (tree *res =3D new_phi_args.get (new_arg)) - { - adjust_phi_and_debug_stmts (to_phi, loop_entry, *res); - continue; - } + /* Check if we've already created a new phi node during edge + redirection. If we have, only propagate the value + downwards. */ + if (tree *res =3D new_phi_args.get (new_arg)) + new_arg =3D *res; =20 - tree new_res =3D copy_ssa_name (gimple_phi_result (from_phi)); - gphi *lcssa_phi =3D create_phi_node (new_res, new_preheader); + tree new_res =3D copy_ssa_name (gimple_phi_result (from_phi)); + gphi *lcssa_phi =3D create_phi_node (new_res, new_preheader); =20 - /* Main loop exit should use the final iter value. */ - add_phi_arg (lcssa_phi, new_arg, loop_exit, UNKNOWN_LOCATION); + /* Main loop exit should use the final iter value. */ + SET_PHI_ARG_DEF (lcssa_phi, loop_exit->dest_idx, new_arg); =20 - adjust_phi_and_debug_stmts (to_phi, loop_entry, new_res); - } + adjust_phi_and_debug_stmts (to_phi, loop_entry, new_res); + } =20 - set_immediate_dominator (CDI_DOMINATORS, new_preheader, e->src); + set_immediate_dominator (CDI_DOMINATORS, main_loop_exit_block, loop_exi= t->src); + set_immediate_dominator (CDI_DOMINATORS, new_preheader, main_loop_exit_= block); + + /* Now link the alternative exits. */ + if (multiple_exits_p) + { + for (auto gsi_from =3D gsi_start_phis (loop->header), + gsi_to =3D gsi_start_phis (new_preheader); + !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to); + gsi_next (&gsi_from), gsi_next (&gsi_to)) + { + gimple *from_phi =3D gsi_stmt (gsi_from); + gimple *to_phi =3D gsi_stmt (gsi_to); + + tree alt_arg =3D gimple_phi_result (from_phi); + edge main_e =3D single_succ_edge (alt_loop_exit_block); + for (edge e : loop_exits) + if (e !=3D loop_exit) + SET_PHI_ARG_DEF (to_phi, main_e->dest_idx, alt_arg); + } + + set_immediate_dominator (CDI_DOMINATORS, new_preheader, + loop->header); + } + } =20 if (was_imm_dom || duplicate_outer_loop) set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_exit->src); @@ -1634,6 +1688,21 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *= loop, edge loop_exit, delete_basic_block (preheader); set_immediate_dominator (CDI_DOMINATORS, scalar_loop->header, loop_preheader_edge (scalar_loop)->src); + + /* Finally after wiring the new epilogue we need to update its main = exit + to the original function exit we recorded. Other exits are already + correct. */ + if (multiple_exits_p) + { + update_loop =3D new_loop; + for (edge e : get_loop_exit_edges (loop)) + doms.safe_push (e->dest); + doms.safe_push (exit_dest); + + /* Likely a fall-through edge, so update if needed. */ + if (single_succ_p (exit_dest)) + doms.safe_push (single_succ (exit_dest)); + } } else /* Add the copy at entry. */ { @@ -1681,6 +1750,34 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *= loop, edge loop_exit, delete_basic_block (new_preheader); set_immediate_dominator (CDI_DOMINATORS, new_loop->header, loop_preheader_edge (new_loop)->src); + + if (multiple_exits_p) + update_loop =3D loop; + } + + if (multiple_exits_p) + { + for (edge e : get_loop_exit_edges (update_loop)) + { + edge ex; + edge_iterator ei; + FOR_EACH_EDGE (ex, ei, e->dest->succs) + { + /* Find the first non-fallthrough block as fall-throughs can't + dominate other blocks. */ + if (single_succ_p (ex->dest)) + { + doms.safe_push (ex->dest); + ex =3D single_succ_edge (ex->dest); + } + doms.safe_push (ex->dest); + } + doms.safe_push (e->dest); + } + + iterate_fix_dominators (CDI_DOMINATORS, doms, false); + if (updated_doms) + updated_doms->safe_splice (doms); } =20 free (new_bbs); diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index b5e27d1c46d9cb3dfe5b44f1b49c9e4204572ff1..39aa4d1250efe308acccf484d37= 0f8adfd1ba843 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1821,7 +1821,7 @@ is_loop_header_bb_p (basic_block bb) { if (bb =3D=3D (bb->loop_father)->header) return true; - gcc_checking_assert (EDGE_COUNT (bb->preds) =3D=3D 1); + return false; } =20 @@ -2212,7 +2212,8 @@ extern bool slpeel_can_duplicate_loop_p (const class = loop *, const_edge, const_edge); class loop *slpeel_tree_duplicate_loop_to_edge_cfg (class loop *, edge, class loop *, edge, - edge, edge *, bool =3D true); + edge, edge *, bool =3D true, + vec * =3D NULL); class loop *vect_loop_versioning (loop_vec_info, gimple *); extern class loop *vect_do_peeling (loop_vec_info, tree, tree, tree *, tree *, tree *, int, bool, bool, --_002_VI1PR08MB532511AC1FC7C80593B911B9FFB4AVI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb17964 (1).patch" Content-Description: rb17964 (1).patch Content-Disposition: attachment; filename="rb17964 (1).patch"; size=11906; creation-date="Mon, 20 Nov 2023 21:51:29 GMT"; modification-date="Mon, 20 Nov 2023 21:51:37 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy90cmVlLXNzYS1sb29wLWltLmNjIGIvZ2NjL3RyZWUtc3NhLWxvb3At aW0uY2MKaW5kZXggMzk2OTYzYjY3NTRjNzY3MWUyZTU0MDQzMDJhNjkxMjk5MTg1NTVlMi4uOTJh OTMxOGExY2EwYTJkYTUwZmYyZjI5Y2YyNzFkMmU3OGZkZGQ3NyAxMDA2NDQKLS0tIGEvZ2NjL3Ry ZWUtc3NhLWxvb3AtaW0uY2MKKysrIGIvZ2NjL3RyZWUtc3NhLWxvb3AtaW0uY2MKQEAgLTQ4LDYg KzQ4LDggQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBz ZWUKICNpbmNsdWRlICJ0cmVlLWRmYS5oIgogI2luY2x1ZGUgInRyZWUtc3NhLmgiCiAjaW5jbHVk ZSAiZGJnY250LmgiCisjaW5jbHVkZSAiaW5zbi1jb2Rlcy5oIgorI2luY2x1ZGUgIm9wdGFicy10 cmVlLmgiCiAKIC8qIFRPRE86ICBTdXBwb3J0IGZvciBwcmVkaWNhdGVkIGNvZGUgbW90aW9uLiAg SS5lLgogCkBAIC0xMTM4LDYgKzExNDAsMjQgQEAgY29tcHV0ZV9pbnZhcmlhbnRuZXNzIChiYXNp Y19ibG9jayBiYikKIAkgICAgY29udGludWU7CiAJICB9CiAKKwkvKiBDaGVjayBpZiBvbmUgb2Yg dGhlIGRlcGVkZW50IHN0YXRlbWVudCBpcyBhIHZlY3RvciBjb21wYXJlIHdoZXRoZXIKKwkgICB0 aGUgdGFyZ2V0IHN1cHBvcnRzIGl0LCAgb3RoZXJ3aXNlIGl0J3MgaW52YWxpZCB0byBob2lzdCBp dCBvdXQgb2YKKwkgICB0aGUgZ2NvbmQgaXQgYmVsb25nZWQgdG8uICAqLworCWZvciAoYXV0byBk ZXBfc3RtdCA6IGxpbV9kYXRhLT5kZXBlbmRzKQorCSAgeworCSAgICAgaWYgKGlzX2dpbXBsZV9h c3NpZ24gKGRlcF9zdG10KQorCQkgJiYgVkVDVE9SX1RZUEVfUCAoVFJFRV9UWVBFIChnaW1wbGVf YXNzaWduX2xocyAoZGVwX3N0bXQpKSkpCisJCXsKKwkJICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUg KGdpbXBsZV9hc3NpZ25fbGhzIChkZXBfc3RtdCkpOworCQkgIGF1dG8gY29kZSA9IGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKGRlcF9zdG10KTsKKwkJICBpZiAoIXRhcmdldF9zdXBwb3J0c19vcF9w ICh0eXBlLCBjb2RlLCBvcHRhYl92ZWN0b3IpKQorCQkgICAgcG9zID0gTU9WRV9JTVBPU1NJQkxF OworCQl9CisJICB9CisKKwlpZiAocG9zID09IE1PVkVfSU1QT1NTSUJMRSkKKwkgIGNvbnRpbnVl OworCiAJaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKIAkgIHsK IAkgICAgcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgc3RtdCwgMik7CmRpZmYgLS1naXQg YS9nY2MvdHJlZS12ZWN0LWxvb3AtbWFuaXAuY2MgYi9nY2MvdHJlZS12ZWN0LWxvb3AtbWFuaXAu Y2MKaW5kZXggYjkxNjEyNzRjZTQwMWE3MzA3ZjNlNjFhZDIzYWEwMzY3MDExOTBkNy4uOWQxN2U2 ODc3ZTFlMTZiMzU5ZmRjODZhOTJiZjMzYTk3NjBmOGY4NiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUt dmVjdC1sb29wLW1hbmlwLmNjCisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jYwpAQCAt MTQwMywxMyArMTQwMywxNiBAQCB2ZWN0X3NldF9sb29wX2NvbmRpdGlvbiAoY2xhc3MgbG9vcCAq bG9vcCwgZWRnZSBsb29wX2UsIGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbwogICAgY29waWVzIHJl bWFpbnMgdGhlIHNhbWUuCiAKICAgIElmIFVQREFURURfRE9NUyBpcyBub3QgTlVMTCBpdCBpcyB1 cGRhdGUgd2l0aCB0aGUgbGlzdCBvZiBiYXNpYyBibG9ja3Mgd2hvbXMKLSAgIGRvbWluYXRvcnMg d2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcGVlbGluZy4gICovCisgICBkb21pbmF0b3JzIHdlcmUg dXBkYXRlZCBkdXJpbmcgdGhlIHBlZWxpbmcuICBXaGVuIGRvaW5nIGVhcmx5IGJyZWFrIHZlY3Rv cml6YXRpb24KKyAgIHRoZW4gTE9PUF9WSU5GTyBuZWVkcyB0byBiZSBwcm92aWRlZCBhbmQgaXMg dXNlZCB0byBrZWVwIHRyYWNrIG9mIGFueSBuZXdseSBjcmVhdGVkCisgICBtZW1vcnkgcmVmZXJl bmNlcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBzaG91bGQgd2UgZGVjaWRlIHRvIHZlY3Rvcml6 ZS4gICovCiAKIGNsYXNzIGxvb3AgKgogc2xwZWVsX3RyZWVfZHVwbGljYXRlX2xvb3BfdG9fZWRn ZV9jZmcgKGNsYXNzIGxvb3AgKmxvb3AsIGVkZ2UgbG9vcF9leGl0LAogCQkJCQljbGFzcyBsb29w ICpzY2FsYXJfbG9vcCwKIAkJCQkJZWRnZSBzY2FsYXJfZXhpdCwgZWRnZSBlLCBlZGdlICpuZXdf ZSwKLQkJCQkJYm9vbCBmbG93X2xvb3BzKQorCQkJCQlib29sIGZsb3dfbG9vcHMsCisJCQkJCXZl YzxiYXNpY19ibG9jaz4gKnVwZGF0ZWRfZG9tcykKIHsKICAgY2xhc3MgbG9vcCAqbmV3X2xvb3A7 CiAgIGJhc2ljX2Jsb2NrICpuZXdfYmJzLCAqYmJzLCAqcGJiczsKQEAgLTE1MjYsNyArMTUyOSw5 IEBAIHNscGVlbF90cmVlX2R1cGxpY2F0ZV9sb29wX3RvX2VkZ2VfY2ZnIChjbGFzcyBsb29wICps b29wLCBlZGdlIGxvb3BfZXhpdCwKICAgICAgIH0KIAogICBhdXRvIGxvb3BfZXhpdHMgPSBnZXRf bG9vcF9leGl0X2VkZ2VzIChsb29wKTsKKyAgYm9vbCBtdWx0aXBsZV9leGl0c19wID0gbG9vcF9l eGl0cy5sZW5ndGggKCkgPiAxOwogICBhdXRvX3ZlYzxiYXNpY19ibG9jaz4gZG9tczsKKyAgY2xh c3MgbG9vcCAqdXBkYXRlX2xvb3AgPSBOVUxMOwogCiAgIGlmIChhdF9leGl0KSAvKiBBZGQgdGhl IGxvb3AgY29weSBhdCBleGl0LiAgKi8KICAgICB7CkBAIC0xNTM2LDM5ICsxNTQxLDYxIEBAIHNs cGVlbF90cmVlX2R1cGxpY2F0ZV9sb29wX3RvX2VkZ2VfY2ZnIChjbGFzcyBsb29wICpsb29wLCBl ZGdlIGxvb3BfZXhpdCwKIAkgIGZsdXNoX3BlbmRpbmdfc3RtdHMgKG5ld19leGl0KTsKIAl9CiAK KyAgICAgIGJvb2wgbXVsdGlwbGVfZXhpdHNfcCA9IGxvb3BfZXhpdHMubGVuZ3RoICgpID4gMTsK KyAgICAgIGJhc2ljX2Jsb2NrIG1haW5fbG9vcF9leGl0X2Jsb2NrID0gbmV3X3ByZWhlYWRlcjsK KyAgICAgIGJhc2ljX2Jsb2NrIGFsdF9sb29wX2V4aXRfYmxvY2sgPSBOVUxMOworICAgICAgLyog Q3JlYXRlIGludGVybWVkaWF0ZSBlZGdlIGZvciBtYWluIGV4aXQuICAqLworICAgICAgZWRnZSBs b29wX2UgPSBzaW5nbGVfc3VjY19lZGdlIChuZXdfcHJlaGVhZGVyKTsKKyAgICAgIG5ld19wcmVo ZWFkZXIgPSBzcGxpdF9lZGdlIChsb29wX2UpOworCiAgICAgICBhdXRvX3ZlYyA8Z2ltcGxlICo+ IG5ld19waGlzOwogICAgICAgaGFzaF9tYXAgPHRyZWUsIHRyZWU+IG5ld19waGlfYXJnczsKICAg ICAgIC8qIEZpcnN0IGNyZWF0ZSB0aGUgZW1wdHkgcGhpIG5vZGVzIHNvIHRoYXQgd2hlbiB3ZSBm bHVzaCB0aGUKIAkgc3RhdGVtZW50cyB0aGV5IGNhbiBiZSBmaWxsZWQgaW4uICAgSG93ZXZlciBi ZWNhdXNlIHRoZXJlIGlzIG5vIG9yZGVyCiAJIGJldHdlZW4gdGhlIFBISSBub2RlcyBpbiB0aGUg ZXhpdHMgYW5kIHRoZSBsb29wIGhlYWRlcnMgd2UgbmVlZCB0bwogCSBvcmRlciB0aGVtIGJhc2Ug b24gdGhlIG9yZGVyIG9mIHRoZSB0d28gaGVhZGVycy4gIEZpcnN0IHJlY29yZCB0aGUgbmV3Ci0J IHBoaSBub2Rlcy4gICovCi0gICAgICBmb3IgKGF1dG8gZ3NpX2Zyb20gPSBnc2lfc3RhcnRfcGhp cyAoc2NhbGFyX2V4aXQtPmRlc3QpOworCSBwaGkgbm9kZXMuIFRoZW4gcmVkaXJlY3QgdGhlIGVk Z2VzIGFuZCBmbHVzaCB0aGUgY2hhbmdlcy4gIFRoaXMgd3JpdGVzCisJIG91dCB0aGUgbmV3IFNT QSBuYW1lcy4gICovCisgICAgICBmb3IgKGF1dG8gZ3NpX2Zyb20gPSBnc2lfc3RhcnRfcGhpcyAo bG9vcF9leGl0LT5kZXN0KTsKIAkgICAhZ3NpX2VuZF9wIChnc2lfZnJvbSk7IGdzaV9uZXh0ICgm Z3NpX2Zyb20pKQogCXsKIAkgIGdpbXBsZSAqZnJvbV9waGkgPSBnc2lfc3RtdCAoZ3NpX2Zyb20p OwogCSAgdHJlZSBuZXdfcmVzID0gY29weV9zc2FfbmFtZSAoZ2ltcGxlX3BoaV9yZXN1bHQgKGZy b21fcGhpKSk7Ci0JICBncGhpICpyZXMgPSBjcmVhdGVfcGhpX25vZGUgKG5ld19yZXMsIG5ld19w cmVoZWFkZXIpOworCSAgZ3BoaSAqcmVzID0gY3JlYXRlX3BoaV9ub2RlIChuZXdfcmVzLCBtYWlu X2xvb3BfZXhpdF9ibG9jayk7CiAJICBuZXdfcGhpcy5zYWZlX3B1c2ggKHJlcyk7CiAJfQogCi0g ICAgICAvKiBUaGVuIHJlZGlyZWN0IHRoZSBlZGdlcyBhbmQgZmx1c2ggdGhlIGNoYW5nZXMuICBU aGlzIHdyaXRlcyBvdXQgdGhlIG5ldwotCSBTU0EgbmFtZXMuICAqLwotICAgICAgZm9yIChlZGdl IGV4aXQgOiBsb29wX2V4aXRzKQorICAgICAgZm9yIChhdXRvIGV4aXQgOiBsb29wX2V4aXRzKQog CXsKLQkgIGVkZ2UgdGVtcF9lID0gcmVkaXJlY3RfZWRnZV9hbmRfYnJhbmNoIChleGl0LCBuZXdf cHJlaGVhZGVyKTsKLQkgIGZsdXNoX3BlbmRpbmdfc3RtdHMgKHRlbXBfZSk7CisJICBiYXNpY19i bG9jayBkZXN0ID0gbWFpbl9sb29wX2V4aXRfYmxvY2s7CisJICBpZiAoZXhpdCAhPSBsb29wX2V4 aXQpCisJICAgIHsKKwkgICAgICBpZiAoIWFsdF9sb29wX2V4aXRfYmxvY2spCisJCXsKKwkJICBh bHRfbG9vcF9leGl0X2Jsb2NrID0gc3BsaXRfZWRnZSAoZXhpdCk7CisJCSAgZWRnZSByZXMgPSBy ZWRpcmVjdF9lZGdlX2FuZF9icmFuY2ggKAorCQkJCXNpbmdsZV9zdWNjX2VkZ2UgKGFsdF9sb29w X2V4aXRfYmxvY2spLAorCQkJCW5ld19wcmVoZWFkZXIpOworCQkgIGZsdXNoX3BlbmRpbmdfc3Rt dHMgKHJlcyk7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBkZXN0ID0gYWx0X2xvb3BfZXhp dF9ibG9jazsKKwkgICAgfQorCSAgZWRnZSBlID0gcmVkaXJlY3RfZWRnZV9hbmRfYnJhbmNoIChl eGl0LCBkZXN0KTsKKwkgIGZsdXNoX3BlbmRpbmdfc3RtdHMgKGUpOwogCX0KKwogICAgICAgLyog UmVjb3JkIHRoZSBuZXcgU1NBIG5hbWVzIGluIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiBza2lw IG1hdGVyaWFsaXppbmcKIAkgdGhlbSBhZ2FpbiB3aGVuIHdlIGZpbGwgaW4gdGhlIHJlc3Qgb2Yg dGhlIExDU1NBIHZhcmlhYmxlcy4gICovCiAgICAgICBmb3IgKGF1dG8gcGhpIDogbmV3X3BoaXMp CiAJewotCSAgdHJlZSBuZXdfYXJnID0gZ2ltcGxlX3BoaV9hcmcgKHBoaSwgMCktPmRlZjsKKwkg IHRyZWUgbmV3X2FyZyA9IGdpbXBsZV9waGlfYXJnIChwaGksIGxvb3BfZXhpdC0+ZGVzdF9pZHgp LT5kZWY7CiAKIAkgIGlmICghU1NBX1ZBUl9QIChuZXdfYXJnKSkKIAkgICAgY29udGludWU7CisK IAkgIC8qIElmIHRoZSBQSEkgTUVNIG5vZGUgZG9taW5hdGVzIHRoZSBsb29wIHRoZW4gd2Ugc2hv dWxkbid0IGNyZWF0ZQotCSAgICAgIGEgbmV3IExDLVNTU0EgUEhJIGZvciBpdCBpbiB0aGUgaW50 ZXJtZWRpYXRlIGJsb2NrLiAgICovCisJICAgICBhIG5ldyBMQy1TU1NBIFBISSBmb3IgaXQgaW4g dGhlIGludGVybWVkaWF0ZSBibG9jay4gICAqLwogCSAgLyogQSBNRU0gcGhpIHRoYXQgY29uc2l0 dXRlcyBhIG5ldyBERUYgZm9yIHRoZSB2VVNFIGNoYWluIGNhbiBlaXRoZXIKIAkgICAgIGJlIGEg LlZERUYgb3IgYSBQSEkgdGhhdCBvcGVyYXRlcyBvbiBNRU0uIEFuZCBzYWlkIGRlZmluaXRpb24K IAkgICAgIG11c3Qgbm90IGJlIGluc2lkZSB0aGUgbWFpbiBsb29wLiAgT3Igd2UgbXVzdCBiZSBh IHBhcmFtZXRlci4KQEAgLTE1ODQsNiArMTYxMSw5IEBAIHNscGVlbF90cmVlX2R1cGxpY2F0ZV9s b29wX3RvX2VkZ2VfY2ZnIChjbGFzcyBsb29wICpsb29wLCBlZGdlIGxvb3BfZXhpdCwKIAkgICAg ICByZW1vdmVfcGhpX25vZGUgKCZnc2ksIHRydWUpOwogCSAgICAgIGNvbnRpbnVlOwogCSAgICB9 CisKKwkgIC8qIElmIHdlIGRlY2lkZSB0byByZW1vdmUgdGhlIFBISSBub2RlIHdlIHNob3VsZCBh bHNvIG5vdAorCSAgICAgcmVtYXRlcmlhbGl6ZSBpdCBsYXRlciBvbi4gICovCiAJICBuZXdfcGhp X2FyZ3MucHV0IChuZXdfYXJnLCBnaW1wbGVfcGhpX3Jlc3VsdCAocGhpKSk7CiAKIAkgIGlmIChU UkVFX0NPREUgKG5ld19hcmcpICE9IFNTQV9OQU1FKQpAQCAtMTU5NSwzNCArMTYyNSw1OCBAQCBz bHBlZWxfdHJlZV9kdXBsaWNhdGVfbG9vcF90b19lZGdlX2NmZyAoY2xhc3MgbG9vcCAqbG9vcCwg ZWRnZSBsb29wX2V4aXQsCiAJIHByZWhlYWRlciBibG9jayBhbmQgc3RpbGwgZmluZCB0aGUgcmln aHQgTEMgbm9kZXMuICAqLwogICAgICAgZWRnZSBsb29wX2VudHJ5ID0gc2luZ2xlX3N1Y2NfZWRn ZSAobmV3X3ByZWhlYWRlcik7CiAgICAgICBpZiAoZmxvd19sb29wcykKLQlmb3IgKGF1dG8gZ3Np X2Zyb20gPSBnc2lfc3RhcnRfcGhpcyAobG9vcC0+aGVhZGVyKSwKLQkgICAgIGdzaV90byA9IGdz aV9zdGFydF9waGlzIChuZXdfbG9vcC0+aGVhZGVyKTsKLQkgICAgICFnc2lfZW5kX3AgKGdzaV9m cm9tKSAmJiAhZ3NpX2VuZF9wIChnc2lfdG8pOwotCSAgICAgZ3NpX25leHQgKCZnc2lfZnJvbSks IGdzaV9uZXh0ICgmZ3NpX3RvKSkKLQkgIHsKLQkgICAgZ2ltcGxlICpmcm9tX3BoaSA9IGdzaV9z dG10IChnc2lfZnJvbSk7Ci0JICAgIGdpbXBsZSAqdG9fcGhpID0gZ3NpX3N0bXQgKGdzaV90byk7 Ci0JICAgIHRyZWUgbmV3X2FyZyA9IFBISV9BUkdfREVGX0ZST01fRURHRSAoZnJvbV9waGksCi0J CQkJCQkgIGxvb3BfbGF0Y2hfZWRnZSAobG9vcCkpOworCXsKKwkgIC8qIExpbmsgdGhyb3VnaCB0 aGUgbWFpbiBleGl0IGZpcnN0LiAgKi8KKwkgIGZvciAoYXV0byBnc2lfZnJvbSA9IGdzaV9zdGFy dF9waGlzIChsb29wLT5oZWFkZXIpLAorCSAgICAgICBnc2lfdG8gPSBnc2lfc3RhcnRfcGhpcyAo bmV3X2xvb3AtPmhlYWRlcik7CisJICAgICAgICFnc2lfZW5kX3AgKGdzaV9mcm9tKSAmJiAhZ3Np X2VuZF9wIChnc2lfdG8pOworCSAgICAgICBnc2lfbmV4dCAoJmdzaV9mcm9tKSwgZ3NpX25leHQg KCZnc2lfdG8pKQorCSAgICB7CisJICAgICAgZ2ltcGxlICpmcm9tX3BoaSA9IGdzaV9zdG10IChn c2lfZnJvbSk7CisJICAgICAgZ2ltcGxlICp0b19waGkgPSBnc2lfc3RtdCAoZ3NpX3RvKTsKKwkg ICAgICB0cmVlIG5ld19hcmcgPSBQSElfQVJHX0RFRl9GUk9NX0VER0UgKGZyb21fcGhpLAorCQkJ CQkJICAgIGxvb3BfbGF0Y2hfZWRnZSAobG9vcCkpOwogCi0JICAgIC8qIENoZWNrIGlmIHdlJ3Zl IGFscmVhZHkgY3JlYXRlZCBhIG5ldyBwaGkgbm9kZSBkdXJpbmcgZWRnZQotCSAgICAgICByZWRp cmVjdGlvbi4gIElmIHdlIGhhdmUsIG9ubHkgcHJvcGFnYXRlIHRoZSB2YWx1ZSBkb3dud2FyZHMu ICAqLwotCSAgICBpZiAodHJlZSAqcmVzID0gbmV3X3BoaV9hcmdzLmdldCAobmV3X2FyZykpCi0J ICAgICAgewotCQlhZGp1c3RfcGhpX2FuZF9kZWJ1Z19zdG10cyAodG9fcGhpLCBsb29wX2VudHJ5 LCAqcmVzKTsKLQkJY29udGludWU7Ci0JICAgICAgfQorCSAgICAgIC8qIENoZWNrIGlmIHdlJ3Zl IGFscmVhZHkgY3JlYXRlZCBhIG5ldyBwaGkgbm9kZSBkdXJpbmcgZWRnZQorCQkgcmVkaXJlY3Rp b24uICBJZiB3ZSBoYXZlLCBvbmx5IHByb3BhZ2F0ZSB0aGUgdmFsdWUKKwkJIGRvd253YXJkcy4g ICovCisJICAgICAgaWYgKHRyZWUgKnJlcyA9IG5ld19waGlfYXJncy5nZXQgKG5ld19hcmcpKQor CQluZXdfYXJnID0gKnJlczsKIAotCSAgICB0cmVlIG5ld19yZXMgPSBjb3B5X3NzYV9uYW1lIChn aW1wbGVfcGhpX3Jlc3VsdCAoZnJvbV9waGkpKTsKLQkgICAgZ3BoaSAqbGNzc2FfcGhpID0gY3Jl YXRlX3BoaV9ub2RlIChuZXdfcmVzLCBuZXdfcHJlaGVhZGVyKTsKKwkgICAgICB0cmVlIG5ld19y ZXMgPSBjb3B5X3NzYV9uYW1lIChnaW1wbGVfcGhpX3Jlc3VsdCAoZnJvbV9waGkpKTsKKwkgICAg ICBncGhpICpsY3NzYV9waGkgPSBjcmVhdGVfcGhpX25vZGUgKG5ld19yZXMsIG5ld19wcmVoZWFk ZXIpOwogCi0JICAgIC8qIE1haW4gbG9vcCBleGl0IHNob3VsZCB1c2UgdGhlIGZpbmFsIGl0ZXIg dmFsdWUuICAqLwotCSAgICBhZGRfcGhpX2FyZyAobGNzc2FfcGhpLCBuZXdfYXJnLCBsb29wX2V4 aXQsIFVOS05PV05fTE9DQVRJT04pOworCSAgICAgIC8qIE1haW4gbG9vcCBleGl0IHNob3VsZCB1 c2UgdGhlIGZpbmFsIGl0ZXIgdmFsdWUuICAqLworCSAgICAgIFNFVF9QSElfQVJHX0RFRiAobGNz c2FfcGhpLCBsb29wX2V4aXQtPmRlc3RfaWR4LCBuZXdfYXJnKTsKIAotCSAgICBhZGp1c3RfcGhp X2FuZF9kZWJ1Z19zdG10cyAodG9fcGhpLCBsb29wX2VudHJ5LCBuZXdfcmVzKTsKLQkgIH0KKwkg ICAgICBhZGp1c3RfcGhpX2FuZF9kZWJ1Z19zdG10cyAodG9fcGhpLCBsb29wX2VudHJ5LCBuZXdf cmVzKTsKKwkgICAgfQogCi0gICAgICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlO QVRPUlMsIG5ld19wcmVoZWFkZXIsIGUtPnNyYyk7CisJICBzZXRfaW1tZWRpYXRlX2RvbWluYXRv ciAoQ0RJX0RPTUlOQVRPUlMsIG1haW5fbG9vcF9leGl0X2Jsb2NrLCBsb29wX2V4aXQtPnNyYyk7 CisJICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIG5ld19wcmVoZWFk ZXIsIG1haW5fbG9vcF9leGl0X2Jsb2NrKTsKKworCSAgLyogTm93IGxpbmsgdGhlIGFsdGVybmF0 aXZlIGV4aXRzLiAgKi8KKwkgIGlmIChtdWx0aXBsZV9leGl0c19wKQorCSAgICB7CisJICAgICAg Zm9yIChhdXRvIGdzaV9mcm9tID0gZ3NpX3N0YXJ0X3BoaXMgKGxvb3AtPmhlYWRlciksCisJCSAg IGdzaV90byA9IGdzaV9zdGFydF9waGlzIChuZXdfcHJlaGVhZGVyKTsKKwkJICAgIWdzaV9lbmRf cCAoZ3NpX2Zyb20pICYmICFnc2lfZW5kX3AgKGdzaV90byk7CisJCSAgIGdzaV9uZXh0ICgmZ3Np X2Zyb20pLCBnc2lfbmV4dCAoJmdzaV90bykpCisJCXsKKwkJICBnaW1wbGUgKmZyb21fcGhpID0g Z3NpX3N0bXQgKGdzaV9mcm9tKTsKKwkJICBnaW1wbGUgKnRvX3BoaSA9IGdzaV9zdG10IChnc2lf dG8pOworCisJCSAgdHJlZSBhbHRfYXJnID0gZ2ltcGxlX3BoaV9yZXN1bHQgKGZyb21fcGhpKTsK KwkJICBlZGdlIG1haW5fZSA9IHNpbmdsZV9zdWNjX2VkZ2UgKGFsdF9sb29wX2V4aXRfYmxvY2sp OworCQkgIGZvciAoZWRnZSBlIDogbG9vcF9leGl0cykKKwkJICAgIGlmIChlICE9IGxvb3BfZXhp dCkKKwkJICAgICAgU0VUX1BISV9BUkdfREVGICh0b19waGksIG1haW5fZS0+ZGVzdF9pZHgsIGFs dF9hcmcpOworCQl9CisKKwkgICAgICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlO QVRPUlMsIG5ld19wcmVoZWFkZXIsCisJCQkJICAgICAgIGxvb3AtPmhlYWRlcik7CisJICAgIH0K Kwl9CiAKICAgICAgIGlmICh3YXNfaW1tX2RvbSB8fCBkdXBsaWNhdGVfb3V0ZXJfbG9vcCkKIAlz ZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIGV4aXRfZGVzdCwgbmV3X2V4 aXQtPnNyYyk7CkBAIC0xNjM0LDYgKzE2ODgsMjEgQEAgc2xwZWVsX3RyZWVfZHVwbGljYXRlX2xv b3BfdG9fZWRnZV9jZmcgKGNsYXNzIGxvb3AgKmxvb3AsIGVkZ2UgbG9vcF9leGl0LAogICAgICAg ZGVsZXRlX2Jhc2ljX2Jsb2NrIChwcmVoZWFkZXIpOwogICAgICAgc2V0X2ltbWVkaWF0ZV9kb21p bmF0b3IgKENESV9ET01JTkFUT1JTLCBzY2FsYXJfbG9vcC0+aGVhZGVyLAogCQkJICAgICAgIGxv b3BfcHJlaGVhZGVyX2VkZ2UgKHNjYWxhcl9sb29wKS0+c3JjKTsKKworICAgICAgLyogRmluYWxs eSBhZnRlciB3aXJpbmcgdGhlIG5ldyBlcGlsb2d1ZSB3ZSBuZWVkIHRvIHVwZGF0ZSBpdHMgbWFp biBleGl0CisJIHRvIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBleGl0IHdlIHJlY29yZGVkLiAgT3Ro ZXIgZXhpdHMgYXJlIGFscmVhZHkKKwkgY29ycmVjdC4gICovCisgICAgICBpZiAobXVsdGlwbGVf ZXhpdHNfcCkKKwl7CisJICB1cGRhdGVfbG9vcCA9IG5ld19sb29wOworCSAgZm9yIChlZGdlIGUg OiBnZXRfbG9vcF9leGl0X2VkZ2VzIChsb29wKSkKKwkgICAgZG9tcy5zYWZlX3B1c2ggKGUtPmRl c3QpOworCSAgZG9tcy5zYWZlX3B1c2ggKGV4aXRfZGVzdCk7CisKKwkgIC8qIExpa2VseSBhIGZh bGwtdGhyb3VnaCBlZGdlLCBzbyB1cGRhdGUgaWYgbmVlZGVkLiAgKi8KKwkgIGlmIChzaW5nbGVf c3VjY19wIChleGl0X2Rlc3QpKQorCSAgICBkb21zLnNhZmVfcHVzaCAoc2luZ2xlX3N1Y2MgKGV4 aXRfZGVzdCkpOworCX0KICAgICB9CiAgIGVsc2UgLyogQWRkIHRoZSBjb3B5IGF0IGVudHJ5LiAg Ki8KICAgICB7CkBAIC0xNjgxLDYgKzE3NTAsMzQgQEAgc2xwZWVsX3RyZWVfZHVwbGljYXRlX2xv b3BfdG9fZWRnZV9jZmcgKGNsYXNzIGxvb3AgKmxvb3AsIGVkZ2UgbG9vcF9leGl0LAogICAgICAg ZGVsZXRlX2Jhc2ljX2Jsb2NrIChuZXdfcHJlaGVhZGVyKTsKICAgICAgIHNldF9pbW1lZGlhdGVf ZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywgbmV3X2xvb3AtPmhlYWRlciwKIAkJCSAgICAgICBs b29wX3ByZWhlYWRlcl9lZGdlIChuZXdfbG9vcCktPnNyYyk7CisKKyAgICAgIGlmIChtdWx0aXBs ZV9leGl0c19wKQorCXVwZGF0ZV9sb29wID0gbG9vcDsKKyAgICB9CisKKyAgaWYgKG11bHRpcGxl X2V4aXRzX3ApCisgICAgeworICAgICAgZm9yIChlZGdlIGUgOiBnZXRfbG9vcF9leGl0X2VkZ2Vz ICh1cGRhdGVfbG9vcCkpCisJeworCSAgZWRnZSBleDsKKwkgIGVkZ2VfaXRlcmF0b3IgZWk7CisJ ICBGT1JfRUFDSF9FREdFIChleCwgZWksIGUtPmRlc3QtPnN1Y2NzKQorCSAgICB7CisJICAgICAg LyogRmluZCB0aGUgZmlyc3Qgbm9uLWZhbGx0aHJvdWdoIGJsb2NrIGFzIGZhbGwtdGhyb3VnaHMg Y2FuJ3QKKwkJIGRvbWluYXRlIG90aGVyIGJsb2Nrcy4gICovCisJICAgICAgaWYgKHNpbmdsZV9z dWNjX3AgKGV4LT5kZXN0KSkKKwkJeworCQkgIGRvbXMuc2FmZV9wdXNoIChleC0+ZGVzdCk7CisJ CSAgZXggPSBzaW5nbGVfc3VjY19lZGdlIChleC0+ZGVzdCk7CisJCX0KKwkgICAgICBkb21zLnNh ZmVfcHVzaCAoZXgtPmRlc3QpOworCSAgICB9CisJICBkb21zLnNhZmVfcHVzaCAoZS0+ZGVzdCk7 CisJfQorCisgICAgICBpdGVyYXRlX2ZpeF9kb21pbmF0b3JzIChDRElfRE9NSU5BVE9SUywgZG9t cywgZmFsc2UpOworICAgICAgaWYgKHVwZGF0ZWRfZG9tcykKKwl1cGRhdGVkX2RvbXMtPnNhZmVf c3BsaWNlIChkb21zKTsKICAgICB9CiAKICAgZnJlZSAobmV3X2Jicyk7CmRpZmYgLS1naXQgYS9n Y2MvdHJlZS12ZWN0b3JpemVyLmggYi9nY2MvdHJlZS12ZWN0b3JpemVyLmgKaW5kZXggYjVlMjdk MWM0NmQ5Y2IzZGZlNWI0NGYxYjQ5YzllNDIwNDU3MmZmMS4uMzlhYTRkMTI1MGVmZTMwOGFjY2Nm NDg0ZDM3MGY4YWRmZDFiYTg0MyAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdG9yaXplci5oCisr KyBiL2djYy90cmVlLXZlY3Rvcml6ZXIuaApAQCAtMTgyMSw3ICsxODIxLDcgQEAgaXNfbG9vcF9o ZWFkZXJfYmJfcCAoYmFzaWNfYmxvY2sgYmIpCiB7CiAgIGlmIChiYiA9PSAoYmItPmxvb3BfZmF0 aGVyKS0+aGVhZGVyKQogICAgIHJldHVybiB0cnVlOwotICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChF REdFX0NPVU5UIChiYi0+cHJlZHMpID09IDEpOworCiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAt MjIxMiw3ICsyMjEyLDggQEAgZXh0ZXJuIGJvb2wgc2xwZWVsX2Nhbl9kdXBsaWNhdGVfbG9vcF9w IChjb25zdCBjbGFzcyBsb29wICosIGNvbnN0X2VkZ2UsCiAJCQkJCSBjb25zdF9lZGdlKTsKIGNs YXNzIGxvb3AgKnNscGVlbF90cmVlX2R1cGxpY2F0ZV9sb29wX3RvX2VkZ2VfY2ZnIChjbGFzcyBs b29wICosIGVkZ2UsCiAJCQkJCQkgICAgY2xhc3MgbG9vcCAqLCBlZGdlLAotCQkJCQkJICAgIGVk Z2UsIGVkZ2UgKiwgYm9vbCA9IHRydWUpOworCQkJCQkJICAgIGVkZ2UsIGVkZ2UgKiwgYm9vbCA9 IHRydWUsCisJCQkJCQkgICAgdmVjPGJhc2ljX2Jsb2NrPiAqID0gTlVMTCk7CiBjbGFzcyBsb29w ICp2ZWN0X2xvb3BfdmVyc2lvbmluZyAobG9vcF92ZWNfaW5mbywgZ2ltcGxlICopOwogZXh0ZXJu IGNsYXNzIGxvb3AgKnZlY3RfZG9fcGVlbGluZyAobG9vcF92ZWNfaW5mbywgdHJlZSwgdHJlZSwK IAkJCQkgICAgdHJlZSAqLCB0cmVlICosIHRyZWUgKiwgaW50LCBib29sLCBib29sLAo= --_002_VI1PR08MB532511AC1FC7C80593B911B9FFB4AVI1PR08MB5325eurp_--