From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16496 invoked by alias); 23 Feb 2016 15:10:22 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 16473 invoked by uid 89); 23 Feb 2016 15:10:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_20,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=intval, INTVAL, Chain, ok X-HELO: mail-vk0-f51.google.com Received: from mail-vk0-f51.google.com (HELO mail-vk0-f51.google.com) (209.85.213.51) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 23 Feb 2016 15:10:18 +0000 Received: by mail-vk0-f51.google.com with SMTP id k196so165096093vka.0 for ; Tue, 23 Feb 2016 07:10:18 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=FtijYMd3vSv+3H/Himz9CE93CRVb4z3gvtNTYBdPSJM=; b=RUzGa5STkhNpgHgDlMf+z4g595AQyDcYpYqgiPiGXYJbQ9uSpoF31Zm7QnTws6ehFP 5nW16fN/lBWu6t42rcWk0Jkh4kzar1VVhf9EL9OssxnhIsTwZTGufnta5UPpmVsatgnw 3cfLnN23QxL2wcn8SWJET3Ysx7SJRv4Q4wGuutZldRC0dtOuZ9TVGQYH6a1SYIZqhC44 Hxt5BaQL+C/qIMvzQrvEymHirKV+HXXhgTqdaJDhJZUdbKhPVLs4/0OQDPQI8tu2VdOI VvUsLZ3DcB8bl1IEti6AX4b+yd47+391NiujfeDHfOGizo6mcAarOcDhc0hOlhQyGpog 31eQ== X-Gm-Message-State: AG10YOSs1Ge0rnLpVZ/8TPAra9+O0I9IxAmuboA5Bfx6cn65uPtbi07gFn/kOL1eGTqRAbNPnCnmXCOlrUISuw== MIME-Version: 1.0 X-Received: by 10.31.168.76 with SMTP id r73mr28516349vke.117.1456240216351; Tue, 23 Feb 2016 07:10:16 -0800 (PST) Received: by 10.103.46.65 with HTTP; Tue, 23 Feb 2016 07:10:16 -0800 (PST) In-Reply-To: <56C7962A.4010508@redhat.com> References: <56BC34CE.20100@redhat.com> <56BD189A.1040409@redhat.com> <56C7962A.4010508@redhat.com> Date: Tue, 23 Feb 2016 15:10:00 -0000 Message-ID: Subject: Re: [PATCH PR69052]Check if loop inv can be propagated into mem ref with additional addr expr canonicalization From: "Bin.Cheng" To: Jeff Law Cc: Bin Cheng , "gcc-patches@gcc.gnu.org" , nd Content-Type: multipart/mixed; boundary=001a11415bc0cdc7ab052c715854 X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg01588.txt.bz2 --001a11415bc0cdc7ab052c715854 Content-Type: text/plain; charset=UTF-8 Content-length: 2729 On Fri, Feb 19, 2016 at 10:24 PM, Jeff Law wrote: > On 02/16/2016 11:43 AM, Bin Cheng wrote: >> >> ________________________________________ >> From: Jeff Law >> Sent: 11 February 2016 23:26 >> To: Bin.Cheng >> Cc: Bin Cheng; gcc-patches@gcc.gnu.org; nd >> Subject: Re: [PATCH PR69052]Check if loop inv can be propagated into mem >> ref with additional addr expr canonicalization >> >>>> On 02/11/2016 10:59 AM, Bin.Cheng wrote: >> >> >>>> Hi Jeff, >>>> Thanks for detailed review. I also think a generic canonical >>>> interface for RTL is much better. I will give it a try. But with >>>> high chance it's a next stage1 stuff. >>> >>> That is, of course, fine. However, if you do get something ready, I'd >>> support using it within LICM for gcc-6, then using it in other places >>> for gcc-7. >> >> Hi, >> This is the updated version patch. It fixes the problem by introducing a >> generic address canonicalization interface. This new interface >> canonicalizes address expression in following steps: >> 1) Rewrite ASHIFT into MULT recursively. >> 2) Divide address into sub expressions with PLUS as the separator. >> 3) Sort sub expressions according to precedence defined for >> communative operations. >> 4) Simplify CONST_INT_P sub expressions. >> 5) Create new canonicalized address and return. >> >> According to review comments, this interface is now restricted in LCIM, >> and will probably be expanded to other passes like fwprop and combine after >> entering GCC7. >> Bootstrap and test on x86_64 and AArch64. Is it OK? >> >> Thanks, >> bin >> >> 2016-02-15 Bin Cheng >> >> PR tree-optimization/69052 >> * loop-invariant.c (canonicalize_address_mult): New function. >> (MAX_CANON_ADDR_PARTS): New macro. >> (collect_address_parts): New function. >> (compare_address_parts, canonicalize_address): New functions. >> (inv_can_prop_to_addr_use): Check validity of address expression >> which is canonicalized by above canonicalize_address. >> >> gcc/testsuite/ChangeLog >> 2016-02-15 Bin Cheng >> >> PR tree-optimization/69052 >> * gcc.target/i386/pr69052.c: New test. > > This is exactly what I was looking for from a design standpoint. > > My only question is why didn't you use FOR_EACH_SUBRTX_VRA from rtl-iter.h > to walk the RTX expressions in collect_address_parts and > canonicalize_address_mult? Hi Jeff, Here comes the updated patch using FOR_EACH_SUBRTX_VAR in both functions you mentioned. Bootstrap and test on x86_64 and AArch64, is it OK? The ChangeLog isn't affected. Thanks, bin > > Jeff > > >> >>> >>> Jeff >> >> > --001a11415bc0cdc7ab052c715854 Content-Type: text/plain; charset=US-ASCII; name="pr69052-20160222.txt" Content-Disposition: attachment; filename="pr69052-20160222.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ikzjsxo80 Content-length: 9500 ZGlmZiAtLWdpdCBhL2djYy9sb29wLWludmFyaWFudC5jIGIvZ2NjL2xvb3At aW52YXJpYW50LmMKaW5kZXggNzA3ZjA0NC4uZGNiZTkzMiAxMDA2NDQKLS0t IGEvZ2NjL2xvb3AtaW52YXJpYW50LmMKKysrIGIvZ2NjL2xvb3AtaW52YXJp YW50LmMKQEAgLTUyLDYgKzUyLDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0 aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJjZmds b29wLmgiCiAjaW5jbHVkZSAiZXhwci5oIgogI2luY2x1ZGUgInBhcmFtcy5o IgorI2luY2x1ZGUgInJ0bC1pdGVyLmgiCiAjaW5jbHVkZSAiZHVtcGZpbGUu aCIKIAogLyogVGhlIGRhdGEgc3RvcmVkIGZvciB0aGUgbG9vcC4gICovCkBA IC03NTQsNiArNzU1LDEzMCBAQCBjcmVhdGVfbmV3X2ludmFyaWFudCAoc3Ry dWN0IGRlZiAqZGVmLCBydHhfaW5zbiAqaW5zbiwgYml0bWFwIGRlcGVuZHNf b24sCiAgIHJldHVybiBpbnY7CiB9CiAKKy8qIFJldHVybiBhIGNhbm9uaWNh bCB2ZXJzaW9uIG9mIFggZm9yIHRoZSBhZGRyZXNzLCBmcm9tIHRoZSBwb2lu dCBvZiB2aWV3LAorICAgdGhhdCBhbGwgbXVsdGlwbGljYXRpb25zIGFyZSBy ZXByZXNlbnRlZCBhcyBNVUxUIGluc3RlYWQgb2YgdGhlIG11bHRpcGx5Cisg ICBieSBhIHBvd2VyIG9mIDIgYmVpbmcgcmVwcmVzZW50ZWQgYXMgQVNISUZU LgorCisgICBDYWxsZXJzIHNob3VsZCBwcmVwYXJlIGEgY29weSBvZiBYIGJl Y2F1c2UgdGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IGl0CisgICBpbiBwbGFj ZS4gICovCisKK3N0YXRpYyB2b2lkCitjYW5vbmljYWxpemVfYWRkcmVzc19t dWx0IChydHggeCkKK3sKKyAgc3VicnR4X3Zhcl9pdGVyYXRvcjo6YXJyYXlf dHlwZSBhcnJheTsKKyAgRk9SX0VBQ0hfU1VCUlRYX1ZBUiAoaXRlciwgYXJy YXksIHgsIE5PTkNPTlNUKQorICAgIHsKKyAgICAgIHJ0eCBzdWIgPSAqaXRl cjsKKworICAgICAgaWYgKEdFVF9DT0RFIChzdWIpID09IEFTSElGVAorCSAg JiYgQ09OU1RfSU5UX1AgKFhFWFAgKHN1YiwgMSkpCisJICAmJiBJTlRWQUwg KFhFWFAgKHN1YiwgMSkpIDwgR0VUX01PREVfQklUU0laRSAoR0VUX01PREUg KHN1YikpCisJICAmJiBJTlRWQUwgKFhFWFAgKHN1YiwgMSkpID49IDApCisJ eworCSAgSE9TVF9XSURFX0lOVCBzaGlmdCA9IElOVFZBTCAoWEVYUCAoc3Vi LCAxKSk7CisJICBQVVRfQ09ERSAoc3ViLCBNVUxUKTsKKwkgIFhFWFAgKHN1 YiwgMSkgPSBnZW5faW50X21vZGUgKChIT1NUX1dJREVfSU5UKSAxIDw8IHNo aWZ0LAorCQkJCQlHRVRfTU9ERSAoc3ViKSk7CisJICBpdGVyLnNraXBfc3Vi cnR4ZXMgKCk7CisJfQorICAgIH0KK30KKworLyogTWF4aW11bSBudW1iZXIg b2Ygc3ViIGV4cHJlc3Npb25zIGluIGFkZHJlc3MuICBXZSBzZXQgaXQgdG8K KyAgIGEgc21hbGwgaW50ZWdlciBzaW5jZSBpdCdzIHVubGlrZWx5IHRvIGhh dmUgYSBjb21wbGljYXRlZAorICAgYWRkcmVzcyBleHByZXNzaW9uLiAgKi8K KworI2RlZmluZSBNQVhfQ0FOT05fQUREUl9QQVJUUyAoNSkKKworLyogQ29s bGVjdCBzdWIgZXhwcmVzc2lvbnMgaW4gYWRkcmVzcyBYIHdpdGggUExVUyBh cyB0aGUgc2VwZXJhdG9yLgorICAgU3ViIGV4cHJlc3Npb25zIGFyZSBzdG9y ZWQgaW4gdmVjdG9yIEFERFJfUEFSVFMuICAqLworCitzdGF0aWMgdm9pZAor Y29sbGVjdF9hZGRyZXNzX3BhcnRzIChydHggeCwgdmVjPHJ0eD4gKmFkZHJf cGFydHMpCit7CisgIHN1YnJ0eF92YXJfaXRlcmF0b3I6OmFycmF5X3R5cGUg YXJyYXk7CisgIEZPUl9FQUNIX1NVQlJUWF9WQVIgKGl0ZXIsIGFycmF5LCB4 LCBOT05DT05TVCkKKyAgICB7CisgICAgICBydHggc3ViID0gKml0ZXI7CisK KyAgICAgIGlmIChHRVRfQ09ERSAoc3ViKSAhPSBQTFVTKQorCXsKKwkgIGFk ZHJfcGFydHMtPnNhZmVfcHVzaCAoc3ViKTsKKwkgIGl0ZXIuc2tpcF9zdWJy dHhlcyAoKTsKKwl9CisgICAgfQorfQorCisvKiBDb21wYXJlIGZ1bmN0aW9u IGZvciBzb3J0aW5nIHN1YiBleHByZXNzaW9ucyBYIGFuZCBZIGJhc2VkIG9u CisgICBwcmVjZWRlbmNlIGRlZmluZWQgZm9yIGNvbW11bml0aXZlIG9wZXJh dGlvbnMuICAqLworCitzdGF0aWMgaW50Citjb21wYXJlX2FkZHJlc3NfcGFy dHMgKGNvbnN0IHZvaWQgKngsIGNvbnN0IHZvaWQgKnkpCit7CisgIGNvbnN0 IHJ0eCAqcnggPSAoY29uc3QgcnR4ICopeDsKKyAgY29uc3QgcnR4ICpyeSA9 IChjb25zdCBydHggKil5OworICBpbnQgcHggPSBjb21tdXRhdGl2ZV9vcGVy YW5kX3ByZWNlZGVuY2UgKCpyeCk7CisgIGludCBweSA9IGNvbW11dGF0aXZl X29wZXJhbmRfcHJlY2VkZW5jZSAoKnJ5KTsKKworICByZXR1cm4gKHB5IC0g cHgpOworfQorCisvKiBSZXR1cm4gYSBjYW5vbmljYWwgdmVyc2lvbiBhZGRy ZXNzIGZvciBYIGJ5IGZvbGxvd2luZyBzdGVwczoKKyAgICAgMSkgUmV3cml0 ZSBBU0hJRlQgaW50byBNVUxUIHJlY3Vyc2l2ZWx5LgorICAgICAyKSBEaXZp ZGUgYWRkcmVzcyBpbnRvIHN1YiBleHByZXNzaW9ucyB3aXRoIFBMVVMgYXMg dGhlCisJc2VwYXJhdG9yLgorICAgICAzKSBTb3J0IHN1YiBleHByZXNzaW9u cyBhY2NvcmRpbmcgdG8gcHJlY2VkZW5jZSBkZWZpbmVkCisJZm9yIGNvbW11 bmF0aXZlIG9wZXJhdGlvbnMuCisgICAgIDQpIFNpbXBsaWZ5IENPTlNUX0lO VF9QIHN1YiBleHByZXNzaW9ucy4KKyAgICAgNSkgQ3JlYXRlIG5ldyBjYW5v bmljYWxpemVkIGFkZHJlc3MgYW5kIHJldHVybi4KKyAgIENhbGxlcnMgc2hv dWxkIHByZXBhcmUgYSBjb3B5IG9mIFggYmVjYXVzZSB0aGlzIGZ1bmN0aW9u IG1heQorICAgbW9kaWZ5IGl0IGluIHBsYWNlLiAgKi8KKworc3RhdGljIHJ0 eAorY2Fub25pY2FsaXplX2FkZHJlc3MgKHJ0eCB4KQoreworICBydHggcmVz OworICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgbWFjaGluZV9tb2RlIG1vZGUg PSBHRVRfTU9ERSAoeCk7CisgIGF1dG9fdmVjPHJ0eCwgTUFYX0NBTk9OX0FE RFJfUEFSVFM+IGFkZHJfcGFydHM7CisKKyAgLyogUmV3cml0ZSBBU0hJRlQg aW50byBNVUxULiAgKi8KKyAgY2Fub25pY2FsaXplX2FkZHJlc3NfbXVsdCAo eCk7CisgIC8qIERpdmlkZSBhZGRyZXNzIGludG8gc3ViIGV4cHJlc3Npb25z LiAgKi8KKyAgY29sbGVjdF9hZGRyZXNzX3BhcnRzICh4LCAmYWRkcl9wYXJ0 cyk7CisgIC8qIFVubGlrZWx5IHRvIGhhdmUgdmVyeSBjb21wbGljYXRlZCBh ZGRyZXNzLiAgKi8KKyAgaWYgKGFkZHJfcGFydHMubGVuZ3RoICgpIDwgMgor ICAgICAgfHwgYWRkcl9wYXJ0cy5sZW5ndGggKCkgPiBNQVhfQ0FOT05fQURE Ul9QQVJUUykKKyAgICByZXR1cm4geDsKKworICAvKiBTb3J0IHN1YiBleHBy ZXNzaW9ucyBhY2NvcmRpbmcgdG8gY2Fub25pY2FsaXphdGlvbiBwcmVjZWRl bmNlLiAgKi8KKyAgYWRkcl9wYXJ0cy5xc29ydCAoY29tcGFyZV9hZGRyZXNz X3BhcnRzKTsKKworICAvKiBTaW1wbGlmeSBhbGwgY29uc3RhbnQgaW50IHN1 bW1hcnkgaWYgcG9zc2libGUuICAqLworICBmb3IgKGkgPSAwOyBpIDwgYWRk cl9wYXJ0cy5sZW5ndGggKCk7IGkrKykKKyAgICBpZiAoQ09OU1RfSU5UX1Ag KGFkZHJfcGFydHNbaV0pKQorICAgICAgYnJlYWs7CisKKyAgZm9yIChqID0g aSArIDE7IGogPCBhZGRyX3BhcnRzLmxlbmd0aCAoKTsgaisrKQorICAgIHsK KyAgICAgIGdjY19hc3NlcnQgKENPTlNUX0lOVF9QIChhZGRyX3BhcnRzW2pd KSk7CisgICAgICBhZGRyX3BhcnRzW2ldID0gc2ltcGxpZnlfZ2VuX2JpbmFy eSAoUExVUywgbW9kZSwKKwkJCQkJICAgYWRkcl9wYXJ0c1tpXSwKKwkJCQkJ ICAgYWRkcl9wYXJ0c1tqXSk7CisgICAgfQorCisgIC8qIENoYWluIFBMVVMg b3BlcmF0b3JzIHRvIHRoZSBsZWZ0IGZvciAhQ09OU1RfSU5UX1Agc3ViIGV4 cHJlc3Npb25zLiAgKi8KKyAgcmVzID0gYWRkcl9wYXJ0c1swXTsKKyAgZm9y IChqID0gMTsgaiA8IGk7IGorKykKKyAgICByZXMgPSBzaW1wbGlmeV9nZW5f YmluYXJ5IChQTFVTLCBtb2RlLCByZXMsIGFkZHJfcGFydHNbal0pOworCisg IC8qIFBpY2t1cCB0aGUgbGFzdCBDT05TVF9JTlRfUCBzdWIgZXhwcmVzc2lv bi4gICovCisgIGlmIChpIDwgYWRkcl9wYXJ0cy5sZW5ndGggKCkpCisgICAg cmVzID0gc2ltcGxpZnlfZ2VuX2JpbmFyeSAoUExVUywgbW9kZSwgcmVzLCBh ZGRyX3BhcnRzW2ldKTsKKworICByZXR1cm4gcmVzOworfQorCiAvKiBHaXZl biBpbnZhcmlhbnQgREVGIGFuZCBpdHMgYWRkcmVzcyBVU0UsIGNoZWNrIGlm IHRoZSBjb3JyZXNwb25kaW5nCiAgICBpbnZhcmlhbnQgZXhwciBjYW4gYmUg cHJvcGFnYXRlZCBpbnRvIHRoZSB1c2Ugb3Igbm90LiAgKi8KIApAQCAtNzYx LDcgKzg4Niw3IEBAIHN0YXRpYyBib29sCiBpbnZfY2FuX3Byb3BfdG9fYWRk cl91c2UgKHN0cnVjdCBkZWYgKmRlZiwgZGZfcmVmIHVzZSkKIHsKICAgc3Ry dWN0IGludmFyaWFudCAqaW52OwotICBydHggKnBvcyA9IERGX1JFRl9SRUFM X0xPQyAodXNlKSwgZGVmX3NldDsKKyAgcnR4ICpwb3MgPSBERl9SRUZfUkVB TF9MT0MgKHVzZSksIGRlZl9zZXQsIHVzZV9zZXQ7CiAgIHJ0eF9pbnNuICp1 c2VfaW5zbiA9IERGX1JFRl9JTlNOICh1c2UpOwogICBydHhfaW5zbiAqZGVm X2luc247CiAgIGJvb2wgb2s7CkBAIC03NzgsNiArOTAzLDI5IEBAIGludl9j YW5fcHJvcF90b19hZGRyX3VzZSAoc3RydWN0IGRlZiAqZGVmLCBkZl9yZWYg dXNlKQogCiAgIHZhbGlkYXRlX3Vuc2hhcmVfY2hhbmdlICh1c2VfaW5zbiwg cG9zLCBTRVRfU1JDIChkZWZfc2V0KSwgdHJ1ZSk7CiAgIG9rID0gdmVyaWZ5 X2NoYW5nZXMgKDApOworICAvKiBUcnkgaGFyZGVyIHdpdGggY2Fub25pY2Fs aXphdGlvbiBpbiBhZGRyZXNzIGV4cHJlc3Npb24uICAqLworICBpZiAoIW9r ICYmICh1c2Vfc2V0ID0gc2luZ2xlX3NldCAodXNlX2luc24pKSAhPSBOVUxM X1JUWCkKKyAgICB7CisgICAgICBydHggc3JjLCBkZXN0LCBtZW0gPSBOVUxM X1JUWDsKKworICAgICAgc3JjID0gU0VUX1NSQyAodXNlX3NldCk7CisgICAg ICBkZXN0ID0gU0VUX0RFU1QgKHVzZV9zZXQpOworICAgICAgaWYgKE1FTV9Q IChzcmMpKQorCW1lbSA9IHNyYzsKKyAgICAgIGVsc2UgaWYgKE1FTV9QIChk ZXN0KSkKKwltZW0gPSBkZXN0OworCisgICAgICBpZiAobWVtICE9IE5VTExf UlRYCisJICAmJiAhbWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFjZV9wIChHRVRf TU9ERSAobWVtKSwKKwkJCQkJICAgWEVYUCAobWVtLCAwKSwKKwkJCQkJICAg TUVNX0FERFJfU1BBQ0UgKG1lbSkpKQorCXsKKwkgIHJ0eCBhZGRyID0gY2Fu b25pY2FsaXplX2FkZHJlc3MgKGNvcHlfcnR4IChYRVhQIChtZW0sIDApKSk7 CisJICBpZiAobWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFjZV9wIChHRVRfTU9E RSAobWVtKSwKKwkJCQkJICAgYWRkciwgTUVNX0FERFJfU1BBQ0UgKG1lbSkp KQorCSAgICBvayA9IHRydWU7CisJfQorICAgIH0KICAgY2FuY2VsX2NoYW5n ZXMgKDApOwogICByZXR1cm4gb2s7CiB9CmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY5MDUyLmMgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjY5MDUyLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0OTFlOQotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNjkwNTIuYwpA QCAtMCwwICsxLDU0IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgcGllIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1mUElFIC1waWUiIH0gKi8KKworaW50IGxvb2tf bmJpdHNbMjU2XSwgbG9vcF9zeW1bMjU2XTsKK2NvbnN0IGludCBpbmRbXSA9 IHsKKyAgMCwgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsIDE3LCAyNCwg MzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAxMiwgMTksIDI2LCAzMywgNDAs IDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwK KyAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsIDI5LCAyMiwgMTUs IDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyA1OCwgNTksIDUyLCA0NSwgMzgsIDMx LCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MworfTsK K2ludCBvdXRbMjU2XTsKK2V4dGVybiB2b2lkIGJhciAoaW50ICosIGludCAq KTsKK3ZvaWQgZm9vIChpbnQgKmwxLCBpbnQgKmwyLCBpbnQgKnYsIGludCAq djEsIGludCAqbTEsIGludCBpKQoreworICBpbnQgTCA9IGkgKyAxLCBiID0g MjA7CisgIGludCByZXN1bHQsIGs7CisKKyAgZm9yIChrID0gMTsgayA8IDY0 OyBrKyspCisgICAgeworICAgICAgaW50IGxvb2sgPSAoKChMID4+IChiIC0g OCkpKSAmICgoMSA8PCA4KSAtIDEpKTsKKyAgICAgIGludCBuYiA9IGwxW2xv b2tdOworICAgICAgaW50IGNvZGU7CisgICAgICBpbnQgcjsKKworICAgICAg aWYgKG5iKQorCXsKKwkgIGIgLT0gbmI7CisJICByZXN1bHQgPSBsMltsb29r XTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbmIgPSA5OworCSAgY29kZSA9 ICgoKEwgPj4gKGIgLT0gbmIpKSkgJiAoKDEgPDwgbmIpIC0gMSkpOworCSAg cmVzdWx0ID0gdlsoY29kZSArIHYxW25iXSldOworCX0KKyAgICAgIHIgPSBy ZXN1bHQgPj4gNDsKKyAgICAgIHJlc3VsdCAmPSAxNTsKKyAgICAgIGlmIChy ZXN1bHQpCisJeworCSAgayArPSByOworCSAgciA9ICgoKEwgPj4gKGIgLT0g cmVzdWx0KSkpICYgKCgxIDw8IHJlc3VsdCkgLSAxKSk7CisJICBpZiAociA8 ICgxIDw8IChyZXN1bHQgLSAxKSkpCisJICAgIHJlc3VsdCA9IHIgKyAoKCgt MSkgPDwgcmVzdWx0KSArIDEpOworCSAgZWxzZQorCSAgICByZXN1bHQgPSBy OworCisJICBvdXRbaW5kW2tdXSA9IHJlc3VsdDsKKwl9CisgICAgICBiYXIg KCZMLCAmYik7CisgICAgfQorfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItbm90ICJsZWFsXFsgXHRcXWluZEBHT1RPRkZcXCglXFteLFxd KlxcKSwgJSIgeyB0YXJnZXQgaWEzMiB9IH0gfSAqLwo= --001a11415bc0cdc7ab052c715854--