From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 50539 invoked by alias); 2 Jul 2019 07:41:25 -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 50505 invoked by uid 89); 2 Jul 2019 07:41:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-19.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.1 spammy=U*c X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 02 Jul 2019 07:41:21 +0000 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x627aNqQ037105 for ; Tue, 2 Jul 2019 03:41:18 -0400 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0a-001b2d01.pphosted.com with ESMTP id 2tfynayffb-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 02 Jul 2019 03:41:18 -0400 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 2 Jul 2019 08:41:15 +0100 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Tue, 2 Jul 2019 08:41:12 +0100 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x627fBhQ59637872 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 2 Jul 2019 07:41:11 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 45A8042045; Tue, 2 Jul 2019 07:41:11 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7DBB94204B; Tue, 2 Jul 2019 07:41:08 +0000 (GMT) Received: from hljs-mbp.cn.ibm.com (unknown [9.200.156.95]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 2 Jul 2019 07:41:08 +0000 (GMT) Subject: Re: [PATCH][middle-end/88784] Middle end is missing some optimizations about unsigned To: Richard Biener , Andrew Pinski Cc: Jeff Law , GCC Patches , Segher Boessenkool , wschmidt@linux.ibm.com References: <1561615913-22109-1-git-send-email-helijia@linux.ibm.com> <6fb28248-5134-cec5-5045-45253e4d2eb0@redhat.com> <6d333ccf-9905-e929-c2dc-fc611ff929f1@linux.ibm.com> From: Li Jia He Date: Tue, 02 Jul 2019 07:41:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------DA9640C8D7533D202BD4856A" x-cbid: 19070207-0020-0000-0000-0000034F657E X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19070207-0021-0000-0000-000021A2F450 Message-Id: X-IsSubscribed: yes X-SW-Source: 2019-07/txt/msg00102.txt.bz2 This is a multi-part message in MIME format. --------------DA9640C8D7533D202BD4856A Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-length: 5265 On 2019/7/1 3:30 PM, Richard Biener wrote: > On Fri, 28 Jun 2019, Andrew Pinski wrote: > >> On Thu, Jun 27, 2019 at 9:55 PM Li Jia He wrote: >>> >>> >>> >>> On 2019/6/27 11:48 PM, Jeff Law wrote: >>>> On 6/27/19 12:11 AM, Li Jia He wrote: >>>>> Hi, >>>>> >>>>> According to the optimizable case described by Qi Feng on >>>>> issue 88784, we can combine the cases into the following: >>>>> >>>>> 1. x > y && x != XXX_MIN --> x > y >>>>> 2. x > y && x == XXX_MIN --> false >>>>> 3. x <= y && x == XXX_MIN --> x == XXX_MIN >>>>> >>>>> 4. x < y && x != XXX_MAX --> x < y >>>>> 5. x < y && x == XXX_MAX --> false >>>>> 6. x >= y && x == XXX_MAX --> x == XXX_MAX >>>>> >>>>> 7. x > y || x != XXX_MIN --> x != XXX_MIN >>>>> 8. x <= y || x != XXX_MIN --> true >>>>> 9. x <= y || x == XXX_MIN --> x <= y >>>>> >>>>> 10. x < y || x != XXX_MAX --> x != UXXX_MAX >>>>> 11. x >= y || x != XXX_MAX --> true >>>>> 12. x >= y || x == XXX_MAX --> x >= y >>>>> >>>>> Note: XXX_MIN represents the minimum value of type x. >>>>> XXX_MAX represents the maximum value of type x. >>>>> >>>>> Here we don't need to care about whether the operation is >>>>> signed or unsigned. For example, in the below equation: >>>>> >>>>> 'x > y && x != XXX_MIN --> x > y' >>>>> >>>>> If the x type is signed int and XXX_MIN is INT_MIN, we can >>>>> optimize it to 'x > y'. However, if the type of x is unsigned >>>>> int and XXX_MIN is 0, we can still optimize it to 'x > y'. >>>>> >>>>> The regression testing for the patch was done on GCC mainline on >>>>> >>>>> powerpc64le-unknown-linux-gnu (Power 9 LE) >>>>> >>>>> with no regressions. Is it OK for trunk ? >>>>> >>>>> Thanks, >>>>> Lijia He >>>>> >>>>> gcc/ChangeLog >>>>> >>>>> 2019-06-27 Li Jia He >>>>> Qi Feng >>>>> >>>>> PR middle-end/88784 >>>>> * gimple-fold.c (and_comparisons_contain_equal_operands): New function. >>>>> (and_comparisons_1): Use and_comparisons_contain_equal_operands. >>>>> (or_comparisons_contain_equal_operands): New function. >>>>> (or_comparisons_1): Use or_comparisons_contain_equal_operands. >>>> Would this be better done via match.pd? ISTM this transformation would >>>> be well suited for that framework. >>> >>> Hi, Jeff >>> >>> I did this because of the following test case: >>> ` >>> _Bool comp(unsigned x, unsigned y) >>> { >>> return x > y && x != 0; >>> } >>> ` >>> The gimple file dumped on the power platform is: >>> ` >>> comp (unsigned int x, unsigned int y) >>> { >>> _Bool D.2837; >>> int iftmp.0; >>> >>> if (x > y) goto ; else goto ; >>> : >>> if (x != 0) goto ; else goto ; >>> : >>> iftmp.0 = 1; >>> goto ; >>> : >>> iftmp.0 = 0; >>> : >>> D.2837 = (_Bool) iftmp.0; >>> return D.2837; >>> } >>> ` >>> However, the gimple file dumped on x86 is >>> ` >>> comp (unsigned int x, unsigned int y) >>> { >>> _Bool D.2837; >>> >>> _1 = x > y; >>> _2 = x != 0; >>> _3 = _1 & _2; >>> _4 = (int) _3; >>> D.2837 = (_Bool) _4; >>> return D.2837; >>> } >>> ` >>> >>> The reason for the inconsistency between these two behaviors is param >>> logical-op-non-short-circuit. If we add the pattern to the match.pd >>> file, we can only optimize the situation in which the statement is in >>> the same basic block (logical-op-non-short-circuit=1, x86). But for >>> a cross-basic block (logical-op-non-short-circuit=0, power), match.pd >>> can't handle this situation. >>> >>> Another reason is that I found out maybe_fold_and_comparisons and >>> maybe_fold_or_comparisons are not only called by ifcombine pass but >>> also by reassoc pass. Using this method can basically unify param >>> logical-op-non-short-circuit=0 or 1. >> >> >> As mentioned before ifcombine pass should be using gimple-match >> instead of fold_build. Try converting ifcombine over to gimple-match >> infrastructure and add these to match.pd. > > Yes, I mentioned that in the PR. The issue is that at the moment > to combine x > y with x <= y you'd have to build GENERIC trees > for both or temporary GIMPLE assign with a SSA def (and then feed > that into the GENERIC or GIMPLE match.pd path). Hi, I did some experimentation using ‘temporary GIMPLE with a SSA def (and then feed that into the GIMPLE match.pd path’. Could we consider the code in the attachment(I did a test and the code took effect)? Thanks, Lijia He > > maybe_fold_and/or_comparisons handle two exploded binary expressions > while the current match.pd entries handle at most one exploded one > (the outermost then, either AND or OR). But it would be definitely > doable to auto-generate maybe_fold_and/or_comparisons from match.pd > patterns which is what I'd ultimatively suggest to do (in some more > generalized form maybe). Either with a separate genmatch invocation > or as part of the --gimple processing (not sure what is more feasible > here). > > I told Li Jia He that I don't expect him to do this work. > > Note I didn't review the actual patch yet. > > Thanks, > Richard. > --------------DA9640C8D7533D202BD4856A Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="match.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="match.diff" Content-length: 8109 ZGlmZiAtLWdpdCBhL2djYy9naW1wbGUtZm9sZC5jIGIvZ2NjL2dpbXBsZS1m b2xkLmMKaW5kZXggZGZiMzFhMDIwNzguLjk5NzRiNDkxNjI2IDEwMDY0NAot LS0gYS9nY2MvZ2ltcGxlLWZvbGQuYworKysgYi9nY2MvZ2ltcGxlLWZvbGQu YwpAQCAtNTc4OSw2ICs1Nzg5LDEyIEBAIGFuZF9jb21wYXJpc29uc18xIChl bnVtIHRyZWVfY29kZSBjb2RlMSwgdHJlZSBvcDFhLCB0cmVlIG9wMWIsCiAg IHJldHVybiBOVUxMX1RSRUU7CiB9CiAKK3N0YXRpYyB0cmVlCitkb192YWx1 ZWl6ZSAodHJlZSB0KQoreworICByZXR1cm4gdDsKK30KKwogLyogVHJ5IHRv IHNpbXBsaWZ5IHRoZSBBTkQgb2YgdHdvIGNvbXBhcmlzb25zLCBzcGVjaWZp ZWQgYnkKICAgIChPUDFBIENPREUxIE9QMUIpIGFuZCAoT1AyQiBDT0RFMiBP UDJCKSwgcmVzcGVjdGl2ZWx5LgogICAgSWYgdGhpcyBjYW4gYmUgc2ltcGxp ZmllZCB0byBhIHNpbmdsZSBleHByZXNzaW9uICh3aXRob3V0IHJlcXVpcmlu ZwpAQCAtNTgwMCwxMSArNTgwNiwzOSBAQCB0cmVlCiBtYXliZV9mb2xkX2Fu ZF9jb21wYXJpc29ucyAoZW51bSB0cmVlX2NvZGUgY29kZTEsIHRyZWUgb3Ax YSwgdHJlZSBvcDFiLAogCQkJICAgIGVudW0gdHJlZV9jb2RlIGNvZGUyLCB0 cmVlIG9wMmEsIHRyZWUgb3AyYikKIHsKLSAgdHJlZSB0ID0gYW5kX2NvbXBh cmlzb25zXzEgKGNvZGUxLCBvcDFhLCBvcDFiLCBjb2RlMiwgb3AyYSwgb3Ay Yik7CisgIHRyZWUgdDEgPSBmb2xkX2J1aWxkMiAoY29kZTEsIGJvb2xlYW5f dHlwZV9ub2RlLCBvcDFhLCBvcDFiKTsKKyAgdHJlZSB0MiA9IGZvbGRfYnVp bGQyIChjb2RlMiwgYm9vbGVhbl90eXBlX25vZGUsIG9wMmEsIG9wMmIpOwor CisgIHRyZWUgbmV3X2xoczEgPSBtYWtlX3NzYV9uYW1lIChUUkVFX1RZUEUg KHQxKSk7CisgIHRyZWUgbmV3X2xoczIgPSBtYWtlX3NzYV9uYW1lIChUUkVF X1RZUEUgKHQyKSk7CisKKyAgZ2Fzc2lnbiAqZ2Fzc2lnbjEgPSBnaW1wbGVf YnVpbGRfYXNzaWduIChuZXdfbGhzMSwgdDEpOworICBnYXNzaWduICpnYXNz aWduMiA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKG5ld19saHMyLCB0Mik7CisK KyAgdHJlZSB0ID0gZ2ltcGxlX3NpbXBsaWZ5IChUUlVUSF9BTkRfRVhQUiwg Ym9vbGVhbl90eXBlX25vZGUsCisJCQkgICAgZ2ltcGxlX2Fzc2lnbl9saHMg KGdhc3NpZ24xKSwKKwkJCSAgICBnaW1wbGVfYXNzaWduX2xocyAoZ2Fzc2ln bjIpLCBOVUxMLCBkb192YWx1ZWl6ZSk7CisKKyAgaWYgKCF0KQorICAgIHsK KyAgICAgIHQgPSBnaW1wbGVfc2ltcGxpZnkgKFRSVVRIX0FORF9FWFBSLCBi b29sZWFuX3R5cGVfbm9kZSwKKwkJCSAgIGdpbXBsZV9hc3NpZ25fbGhzIChn YXNzaWduMiksCisJCQkgICBnaW1wbGVfYXNzaWduX2xocyAoZ2Fzc2lnbjEp LCBOVUxMLCBkb192YWx1ZWl6ZSk7CisgICAgfQorCiAgIGlmICh0KQotICAg IHJldHVybiB0OwotICBlbHNlCi0gICAgcmV0dXJuIGFuZF9jb21wYXJpc29u c18xIChjb2RlMiwgb3AyYSwgb3AyYiwgY29kZTEsIG9wMWEsIG9wMWIpOwor ICAgIHsKKyAgICAgIGdpbXBsZSAqZGVmID0gU1NBX05BTUVfREVGX1NUTVQg KHQpOworCisgICAgICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24gKGRlZikKKwkg IHx8IFRSRUVfQ09ERV9DTEFTUyAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo ZGVmKSkgIT0gdGNjX2NvbXBhcmlzb24pCisJcmV0dXJuIE5VTExfVFJFRTsK KworICAgICAgcmV0dXJuIGZvbGRfYnVpbGQyIChnaW1wbGVfYXNzaWduX3Jo c19jb2RlIChkZWYpLCBib29sZWFuX3R5cGVfbm9kZSwKKwkJCSAgZ2ltcGxl X2Fzc2lnbl9yaHMxIChkZWYpLCBnaW1wbGVfYXNzaWduX3JoczIgKGRlZikp OworICAgIH0KKworICByZXR1cm4gTlVMTF9UUkVFOwogfQogCiAvKiBIZWxw ZXIgZnVuY3Rpb24gZm9yIG9yX2NvbXBhcmlzb25zXzE6ICB0cnkgdG8gc2lt cGxpZnkgdGhlIE9SIG9mIHRoZQpkaWZmIC0tZ2l0IGEvZ2NjL21hdGNoLnBk IGIvZ2NjL21hdGNoLnBkCmluZGV4IGY4ZTM1ZTk2ZDIyLi4yMWExNDdkMGZm MSAxMDA2NDQKLS0tIGEvZ2NjL21hdGNoLnBkCisrKyBiL2djYy9tYXRjaC5w ZApAQCAtMTg1OSw2ICsxODU5LDEwMSBAQCBERUZJTkVfSU5UX0FORF9GTE9B VF9ST1VORF9GTiAoUklOVCkKICAgICB7IHdpZGVfaW50X3RvX3RyZWUgKHR5 cGUsICh3aTo6dG9fd2lkZSAoQDEpCiAJCQkgICAgICAgJiAoYml0cG9zIC8g QklUU19QRVJfVU5JVCkpKTsgfSkpKSkKIAorLyogeCA+ICB5ICAmJiAgeCAh PSBYWFhfTUlOICAtLT4gIHggPiB5ICAqLworKGZvciBhbmQgKHRydXRoX2Fu ZCBiaXRfYW5kKQorIChzaW1wbGlmeQorICAoYW5kOmMgKGd0OmNAMyBAMCBA MSkgKG5lIEAwIElOVEVHRVJfQ1NUQDIpKQorICAoaWYgKElOVEVHUkFMX1RZ UEVfUCAoVFJFRV9UWVBFIChAMCkpICYmIElOVEVHUkFMX1RZUEVfUCAoVFJF RV9UWVBFKEAxKSkKKyAgICAgICAmJiAod2k6OmVxX3AgKHdpOjp0b193aWRl IChAMiksIHdpOjptaW5fdmFsdWUgKFRSRUVfVFlQRSAoQDIpKSkpKQorICAg IEAzKSkpCisKKy8qIHggPiAgeSAgJiYgIHggPT0gWFhYX01JTiAgLS0+ICBm YWxzZSAgKi8KKyhmb3IgYW5kICh0cnV0aF9hbmQgYml0X2FuZCkKKyAoc2lt cGxpZnkKKyAgKGFuZDpjIChndDpjIEAwIEAxKSAoZXEgQDAgSU5URUdFUl9D U1RAMikpCisgIChpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKEAw KSkgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUoQDEpKQorICAgICAg ICYmICh3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1pbl92YWx1 ZSAoVFJFRV9UWVBFIChAMikpKSkpCisgICAgeyBib29sZWFuX2ZhbHNlX25v ZGU7IH0pKSkKKworLyogeCA8PSAgeSAgJiYgIHggPT0gWFhYX01JTiAgLS0+ ICB4ID09IFhYWF9NSU4gICovCisoZm9yIGFuZCAodHJ1dGhfYW5kIGJpdF9h bmQpCisgKHNpbXBsaWZ5CisgIChhbmQ6YyAobGU6YyBAMCBAMSkgKGVxQDMg QDAgSU5URUdFUl9DU1RAMikpCisgIChpZiAoSU5URUdSQUxfVFlQRV9QIChU UkVFX1RZUEUgKEAwKSkgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUo QDEpKQorICAgICAgICYmICh3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwg d2k6Om1pbl92YWx1ZSAoVFJFRV9UWVBFIChAMikpKSkpCisgICAgQDMpKSkK KworLyogeCA8ICB5ICAmJiAgeCAhPSBYWFhfTUFYICAtLT4gIHggPCB5ICAq LworKGZvciBhbmQgKHRydXRoX2FuZCBiaXRfYW5kKQorIChzaW1wbGlmeQor ICAoYW5kOmMgKGx0OmNAMyBAMCBAMSkgKG5lIEAwIElOVEVHRVJfQ1NUQDIp KQorICAoaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChAMCkpICYm IElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFKEAxKSkKKyAgICAgICAmJiAo d2k6OmVxX3AgKHdpOjp0b193aWRlIChAMiksIHdpOjptYXhfdmFsdWUgKFRS RUVfVFlQRSAoQDIpKSkpKQorICAgIEAzKSkpCisKKy8qIHggPCAgeSAgJiYg IHggPT0gWFhYX01BWCAgLS0+ICBmYWxzZSAgKi8KKyhmb3IgYW5kICh0cnV0 aF9hbmQgYml0X2FuZCkKKyAoc2ltcGxpZnkKKyAgKGFuZDpjIChsdDpjIEAw IEAxKSAoZXEgQDAgSU5URUdFUl9DU1RAMikpCisgIChpZiAoSU5URUdSQUxf VFlQRV9QIChUUkVFX1RZUEUgKEAwKSkgJiYgSU5URUdSQUxfVFlQRV9QIChU UkVFX1RZUEUoQDEpKQorICAgICAgICYmICh3aTo6ZXFfcCAod2k6OnRvX3dp ZGUgKEAyKSwgd2k6Om1heF92YWx1ZSAoVFJFRV9UWVBFIChAMikpKSkpCisg ICAgeyBib29sZWFuX2ZhbHNlX25vZGU7IH0pKSkKKworLyogeCA+PSAgeSAg JiYgIHggPT0gWFhYX01BWCAgLS0+ICB4ID09IFhYWF9NQVggICovCisoZm9y IGFuZCAodHJ1dGhfYW5kIGJpdF9hbmQpCisgKHNpbXBsaWZ5CisgIChhbmQ6 YyAoZ2U6YyBAMCBAMSkgKGVxQDMgQDAgSU5URUdFUl9DU1RAMikpCisgIChp ZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKEAwKSkgJiYgSU5URUdS QUxfVFlQRV9QIChUUkVFX1RZUEUoQDEpKQorICAgICAgICYmICh3aTo6ZXFf cCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1heF92YWx1ZSAoVFJFRV9UWVBF IChAMikpKSkpCisgICAgQDMpKSkKKworLyogeCA+ICB5ICB8fCAgeCAhPSBY WFhfTUlOICAgLS0+ICB4ICE9IFhYWF9NSU4gICovCisoZm9yIG9yICh0cnV0 aF9vciBiaXRfaW9yKQorIChzaW1wbGlmeQorICAob3I6YyAoZ3Q6YyBAMCBA MSkgKG5lQDMgQDAgSU5URUdFUl9DU1RAMikpCisgIChpZiAoSU5URUdSQUxf VFlQRV9QIChUUkVFX1RZUEUgKEAwKSkgJiYgSU5URUdSQUxfVFlQRV9QIChU UkVFX1RZUEUoQDEpKQorICAgICAgICYmIHdpOjplcV9wICh3aTo6dG9fd2lk ZSAoQDIpLCB3aTo6bWluX3ZhbHVlIChUUkVFX1RZUEUgKEAyKSkpKQorICAg IEAzKSkpCisKKy8qIHggPD0gIHkgIHx8ICB4ICE9IFhYWF9NSU4gICAtLT4g IHRydWUgICovCisoZm9yIG9yICh0cnV0aF9vciBiaXRfaW9yKQorIChzaW1w bGlmeQorICAob3I6YyAobGU6YyBAMCBAMSkgKG5lIEAwIElOVEVHRVJfQ1NU QDIpKQorICAoaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChAMCkp ICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFKEAxKSkKKyAgICAgICAm JiB3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1pbl92YWx1ZSAo VFJFRV9UWVBFIChAMikpKSkKKyAgICB7IGJvb2xlYW5fdHJ1ZV9ub2RlOyB9 KSkpCisKKy8qIHggPD0gIHkgIHx8ICB4ID09IFhYWF9NSU4gICAtLT4gIHgg PD0geSAgKi8KKyhmb3Igb3IgKHRydXRoX29yIGJpdF9pb3IpCisgKHNpbXBs aWZ5CisgIChvcjpjIChsZTpjQDMgQDAgQDEpIChlcSBAMCBJTlRFR0VSX0NT VEAyKSkKKyAgKGlmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDAp KSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRShAMSkpCisgICAgICAg JiYgd2k6OmVxX3AgKHdpOjp0b193aWRlIChAMiksIHdpOjptaW5fdmFsdWUg KFRSRUVfVFlQRSAoQDIpKSkpCisgICAgQDMpKSkKKworLyogeCA8ICB5ICB8 fCAgeCAhPSBYWFhfTUFYICAgLS0+ICB4ICE9IFhYWF9NQVggICovCisoZm9y IG9yICh0cnV0aF9vciBiaXRfaW9yKQorIChzaW1wbGlmeQorICAob3I6YyAo bHQ6YyBAMCBAMSkgKG5lQDMgQDAgSU5URUdFUl9DU1RAMikpCisgIChpZiAo SU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKEAwKSkgJiYgSU5URUdSQUxf VFlQRV9QIChUUkVFX1RZUEUoQDEpKQorICAgICAgICYmIHdpOjplcV9wICh3 aTo6dG9fd2lkZSAoQDIpLCB3aTo6bWF4X3ZhbHVlIChUUkVFX1RZUEUgKEAy KSkpKQorICAgIEAzKSkpCisKKy8qIHggPj0gIHkgIHx8ICB4ICE9IFhYWF9N QVggICAtLT4gIHRydWUgICovCisoZm9yIG9yICh0cnV0aF9vciBiaXRfaW9y KQorIChzaW1wbGlmeQorICAob3I6YyAoZ2U6YyBAMCBAMSkgKG5lIEAwIElO VEVHRVJfQ1NUQDIpKQorICAoaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9U WVBFIChAMCkpICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFKEAxKSkK KyAgICAgICAmJiB3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1h eF92YWx1ZSAoVFJFRV9UWVBFIChAMikpKSkKKyAgICB7IGJvb2xlYW5fdHJ1 ZV9ub2RlOyB9KSkpCisKKy8qIHggPj0gIHkgIHx8ICB4ID09IFhYWF9NQVgg ICAtLT4gIHggPj0geSAgKi8KKyhmb3Igb3IgKHRydXRoX29yIGJpdF9pb3Ip CisgKHNpbXBsaWZ5CisgIChvcjpjIChnZTpjQDMgQDAgQDEpIChlcSBAMCBJ TlRFR0VSX0NTVEAyKSkKKyAgKGlmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVf VFlQRSAoQDApKSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRShAMSkp CisgICAgICAgJiYgd2k6OmVxX3AgKHdpOjp0b193aWRlIChAMiksIHdpOjpt YXhfdmFsdWUgKFRSRUVfVFlQRSAoQDIpKSkpCisgICAgQDMpKSkKIAogLyog V2UgY2FuJ3QgcmVhc3NvY2lhdGUgYXQgYWxsIGZvciBzYXR1cmF0aW5nIHR5 cGVzLiAgKi8KIChpZiAoIVRZUEVfU0FUVVJBVElORyAodHlwZSkpCg== --------------DA9640C8D7533D202BD4856A--