From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 71580 invoked by alias); 17 Aug 2015 10:01:51 -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 71566 invoked by uid 89); 17 Aug 2015 10:01:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-ob0-f169.google.com Received: from mail-ob0-f169.google.com (HELO mail-ob0-f169.google.com) (209.85.214.169) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 17 Aug 2015 10:01:48 +0000 Received: by obbop1 with SMTP id op1so108524326obb.2 for ; Mon, 17 Aug 2015 03:01:46 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.182.210.165 with SMTP id mv5mr475998obc.82.1439805706118; Mon, 17 Aug 2015 03:01:46 -0700 (PDT) Received: by 10.76.94.211 with HTTP; Mon, 17 Aug 2015 03:01:46 -0700 (PDT) In-Reply-To: References: <000401d0c918$d7a2e780$86e8b680$@arm.com> Date: Mon, 17 Aug 2015 10:06:00 -0000 Message-ID: Subject: Re: [PATCH GCC]Improve bound information in loop niter analysis From: "Bin.Cheng" To: Richard Biener Cc: Bin Cheng , GCC Patches Content-Type: multipart/mixed; boundary=001a11c24894a92dc1051d7ee340 X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg00886.txt.bz2 --001a11c24894a92dc1051d7ee340 Content-Type: text/plain; charset=UTF-8 Content-length: 3686 Thanks for all your reviews. On Fri, Aug 14, 2015 at 4:17 PM, Richard Biener wrote: > On Tue, Jul 28, 2015 at 11:36 AM, Bin Cheng wrote: >> Hi, >> Loop niter computes inaccurate bound information for different loops. This >> patch is to improve it by using loop initial condition in >> determine_value_range. Generally, loop niter is computed by subtracting >> start var from end var in loop exit condition. Moreover, loop bound is >> computed using value range information of both start and end variables. >> Basic idea of this patch is to check if loop initial condition implies more >> range information for both start/end variables. If yes, we refine range >> information and use that to compute loop bound. >> With this improvement, more accurate loop bound information is computed for >> test cases added by this patch. > > + c0 = fold_convert (type, c0); > + c1 = fold_convert (type, c1); > + > + if (operand_equal_p (var, c0, 0)) > > I believe if c0 is not already of type type operand-equal_p will never succeed. It's quite specific case targeting comparison between var and it's range bounds. Given c0 is in form of "var + offc0", then the comparison "var + offc0 != range bounds" doesn't have any useful information. Maybe useless type conversion can be handled here though, it might be even corner case. > > (side-note: we should get rid of the GMP use, that's expensive and now we > have wide-int available which should do the trick as well) > > + /* Case of comparing with the bounds of the type. */ > + if (TYPE_MIN_VALUE (type) > + && operand_equal_p (c1, TYPE_MIN_VALUE (type), 0)) > + cmp = GT_EXPR; > + if (TYPE_MAX_VALUE (type) > + && operand_equal_p (c1, TYPE_MAX_VALUE (type), 0)) > + cmp = LT_EXPR; > > don't use TYPE_MIN/MAX_VALUE. Instead use the types precision > and all wide_int operations (see match.pd wi::max_value use). Done. > > + else if (!operand_equal_p (var, varc0, 0)) > + goto end_2; > > ick - goto. We need sth like a auto_mpz class with a destructor. Label end_2 removed. > > struct auto_mpz > { > auto_mpz () { mpz_init (m_val); } > ~auto_mpz () { mpz_clear (m_val); } > mpz& operator() { return m_val; } > mpz m_val; > }; > >> Is it OK? > > I see the code follows existing practice in niter analysis even though > my overall plan was to transition its copying of value-range related > optimizations to use VRP infrastructure. Yes, I think it's easy to push it to VRP infrastructure. Actually from the name of the function, it's more vrp related. For now, the function is called only by bound_difference, not so many as vrp queries. We need cache facility in vrp otherwise it would be expensive. > > I'm still ok with improving the existing code on the basis that I won't > get to that for GCC 6. > > So - ok with the TYPE_MIN/MAX_VALUE change suggested above. > > Refactoring with auto_mpz welcome. That will be an independent patch, so I skipped it in this one. New version attached. Bootstrap and test on x86_64. Thanks, bin > > Thanks, > RIchard. > >> Thanks, >> bin >> >> 2015-07-28 Bin Cheng >> >> * tree-ssa-loop-niter.c (refine_value_range_using_guard): New. >> (determine_value_range): Call refine_value_range_using_guard for >> each loop initial condition to improve value range. >> >> gcc/testsuite/ChangeLog >> 2015-07-28 Bin Cheng >> >> * gcc.dg/tree-ssa/loop-bound-1.c: New test. >> * gcc.dg/tree-ssa/loop-bound-3.c: New test. >> * gcc.dg/tree-ssa/loop-bound-5.c: New test. --001a11c24894a92dc1051d7ee340 Content-Type: text/plain; charset=US-ASCII; name="improve-loop-bound-analysis-20150817.txt" Content-Disposition: attachment; filename="improve-loop-bound-analysis-20150817.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_idfr29df0 Content-length: 15771 SW5kZXg6IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2xvb3AtYm91 bmQtMy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL2xvb3AtYm91bmQtMy5jCShyZXZpc2lvbiAw KQorKysgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbG9vcC1ib3Vu ZC0zLmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHsgZGct ZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAt dHJlZS1pdm9wdHMtZGV0YWlscyIgfSAqLworCitpbnQgKmE7CisKK2ludAor Zm9vICh1bnNpZ25lZCBjaGFyIHMsIHVuc2lnbmVkIGNoYXIgbCkKK3sKKyAg dW5zaWduZWQgY2hhciBpOworICBpbnQgc3VtID0gMDsKKworICBmb3IgKGkg PSBzOyBpID4gbDsgaSAtPSAxKQorICAgIHsKKyAgICAgIHN1bSArPSBhW2ld OworICAgIH0KKworICByZXR1cm4gc3VtOworfQorCisvKiBDaGVjayBsb29w IG5pdGVyIGJvdW5kIGluZm9ybWF0aW9uLiAgKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcCAiYm91bmRlZCBieSAyNTQiICJpdm9wdHMiIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiYm91 bmRlZCBieSAyNTUiICJpdm9wdHMiIH0gfSAqLwpJbmRleDogZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdHJlZS1zc2EvbG9vcC1ib3VuZC01LmMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvbG9vcC1ib3VuZC01LmMJKHJldmlzaW9uIDApCisrKyBnY2MvdGVzdHN1 aXRlL2djYy5kZy90cmVlLXNzYS9sb29wLWJvdW5kLTUuYwkocmV2aXNpb24g MCkKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLWl2b3B0cy1kZXRh aWxzIiB9ICovCisKK2ludCAqYTsKKworaW50Citmb28gKHVuc2lnbmVkIGNo YXIgcykKK3sKKyAgdW5zaWduZWQgY2hhciBpOworICBpbnQgc3VtID0gMDsK KworICBmb3IgKGkgPSBzOyBpID4gMDsgaSAtPSAxKQorICAgIHsKKyAgICAg IHN1bSArPSBhW2ldOworICAgIH0KKworICByZXR1cm4gc3VtOworfQorCisv KiBDaGVjayBsb29wIG5pdGVyIGJvdW5kIGluZm9ybWF0aW9uLiAgKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiYm91bmRlZCBieSAyNTQi ICJpdm9wdHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wLW5vdCAiYm91bmRlZCBieSAyNTUiICJpdm9wdHMiIH0gfSAqLwpJbmRl eDogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbG9vcC1ib3VuZC0x LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdHJlZS1zc2EvbG9vcC1ib3VuZC0xLmMJKHJldmlzaW9uIDApCisr KyBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9sb29wLWJvdW5kLTEu YwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1kbyBj b21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVl LWl2b3B0cy1kZXRhaWxzIiB9ICovCisKK2ludCAqYTsKKworaW50Citmb28g KHVuc2lnbmVkIGNoYXIgcywgdW5zaWduZWQgY2hhciBsKQoreworICB1bnNp Z25lZCBjaGFyIGk7CisgIGludCBzdW0gPSAwOworCisgIGZvciAoaSA9IHM7 IGkgPCBsOyBpICs9IDEpCisgICAgeworICAgICAgc3VtICs9IGFbaV07Cisg ICAgfQorCisgIHJldHVybiBzdW07Cit9CisKKy8qIENoZWNrIGxvb3Agbml0 ZXIgYm91bmQgaW5mb3JtYXRpb24uICAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wICJib3VuZGVkIGJ5IDI1NCIgIml2b3B0cyIgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICJib3VuZGVk IGJ5IDI1NSIgIml2b3B0cyIgfSB9ICovCkluZGV4OiBnY2MvdHJlZS1zc2Et bG9vcC1uaXRlci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90 cmVlLXNzYS1sb29wLW5pdGVyLmMJKHJldmlzaW9uIDIyNTkxNikKKysrIGdj Yy90cmVlLXNzYS1sb29wLW5pdGVyLmMJKHdvcmtpbmcgY29weSkKQEAgLTEy Miw2ICsxMjIsMjM3IEBAIHNwbGl0X3RvX3Zhcl9hbmRfb2Zmc2V0ICh0cmVl IGV4cHIsIHRyZWUgKnZhciwgbXB6CiAgICAgfQogfQogCisvKiBGcm9tIGNv bmRpdGlvbiBDMCBDTVAgQzEgZGVyaXZlcyBpbmZvcm1hdGlvbiByZWdhcmRp bmcgdGhlIHZhbHVlIHJhbmdlCisgICBvZiBWQVIsIHdoaWNoIGlzIG9mIFRZ UEUuICBSZXN1bHRzIGFyZSBzdG9yZWQgaW4gdG8gQkVMT1cgYW5kIFVQLiAg Ki8KKworc3RhdGljIHZvaWQKK3JlZmluZV92YWx1ZV9yYW5nZV91c2luZ19n dWFyZCAodHJlZSB0eXBlLCB0cmVlIHZhciwKKwkJCQl0cmVlIGMwLCBlbnVt IHRyZWVfY29kZSBjbXAsIHRyZWUgYzEsCisJCQkJbXB6X3QgYmVsb3csIG1w el90IHVwKQoreworICB0cmVlIHZhcmMwLCB2YXJjMSwgY3R5cGU7CisgIG1w el90IG9mZmMwLCBvZmZjMTsKKyAgbXB6X3QgbWludCwgbWF4dCwgbWluYzEs IG1heGMxOworICB3aWRlX2ludCBtaW52LCBtYXh2OworICBib29sIG5vX3dy YXAgPSBub3dyYXBfdHlwZV9wICh0eXBlKTsKKyAgYm9vbCBjMF9vaywgYzFf b2s7CisgIHNpZ25vcCBzZ24gPSBUWVBFX1NJR04gKHR5cGUpOworCisgIHN3 aXRjaCAoY21wKQorICAgIHsKKyAgICBjYXNlIExUX0VYUFI6CisgICAgY2Fz ZSBMRV9FWFBSOgorICAgIGNhc2UgR1RfRVhQUjoKKyAgICBjYXNlIEdFX0VY UFI6CisgICAgICBTVFJJUF9TSUdOX05PUFMgKGMwKTsKKyAgICAgIFNUUklQ X1NJR05fTk9QUyAoYzEpOworICAgICAgY3R5cGUgPSBUUkVFX1RZUEUgKGMw KTsKKyAgICAgIGlmICghdXNlbGVzc190eXBlX2NvbnZlcnNpb25fcCAoY3R5 cGUsIHR5cGUpKQorCXJldHVybjsKKworICAgICAgYnJlYWs7CisKKyAgICBj YXNlIEVRX0VYUFI6CisgICAgICAvKiBXZSBjb3VsZCBkZXJpdmUgcXVpdGUg cHJlY2lzZSBpbmZvcm1hdGlvbiBmcm9tIEVRX0VYUFIsIGhvd2V2ZXIsCisJ IHN1Y2ggYSBndWFyZCBpcyB1bmxpa2VseSB0byBhcHBlYXIsIHNvIHdlIGRv IG5vdCBib3RoZXIgd2l0aAorCSBoYW5kbGluZyBpdC4gICovCisgICAgICBy ZXR1cm47CisKKyAgICBjYXNlIE5FX0VYUFI6CisgICAgICAvKiBORV9FWFBS IGNvbXBhcmlzb25zIGRvIG5vdCBjb250YWluIG11Y2ggb2YgdXNlZnVsIGlu Zm9ybWF0aW9uLAorCSBleGNlcHQgZm9yIGNhc2VzIG9mIGNvbXBhcmluZyB3 aXRoIGJvdW5kcy4gICovCisgICAgICBpZiAoVFJFRV9DT0RFIChjMSkgIT0g SU5URUdFUl9DU1QKKwkgIHx8ICFJTlRFR1JBTF9UWVBFX1AgKHR5cGUpKQor CXJldHVybjsKKworICAgICAgLyogRW5zdXJlIHRoYXQgdGhlIGNvbmRpdGlv biBzcGVha3MgYWJvdXQgYW4gZXhwcmVzc2lvbiBpbiB0aGUgc2FtZQorCSB0 eXBlIGFzIFggYW5kIFkuICAqLworICAgICAgY3R5cGUgPSBUUkVFX1RZUEUg KGMwKTsKKyAgICAgIGlmIChUWVBFX1BSRUNJU0lPTiAoY3R5cGUpICE9IFRZ UEVfUFJFQ0lTSU9OICh0eXBlKSkKKwlyZXR1cm47CisgICAgICBjMCA9IGZv bGRfY29udmVydCAodHlwZSwgYzApOworICAgICAgYzEgPSBmb2xkX2NvbnZl cnQgKHR5cGUsIGMxKTsKKworICAgICAgaWYgKG9wZXJhbmRfZXF1YWxfcCAo dmFyLCBjMCwgMCkpCisJeworCSAgbXB6X3QgdmFsYzE7CisKKwkgIC8qIENh c2Ugb2YgY29tcGFyaW5nIFZBUiB3aXRoIGl0cyBiZWxvdy91cCBib3VuZHMu ICAqLworCSAgbXB6X2luaXQgKHZhbGMxKTsKKwkgIHdpOjp0b19tcHogKGMx LCB2YWxjMSwgVFlQRV9TSUdOICh0eXBlKSk7CisJICBpZiAobXB6X2NtcCAo dmFsYzEsIGJlbG93KSA9PSAwKQorCSAgICBjbXAgPSBHVF9FWFBSOworCSAg aWYgKG1wel9jbXAgKHZhbGMxLCB1cCkgPT0gMCkKKwkgICAgY21wID0gTFRf RVhQUjsKKworCSAgbXB6X2NsZWFyICh2YWxjMSk7CisJfQorICAgICAgZWxz ZQorCXsKKwkgIC8qIENhc2Ugb2YgY29tcGFyaW5nIHdpdGggdGhlIGJvdW5k cyBvZiB0aGUgdHlwZS4gICovCisJICB3aWRlX2ludCBtaW4gPSB3aTo6bWlu X3ZhbHVlICh0eXBlKTsKKwkgIHdpZGVfaW50IG1heCA9IHdpOjptYXhfdmFs dWUgKHR5cGUpOworCisJICBpZiAod2k6OmVxX3AgKGMxLCBtaW4pKQorCSAg ICBjbXAgPSBHVF9FWFBSOworCSAgaWYgKHdpOjplcV9wIChjMSwgbWF4KSkK KwkgICAgY21wID0gTFRfRVhQUjsKKwl9CisKKyAgICAgIC8qIFF1aWNrIHJl dHVybiBpZiBubyB1c2VmdWwgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYg KGNtcCA9PSBORV9FWFBSKQorCXJldHVybjsKKworICAgICAgYnJlYWs7CisK KyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICAgIH0KKworICBtcHpf aW5pdCAob2ZmYzApOworICBtcHpfaW5pdCAob2ZmYzEpOworICBzcGxpdF90 b192YXJfYW5kX29mZnNldCAoZXhwYW5kX3NpbXBsZV9vcGVyYXRpb25zIChj MCksICZ2YXJjMCwgb2ZmYzApOworICBzcGxpdF90b192YXJfYW5kX29mZnNl dCAoZXhwYW5kX3NpbXBsZV9vcGVyYXRpb25zIChjMSksICZ2YXJjMSwgb2Zm YzEpOworCisgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29tcGFy aXNvbnMgb2YgZXhwcmVzc2lvbnMgYmFzZWQgb24gVkFSLiAgKi8KKyAgaWYg KG9wZXJhbmRfZXF1YWxfcCAodmFyLCB2YXJjMSwgMCkpCisgICAgeworICAg ICAgc3RkOjpzd2FwICh2YXJjMCwgdmFyYzEpOworICAgICAgbXB6X3N3YXAg KG9mZmMwLCBvZmZjMSk7CisgICAgICBjbXAgPSBzd2FwX3RyZWVfY29tcGFy aXNvbiAoY21wKTsKKyAgICB9CisgIGVsc2UgaWYgKCFvcGVyYW5kX2VxdWFs X3AgKHZhciwgdmFyYzAsIDApKQorICAgIHsKKyAgICAgIG1wel9jbGVhciAo b2ZmYzApOworICAgICAgbXB6X2NsZWFyIChvZmZjMSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgIG1wel9pbml0IChtaW50KTsKKyAgbXB6X2luaXQg KG1heHQpOworICBnZXRfdHlwZV9zdGF0aWNfYm91bmRzICh0eXBlLCBtaW50 LCBtYXh0KTsKKyAgbXB6X2luaXQgKG1pbmMxKTsKKyAgbXB6X2luaXQgKG1h eGMxKTsKKyAgLyogU2V0dXAgcmFuZ2UgaW5mb3JtYXRpb24gZm9yIHZhcmMx LiAgKi8KKyAgaWYgKGludGVnZXJfemVyb3AgKHZhcmMxKSkKKyAgICB7Cisg ICAgICB3aTo6dG9fbXB6IChpbnRlZ2VyX3plcm9fbm9kZSwgbWluYzEsIFRZ UEVfU0lHTiAodHlwZSkpOworICAgICAgd2k6OnRvX21weiAoaW50ZWdlcl96 ZXJvX25vZGUsIG1heGMxLCBUWVBFX1NJR04gKHR5cGUpKTsKKyAgICB9Cisg IGVsc2UgaWYgKFRSRUVfQ09ERSAodmFyYzEpID09IFNTQV9OQU1FCisJICAg JiYgSU5URUdSQUxfVFlQRV9QICh0eXBlKQorCSAgICYmIGdldF9yYW5nZV9p bmZvICh2YXJjMSwgJm1pbnYsICZtYXh2KSA9PSBWUl9SQU5HRSkKKyAgICB7 CisgICAgICBnY2NfYXNzZXJ0ICh3aTo6bGVfcCAobWludiwgbWF4diwgc2du KSk7CisgICAgICB3aTo6dG9fbXB6IChtaW52LCBtaW5jMSwgc2duKTsKKyAg ICAgIHdpOjp0b19tcHogKG1heHYsIG1heGMxLCBzZ24pOworICAgIH0KKyAg ZWxzZQorICAgIHsKKyAgICAgIG1wel9zZXQgKG1pbmMxLCBtaW50KTsKKyAg ICAgIG1wel9zZXQgKG1heGMxLCBtYXh0KTsKKyAgICB9CisKKyAgLyogQ29t cHV0ZSB2YWxpZCByYW5nZSBpbmZvcm1hdGlvbiBmb3IgdmFyYzEgKyBvZmZj MS4gIE5vdGUgbm90aGluZworICAgICB1c2VmdWwgY2FuIGJlIGRlcml2ZWQg aWYgaXQgb3ZlcmZsb3dzIG9yIHVuZGVyZmxvd3MuICBPdmVyZmxvdyBvcgor ICAgICB1bmRlcmZsb3cgY291bGQgaGFwcGVuIHdoZW46CisKKyAgICAgICBv ZmZjMSA+IDAgJiYgdmFyYzEgKyBvZmZjMSA+IE1BWF9WQUwgKHR5cGUpCisg ICAgICAgb2ZmYzEgPCAwICYmIHZhcmMxICsgb2ZmYzEgPCBNSU5fVkFMICh0 eXBlKS4gICovCisgIG1wel9hZGQgKG1pbmMxLCBtaW5jMSwgb2ZmYzEpOwor ICBtcHpfYWRkIChtYXhjMSwgbWF4YzEsIG9mZmMxKTsKKyAgYzFfb2sgPSAo bm9fd3JhcAorCSAgIHx8IG1wel9zZ24gKG9mZmMxKSA9PSAwCisJICAgfHwg KG1wel9zZ24gKG9mZmMxKSA8IDAgJiYgbXB6X2NtcCAobWluYzEsIG1pbnQp ID49IDApCisJICAgfHwgKG1wel9zZ24gKG9mZmMxKSA+IDAgJiYgbXB6X2Nt cCAobWF4YzEsIG1heHQpIDw9IDApKTsKKyAgaWYgKCFjMV9vaykKKyAgICBn b3RvIGVuZDsKKworICBpZiAobXB6X2NtcCAobWluYzEsIG1pbnQpIDwgMCkK KyAgICBtcHpfc2V0IChtaW5jMSwgbWludCk7CisgIGlmIChtcHpfY21wICht YXhjMSwgbWF4dCkgPiAwKQorICAgIG1wel9zZXQgKG1heGMxLCBtYXh0KTsK KworICBpZiAoY21wID09IExUX0VYUFIpCisgICAgeworICAgICAgY21wID0g TEVfRVhQUjsKKyAgICAgIG1wel9zdWJfdWkgKG1heGMxLCBtYXhjMSwgMSk7 CisgICAgfQorICBpZiAoY21wID09IEdUX0VYUFIpCisgICAgeworICAgICAg Y21wID0gR0VfRVhQUjsKKyAgICAgIG1wel9hZGRfdWkgKG1pbmMxLCBtaW5j MSwgMSk7CisgICAgfQorCisgIC8qIENvbXB1dGUgcmFuZ2UgaW5mb3JtYXRp b24gZm9yIHZhcmMwLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3csCisgICAg IHRoZSBjb25kaXRpb24gaW1wbGllZCB0aGF0CisKKyAgICAgICAodmFyYzAp IGNtcCAodmFyYzEgKyBvZmZjMSAtIG9mZmMwKQorCisgICAgIFdlIGNhbiBw b3NzaWJseSBpbXByb3ZlIHRoZSB1cHBlciBib3VuZCBvZiB2YXJjMCBpZiBj bXAgaXMgTEVfRVhQUiwKKyAgICAgb3IgdGhlIGJlbG93IGJvdW5kIGlmIGNt cCBpcyBHRV9FWFBSLgorCisgICAgIFRvIHByb3ZlIHRoZXJlIGlzIG5vIG92 ZXJmbG93L3VuZGVyZmxvdywgd2UgbmVlZCB0byBjaGVjayBiZWxvdworICAg ICBmb3VyIGNhc2VzOgorICAgICAgIDEpIGNtcCA9PSBMRV9FWFBSICYmIG9m ZmMwID4gMAorCisJICAgICh2YXJjMCArIG9mZmMwKSBkb2Vzbid0IG92ZXJm bG93CisJICAgICYmICh2YXJjMSArIG9mZmMxIC0gb2ZmYzApIGRvZXNuJ3Qg dW5kZXJmbG93CisKKyAgICAgICAyKSBjbXAgPT0gTEVfRVhQUiAmJiBvZmZj MCA8IDAKKworCSAgICAodmFyYzAgKyBvZmZjMCkgZG9lc24ndCB1bmRlcmZs b3cKKwkgICAgJiYgKHZhcmMxICsgb2ZmYzEgLSBvZmZjMCkgZG9lc24ndCBv dmVyZmxvZQorCisJICBJbiB0aGlzIGNhc2UsICh2YXJjMCArIG9mZmMwKSB3 aWxsIG5ldmVyIHVuZGVyZmxvdyBpZiB3ZSBjYW4KKwkgIHByb3ZlICh2YXJj MSArIG9mZmMxIC0gb2ZmYzApIGRvZXNuJ3Qgb3ZlcmZsb3cuCisKKyAgICAg ICAzKSBjbXAgPT0gR0VfRVhQUiAmJiBvZmZjMCA8IDAKKworCSAgICAodmFy YzAgKyBvZmZjMCkgZG9lc24ndCB1bmRlcmZsb3cKKwkgICAgJiYgKHZhcmMx ICsgb2ZmYzEgLSBvZmZjMCkgZG9lc24ndCBvdmVyZmxvdworCisgICAgICAg NCkgY21wID09IEdFX0VYUFIgJiYgb2ZmYzAgPiAwCisKKwkgICAgKHZhcmMw ICsgb2ZmYzApIGRvZXNuJ3Qgb3ZlcmZsb3cKKwkgICAgJiYgKHZhcmMxICsg b2ZmYzEgLSBvZmZjMCkgZG9lc24ndCB1bmRlcmZsb3cKKworCSAgSW4gdGhp cyBjYXNlLCAodmFyYzAgKyBvZmZjMCkgd2lsbCBuZXZlciBvdmVyZmxvdyBp ZiB3ZSBjYW4KKwkgIHByb3ZlICh2YXJjMSArIG9mZmMxIC0gb2ZmYzApIGRv ZXNuJ3QgdW5kZXJmbG93LgorCisgICAgIE5vdGUgd2Ugb25seSBoYW5kbGUg Y2FzZSAyIGFuZCA0IGluIGJlbG93IGNvZGUuICAqLworCisgIG1wel9zdWIg KG1pbmMxLCBtaW5jMSwgb2ZmYzApOworICBtcHpfc3ViIChtYXhjMSwgbWF4 YzEsIG9mZmMwKTsKKyAgYzBfb2sgPSAobm9fd3JhcAorCSAgIHx8IG1wel9z Z24gKG9mZmMwKSA9PSAwCisJICAgfHwgKGNtcCA9PSBMRV9FWFBSCisJICAg ICAgICYmIG1wel9zZ24gKG9mZmMwKSA8IDAgJiYgbXB6X2NtcCAobWF4YzEs IG1heHQpIDw9IDApCisJICAgfHwgKGNtcCA9PSBHRV9FWFBSCisJICAgICAg ICYmIG1wel9zZ24gKG9mZmMwKSA+IDAgJiYgbXB6X2NtcCAobWluYzEsIG1p bnQpID49IDApKTsKKyAgaWYgKCFjMF9vaykKKyAgICBnb3RvIGVuZDsKKwor ICBpZiAoY21wID09IExFX0VYUFIpCisgICAgeworICAgICAgaWYgKG1wel9j bXAgKHVwLCBtYXhjMSkgPiAwKQorCW1wel9zZXQgKHVwLCBtYXhjMSk7Cisg ICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG1wel9jbXAgKGJlbG93 LCBtaW5jMSkgPCAwKQorCW1wel9zZXQgKGJlbG93LCBtaW5jMSk7CisgICAg fQorCitlbmQ6CisgIG1wel9jbGVhciAobWludCk7CisgIG1wel9jbGVhciAo bWF4dCk7CisgIG1wel9jbGVhciAobWluYzEpOworICBtcHpfY2xlYXIgKG1h eGMxKTsKKyAgbXB6X2NsZWFyIChvZmZjMCk7CisgIG1wel9jbGVhciAob2Zm YzEpOworfQorCiAvKiBTdG9yZXMgZXN0aW1hdGUgb24gdGhlIG1pbmltdW0v bWF4aW11bSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBWQVIgKyBPRkYKICAg IGluIFRZUEUgdG8gTUlOIGFuZCBNQVguICAqLwogCkBAIC0xMjksNiArMzYw LDkgQEAgc3RhdGljIHZvaWQKIGRldGVybWluZV92YWx1ZV9yYW5nZSAoc3Ry dWN0IGxvb3AgKmxvb3AsIHRyZWUgdHlwZSwgdHJlZSB2YXIsIG1wel90IG9m ZiwKIAkJICAgICAgIG1wel90IG1pbiwgbXB6X3QgbWF4KQogeworICBpbnQg Y250ID0gMDsKKyAgbXB6X3QgbWlubSwgbWF4bTsKKyAgYmFzaWNfYmxvY2sg YmI7CiAgIHdpZGVfaW50IG1pbnYsIG1heHY7CiAgIGVudW0gdmFsdWVfcmFu Z2VfdHlwZSBydHlwZSA9IFZSX1ZBUllJTkc7CiAKQEAgLTE4MywzNSArNDE3 LDY5IEBAIGRldGVybWluZV92YWx1ZV9yYW5nZSAoc3RydWN0IGxvb3AgKmxv b3AsIHRyZWUgdHlwCiAJCX0KIAkgICAgfQogCX0KLSAgICAgIGlmIChydHlw ZSA9PSBWUl9SQU5HRSkKKyAgICAgIG1wel9pbml0IChtaW5tKTsKKyAgICAg IG1wel9pbml0IChtYXhtKTsKKyAgICAgIGlmIChydHlwZSAhPSBWUl9SQU5H RSkKIAl7Ci0JICBtcHpfdCBtaW5tLCBtYXhtOworCSAgbXB6X3NldCAobWlu bSwgbWluKTsKKwkgIG1wel9zZXQgKG1heG0sIG1heCk7CisJfQorICAgICAg ZWxzZQorCXsKIAkgIGdjY19hc3NlcnQgKHdpOjpsZV9wIChtaW52LCBtYXh2 LCBzZ24pKTsKLQkgIG1wel9pbml0IChtaW5tKTsKLQkgIG1wel9pbml0ICht YXhtKTsKIAkgIHdpOjp0b19tcHogKG1pbnYsIG1pbm0sIHNnbik7CiAJICB3 aTo6dG9fbXB6IChtYXh2LCBtYXhtLCBzZ24pOwotCSAgbXB6X2FkZCAobWlu bSwgbWlubSwgb2ZmKTsKLQkgIG1wel9hZGQgKG1heG0sIG1heG0sIG9mZik7 Ci0JICAvKiBJZiB0aGUgY29tcHV0YXRpb24gbWF5IG5vdCB3cmFwIG9yIG9m ZiBpcyB6ZXJvLCB0aGVuIHRoaXMKLQkgICAgIGlzIGFsd2F5cyBmaW5lLiAg SWYgb2ZmIGlzIG5lZ2F0aXZlIGFuZCBtaW52ICsgb2ZmIGlzbid0Ci0JICAg ICBzbWFsbGVyIHRoYW4gdHlwZSdzIG1pbmltdW0sIG9yIG9mZiBpcyBwb3Np dGl2ZSBhbmQKLQkgICAgIG1heHYgKyBvZmYgaXNuJ3QgYmlnZ2VyIHRoYW4g dHlwZSdzIG1heGltdW0sIHVzZSB0aGUgbW9yZQotCSAgICAgcHJlY2lzZSBy YW5nZSB0b28uICAqLwotCSAgaWYgKG5vd3JhcF90eXBlX3AgKHR5cGUpCi0J ICAgICAgfHwgbXB6X3NnbiAob2ZmKSA9PSAwCi0JICAgICAgfHwgKG1wel9z Z24gKG9mZikgPCAwICYmIG1wel9jbXAgKG1pbm0sIG1pbikgPj0gMCkKLQkg ICAgICB8fCAobXB6X3NnbiAob2ZmKSA+IDAgJiYgbXB6X2NtcCAobWF4bSwg bWF4KSA8PSAwKSkKLQkgICAgewotCSAgICAgIG1wel9zZXQgKG1pbiwgbWlu bSk7Ci0JICAgICAgbXB6X3NldCAobWF4LCBtYXhtKTsKLQkgICAgICBtcHpf Y2xlYXIgKG1pbm0pOwotCSAgICAgIG1wel9jbGVhciAobWF4bSk7Ci0JICAg ICAgcmV0dXJuOwotCSAgICB9CisJfQorICAgICAgLyogTm93IHdhbGsgdGhl IGRvbWluYXRvcnMgb2YgdGhlIGxvb3AgaGVhZGVyIGFuZCB1c2UgdGhlIGVu dHJ5CisJIGd1YXJkcyB0byByZWZpbmUgdGhlIGVzdGltYXRlcy4gICovCisg ICAgICBmb3IgKGJiID0gbG9vcC0+aGVhZGVyOworCSAgIGJiICE9IEVOVFJZ X0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4pICYmIGNudCA8IE1BWF9ET01JTkFU T1JTX1RPX1dBTEs7CisJICAgYmIgPSBnZXRfaW1tZWRpYXRlX2RvbWluYXRv ciAoQ0RJX0RPTUlOQVRPUlMsIGJiKSkKKwl7CisJICBlZGdlIGU7CisJICB0 cmVlIGMwLCBjMTsKKwkgIGdpbXBsZSBjb25kOworCSAgZW51bSB0cmVlX2Nv ZGUgY21wOworCisJICBpZiAoIXNpbmdsZV9wcmVkX3AgKGJiKSkKKwkgICAg Y29udGludWU7CisJICBlID0gc2luZ2xlX3ByZWRfZWRnZSAoYmIpOworCisJ ICBpZiAoIShlLT5mbGFncyAmIChFREdFX1RSVUVfVkFMVUUgfCBFREdFX0ZB TFNFX1ZBTFVFKSkpCisJICAgIGNvbnRpbnVlOworCisJICBjb25kID0gbGFz dF9zdG10IChlLT5zcmMpOworCSAgYzAgPSBnaW1wbGVfY29uZF9saHMgKGNv bmQpOworCSAgY21wID0gZ2ltcGxlX2NvbmRfY29kZSAoY29uZCk7CisJICBj MSA9IGdpbXBsZV9jb25kX3JocyAoY29uZCk7CisKKwkgIGlmIChlLT5mbGFn cyAmIEVER0VfRkFMU0VfVkFMVUUpCisJICAgIGNtcCA9IGludmVydF90cmVl X2NvbXBhcmlzb24gKGNtcCwgZmFsc2UpOworCisJICByZWZpbmVfdmFsdWVf cmFuZ2VfdXNpbmdfZ3VhcmQgKHR5cGUsIHZhciwgYzAsIGNtcCwgYzEsIG1p bm0sIG1heG0pOworCSAgKytjbnQ7CisJfQorCisgICAgICBtcHpfYWRkICht aW5tLCBtaW5tLCBvZmYpOworICAgICAgbXB6X2FkZCAobWF4bSwgbWF4bSwg b2ZmKTsKKyAgICAgIC8qIElmIHRoZSBjb21wdXRhdGlvbiBtYXkgbm90IHdy YXAgb3Igb2ZmIGlzIHplcm8sIHRoZW4gdGhpcworCSBpcyBhbHdheXMgZmlu ZS4gIElmIG9mZiBpcyBuZWdhdGl2ZSBhbmQgbWludiArIG9mZiBpc24ndAor CSBzbWFsbGVyIHRoYW4gdHlwZSdzIG1pbmltdW0sIG9yIG9mZiBpcyBwb3Np dGl2ZSBhbmQKKwkgbWF4diArIG9mZiBpc24ndCBiaWdnZXIgdGhhbiB0eXBl J3MgbWF4aW11bSwgdXNlIHRoZSBtb3JlCisJIHByZWNpc2UgcmFuZ2UgdG9v LiAgKi8KKyAgICAgIGlmIChub3dyYXBfdHlwZV9wICh0eXBlKQorCSAgfHwg bXB6X3NnbiAob2ZmKSA9PSAwCisJICB8fCAobXB6X3NnbiAob2ZmKSA8IDAg JiYgbXB6X2NtcCAobWlubSwgbWluKSA+PSAwKQorCSAgfHwgKG1wel9zZ24g KG9mZikgPiAwICYmIG1wel9jbXAgKG1heG0sIG1heCkgPD0gMCkpCisJewor CSAgbXB6X3NldCAobWluLCBtaW5tKTsKKwkgIG1wel9zZXQgKG1heCwgbWF4 bSk7CiAJICBtcHpfY2xlYXIgKG1pbm0pOwogCSAgbXB6X2NsZWFyIChtYXht KTsKKwkgIHJldHVybjsKIAl9CisgICAgICBtcHpfY2xlYXIgKG1pbm0pOwor ICAgICAgbXB6X2NsZWFyIChtYXhtKTsKICAgICB9CiAKICAgLyogSWYgdGhl IGNvbXB1dGF0aW9uIG1heSB3cmFwLCB3ZSBrbm93IG5vdGhpbmcgYWJvdXQg dGhlIHZhbHVlLCBleGNlcHQgZm9yCg== --001a11c24894a92dc1051d7ee340--