From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 93708 invoked by alias); 5 Mar 2019 14:45:49 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 53068 invoked by uid 89); 5 Mar 2019 14:45:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=visited X-HELO: mail-lj1-f193.google.com Received: from mail-lj1-f193.google.com (HELO mail-lj1-f193.google.com) (209.85.208.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Mar 2019 14:45:22 +0000 Received: by mail-lj1-f193.google.com with SMTP id z7so7835246lji.0; Tue, 05 Mar 2019 06:45:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=oBCBei4SiAJiXkfApJgE5H8FvwyTtmIqZdTLFBMhGjc=; b=a/nC9cIONRDlCvFsZnj3KEUpD/wMQYhrobQNDADFnq+XxvszFnsmW/ZRuVtAnDPDNG 1DUEkLUa9EJCdxfhRBaCUZhHxg2Q2kKDNoySsTLsTWH/wRM1dbHzcIX+O5VJnZ6Ltahg AfQGtapFyZ1vwbtE8nkMosVx+L90unk7cFCDlxF9Vpt5cMYDQc2dD4y2ZxRFupk9I4sP ebp6PjpzKqktz6omTZVt7gw6gOm+Q7MeQz5N8qe4qW7MnBBQE8TOyDt7oVtMN9Xu21tE 5MHw6YEwf9uZr1NZ/RfkcFVVi/DSnFn/zG5ZcQShFjWfxZAPK4khhSBzK9jSqDJYvG8z aVBQ== MIME-Version: 1.0 References: <933b52ac-d372-f9d9-792e-4166f35b41f5@redhat.com> <327DC916-C1B4-47F9-92AE-468236D32C1F@oracle.com> <81846359-36B4-46F1-9C5C-8E20F927FE9F@oracle.com> In-Reply-To: From: Richard Biener Date: Tue, 05 Mar 2019 14:45:00 -0000 Message-ID: Subject: Re: A bug in vrp_meet? To: Qing Zhao Cc: GCC Development , Jeff Law , gcc Patches Content-Type: multipart/mixed; boundary="00000000000082bc89058359eb20" X-IsSubscribed: yes X-SW-Source: 2019-03/txt/msg00031.txt.bz2 --00000000000082bc89058359eb20 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-length: 5501 On Tue, Mar 5, 2019 at 11:44 AM Richard Biener wrote: > > On Tue, Mar 5, 2019 at 10:48 AM Richard Biener > wrote: > > > > On Mon, Mar 4, 2019 at 11:01 PM Qing Zhao wrote: > > > > > > Hi, Richard, > > > > > > > On Mar 4, 2019, at 5:45 AM, Richard Biener wrote: > > > >> > > > >> It looks like DOM fails to visit stmts generated by simplification= . Can you open a bug report with a testcase? > > > >> > > > >> > > > >> The problem is, It took me quite some time in order to come up wit= h a small and independent testcase for this problem, > > > >> a little bit change made the error disappear. > > > >> > > > >> do you have any suggestion on this? or can you give me some hint = on how to fix this in DOM? then I can try the fix on my side? > > > > > > > > I remember running into similar issues in the past where I tried to > > > > extract temporary nonnull ranges from divisions. > > > > I have there > > > > > > > > @@ -1436,11 +1436,16 @@ dom_opt_dom_walker::before_dom_children > > > > m_avail_exprs_stack->pop_to_marker (); > > > > > > > > edge taken_edge =3D NULL; > > > > - for (gsi =3D gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi= )) > > > > - { > > > > - evrp_range_analyzer.record_ranges_from_stmt (gsi_stmt (gsi),= false); > > > > - taken_edge =3D this->optimize_stmt (bb, gsi); > > > > - } > > > > + gsi =3D gsi_start_bb (bb); > > > > + if (!gsi_end_p (gsi)) > > > > + while (1) > > > > + { > > > > + evrp_range_analyzer.record_def_ranges_from_stmt (gsi_stmt (= gsi), false); > > > > + taken_edge =3D this->optimize_stmt (bb, &gsi); > > > > + if (gsi_end_p (gsi)) > > > > + break; > > > > + evrp_range_analyzer.record_use_ranges_from_stmt (gsi_stmt (= gsi)); > > > > + } > > > > > > > > /* Now prepare to process dominated blocks. */ > > > > record_edge_info (bb); > > > > > > > > OTOH the issue in your case is that fold emits new stmts before gsi= but the > > > > above loop will never look at them. See tree-ssa-forwprop.c for co= de how > > > > to deal with this (setting a pass-local flag on stmts visited and w= alking back > > > > to unvisited, newly inserted ones). The fold_stmt interface could = in theory > > > > also be extended to insert new stmts on a sequence passed to it so = the > > > > caller would be responsible for inserting them into the IL and coul= d then > > > > more easily revisit them (but that's a bigger task). > > > > > > > > So, does the following help? > > > > > > Yes, this change fixed the error in my side, now, in the dumped file = for pass dom3: > > > > > > =3D=3D=3D=3D > > > Visiting statement: > > > i_49 =3D _98 > 0 ? k_105 : 0; > > > Meeting > > > [0, 65535] > > > and > > > [0, 0] > > > to > > > [0, 65535] > > > Intersecting > > > [0, 65535] > > > and > > > [0, 65535] > > > to > > > [0, 65535] > > > Optimizing statement i_49 =3D _98 > 0 ? k_105 : 0; > > > Replaced 'k_105' with variable '_98' > > > gimple_simplified to _152 =3D MAX_EXPR <_98, 0>; > > > i_49 =3D _152; > > > > Ah, that looks interesting. From this detail we might be > > able to derive a testcase as well - a GIMPLE one > > eventually because DOM runs quite late. It's also interesting > > to see the inefficient code here (the extra copy), probably > > some known issue with match-and-simplify, I'd have to check. > > > > > Folded to: i_49 =3D _152; > > > LKUP STMT i_49 =3D _152 > > > =3D=3D=3D=3D ASGN i_49 =3D _152 > > > > > > Visiting statement: > > > _152 =3D MAX_EXPR <_98, 0>; > > > > > > Visiting statement: > > > i_49 =3D _152; > > > Intersecting > > > [0, 65535] EQUIVALENCES: { _152 } (1 elements) > > > and > > > [0, 65535] > > > to > > > [0, 65535] EQUIVALENCES: { _152 } (1 elements) > > > =3D=3D=3D=3D > > > > > > We can clearly see from the above, all the new stmts generated by fol= d are visited now. > > > > We can also see that DOMs optimize_stmt code is not executed on the fir= st stmt > > of the folding result (the MAX_EXPR), so the fix can be probably > > amended/simplified > > with that in mind. > > > > > it is also confirmed that the runtime error caused by this bug was go= ne with this fix. > > > > > > So, what=E2=80=99s the next step for this issue? > > > > > > will you commit this fix to gcc9 and gcc8 (we need it in gcc8)? > > > > I'll see to carve out some cycles trying to find a testcase and amend > > the fix a bit > > and will take care of testing/submitting the fix. Thanks for testing > > that it works > > for your case. > > I filed PR89595 with a testcase. So fixing it properly with also re-optimize_stmt those stmts so we'd CSE the MAX_EXPR introduced by folding makes it somewhat ugly. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Any ideas how to make it less so? I can split out making optimize_stmt take a gsi * btw, in case that's a more obvious change and it makes the patch a little smaller. Richard. 2019-03-05 Richard Biener PR tree-optimization/89595 * tree-ssa-dom.c (dom_opt_dom_walker::optimize_stmt): Take stmt iterator as reference, take boolean output parameter to indicate whether the stmt was removed and thus the iterator already advanced. (dom_opt_dom_walker::before_dom_children): Re-iterate over stmts created by folding. * gcc.dg/torture/pr89595.c: New testcase. --00000000000082bc89058359eb20 Content-Type: application/octet-stream; name=fix-pr89595 Content-Disposition: attachment; filename=fix-pr89595 Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jsvvxar10 Content-length: 7402 MjAxOS0wMy0wNSAgUmljaGFyZCBCaWVuZXIgIDxyZ3VlbnRoZXJAc3VzZS5k ZT4KCglQUiB0cmVlLW9wdGltaXphdGlvbi84OTU5NQoJKiB0cmVlLXNzYS1k b20uYyAoZG9tX29wdF9kb21fd2Fsa2VyOjpvcHRpbWl6ZV9zdG10KTogVGFr ZQoJc3RtdCBpdGVyYXRvciBhcyByZWZlcmVuY2UsIHRha2UgYm9vbGVhbiBv dXRwdXQgcGFyYW1ldGVyIHRvCglpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzdG10 IHdhcyByZW1vdmVkIGFuZCB0aHVzIHRoZSBpdGVyYXRvcgoJYWxyZWFkeSBh ZHZhbmNlZC4KCShkb21fb3B0X2RvbV93YWxrZXI6OmJlZm9yZV9kb21fY2hp bGRyZW4pOiBSZS1pdGVyYXRlIG92ZXIKCXN0bXRzIGNyZWF0ZWQgYnkgZm9s ZGluZy4KCgkqIGdjYy5kZy90b3J0dXJlL3ByODk1OTUuYzogTmV3IHRlc3Rj YXNlLgoKSW5kZXg6IGdjYy90cmVlLXNzYS1kb20uYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBnY2MvdHJlZS1zc2EtZG9tLmMJKHJldmlzaW9uIDI2 OTM4NSkKKysrIGdjYy90cmVlLXNzYS1kb20uYwkod29ya2luZyBjb3B5KQpA QCAtNjE4LDcgKzYxOCw3IEBAIHByaXZhdGU6CiAgICAgIHZhcmlvdXMgdGFi bGVzIG1hbnRhaW5lZCBieSBET00uICBSZXR1cm5zIHRoZSB0YWtlbiBlZGdl IGlmCiAgICAgIHRoZSBzdGF0ZW1lbnQgaXMgYSBjb25kaXRpb25hbCB3aXRo IGEgc3RhdGljYWxseSBkZXRlcm1pbmVkCiAgICAgIHZhbHVlLiAgKi8KLSAg ZWRnZSBvcHRpbWl6ZV9zdG10IChiYXNpY19ibG9jaywgZ2ltcGxlX3N0bXRf aXRlcmF0b3IpOworICBlZGdlIG9wdGltaXplX3N0bXQgKGJhc2ljX2Jsb2Nr LCBnaW1wbGVfc3RtdF9pdGVyYXRvciAqLCBib29sICopOwogfTsKIAogLyog SnVtcCB0aHJlYWRpbmcsIHJlZHVuZGFuY3kgZWxpbWluYXRpb24gYW5kIGNv bnN0L2NvcHkgcHJvcGFnYXRpb24uCkBAIC0xNDgwLDExICsxNDgwLDQ3IEBA IGRvbV9vcHRfZG9tX3dhbGtlcjo6YmVmb3JlX2RvbV9jaGlsZHJlbgogICBt X2F2YWlsX2V4cHJzX3N0YWNrLT5wb3BfdG9fbWFya2VyICgpOwogCiAgIGVk Z2UgdGFrZW5fZWRnZSA9IE5VTEw7Ci0gIGZvciAoZ3NpID0gZ3NpX3N0YXJ0 X2JiIChiYik7ICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkK KyAgLyogV2FsayBuZXcgc3RtdHMgZXZlbnR1YWxseSBpbnNlcnRlZCBieSBv cHRpbWl6ZV9zdG10IGZvbGRpbmcgYWZ0ZXIKKyAgICAgc3Vic3RpdHV0aW5n IGludG8gdGhlIHN0bXQgYXQgZ3NpLiAgRG8gbm90IG9wdGltaXplIHN0bXQg aXRzZWxmIGFnYWluLgorICAgICBXZSBrZWVwIGEgc3RhY2sgb2YgaXRlcmF0 aW9uIGVuZHBvaW50cyBmb3IgdGhpcyBwdXJwb3NlLiAgKi8KKyAgYXV0b192 ZWM8Z2ltcGxlX3N0bXRfaXRlcmF0b3IsIDg+IGdlbmRzOworICBnZW5kcy5x dWlja19wdXNoIChnc2lfbm9uZSAoKSk7CisgIGdpbXBsZV9zdG10X2l0ZXJh dG9yIHBnc2kgPSBnc2lfbm9uZSAoKTsKKyAgZ3NpID0gZ3NpX3N0YXJ0X2Ji IChiYik7CisgIGRvCiAgICAgeworICAgICAgaWYgKGdzaV9zdG10IChnc2kp ID09IGdzaV9zdG10IChnZW5kcy5sYXN0ICgpKSkKKwl7CisJICBnc2kgPSBn ZW5kcy5wb3AgKCk7CisJICBpZiAoZ3NpX2VuZF9wIChnc2kpKQorCSAgICBi cmVhazsKKwkgIHBnc2kgPSBnc2k7CisJICBnc2lfbmV4dCAoJmdzaSk7CisJ ICBjb250aW51ZTsKKwl9CiAgICAgICBldnJwX3JhbmdlX2FuYWx5emVyLnJl Y29yZF9yYW5nZXNfZnJvbV9zdG10IChnc2lfc3RtdCAoZ3NpKSwgZmFsc2Up OwotICAgICAgdGFrZW5fZWRnZSA9IHRoaXMtPm9wdGltaXplX3N0bXQgKGJi LCBnc2kpOworICAgICAgYm9vbCByZW1vdmVkX3AgPSBmYWxzZTsKKyAgICAg IHRha2VuX2VkZ2UgPSB0aGlzLT5vcHRpbWl6ZV9zdG10IChiYiwgJmdzaSwg JnJlbW92ZWRfcCk7CisgICAgICBpZiAocmVtb3ZlZF9wKQorCS8qIHBnc2kg c2hvdWxkIHN0aWxsIGJlIHJpZ2h0IGJlZm9yZSBnc2kuICAqLworCTsKKyAg ICAgIGVsc2UKKwl7CisJICBpZiAoZ3NpX2VuZF9wIChwZ3NpKSkKKwkgICAg cGdzaSA9IGdzaV9zdGFydF9iYiAoYmIpOworCSAgZWxzZQorCSAgICBnc2lf bmV4dCAoJnBnc2kpOworCSAgaWYgKGdzaV9zdG10IChwZ3NpKSAhPSBnc2lf c3RtdCAoZ3NpKSkKKwkgICAgeworCSAgICAgIGdlbmRzLnNhZmVfcHVzaCAo Z3NpKTsKKwkgICAgICBnc2kgPSBwZ3NpOworCSAgICAgIGdzaV9wcmV2ICgm cGdzaSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZ3NpX25leHQgKCZnc2kp OworCX0KICAgICB9CisgIHdoaWxlICgxKTsKIAogICAvKiBOb3cgcHJlcGFy ZSB0byBwcm9jZXNzIGRvbWluYXRlZCBibG9ja3MuICAqLwogICByZWNvcmRf ZWRnZV9pbmZvIChiYik7CkBAIC0xOTUxLDcgKzE5ODcsOCBAQCB0ZXN0X2Zv cl9zaW5ndWxhcml0eSAoZ2ltcGxlICpzdG10LCBnY29uCiAgICAgICBjb25k aXRpb24gdG8gYW4gZXF1YWxpdHkgY29uZGl0aW9uLiAgKi8KIAogZWRnZQot ZG9tX29wdF9kb21fd2Fsa2VyOjpvcHRpbWl6ZV9zdG10IChiYXNpY19ibG9j ayBiYiwgZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kpCitkb21fb3B0X2RvbV93 YWxrZXI6Om9wdGltaXplX3N0bXQgKGJhc2ljX2Jsb2NrIGJiLCBnaW1wbGVf c3RtdF9pdGVyYXRvciAqc2ksCisJCQkJICAgYm9vbCAqcmVtb3ZlZF9wKQog ewogICBnaW1wbGUgKnN0bXQsICpvbGRfc3RtdDsKICAgYm9vbCBtYXlfb3B0 aW1pemVfcDsKQEAgLTE5NTksNyArMTk5Niw3IEBAIGRvbV9vcHRfZG9tX3dh bGtlcjo6b3B0aW1pemVfc3RtdCAoYmFzaWMKICAgYm9vbCB3YXNfbm9yZXR1 cm47CiAgIGVkZ2UgcmV0dmFsID0gTlVMTDsKIAotICBvbGRfc3RtdCA9IHN0 bXQgPSBnc2lfc3RtdCAoc2kpOworICBvbGRfc3RtdCA9IHN0bXQgPSBnc2lf c3RtdCAoKnNpKTsKICAgd2FzX25vcmV0dXJuID0gaXNfZ2ltcGxlX2NhbGwg KHN0bXQpICYmIGdpbXBsZV9jYWxsX25vcmV0dXJuX3AgKHN0bXQpOwogCiAg IGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykp CkBAIC0xOTgyLDkgKzIwMTksOSBAQCBkb21fb3B0X2RvbV93YWxrZXI6Om9w dGltaXplX3N0bXQgKGJhc2ljCiAKICAgICAgIC8qIFRyeSB0byBmb2xkIHRo ZSBzdGF0ZW1lbnQgbWFraW5nIHN1cmUgdGhhdCBTVE1UIGlzIGtlcHQKIAkg dXAgdG8gZGF0ZS4gICovCi0gICAgICBpZiAoZm9sZF9zdG10ICgmc2kpKQor ICAgICAgaWYgKGZvbGRfc3RtdCAoc2kpKQogCXsKLQkgIHN0bXQgPSBnc2lf c3RtdCAoc2kpOworCSAgc3RtdCA9IGdzaV9zdG10ICgqc2kpOwogCSAgZ2lt cGxlX3NldF9tb2RpZmllZCAoc3RtdCwgdHJ1ZSk7CiAKIAkgIGlmIChkdW1w X2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCkBAIC0yMDMy LDggKzIwNjksOCBAQCBkb21fb3B0X2RvbV93YWxrZXI6Om9wdGltaXplX3N0 bXQgKGJhc2ljCiAJICBpZiAoY2FsbGVlCiAJICAgICAgJiYgZm5kZWNsX2J1 aWx0X2luX3AgKGNhbGxlZSwgQlVJTFRfSU5fQ09OU1RBTlRfUCkpCiAJICAg IHsKLQkgICAgICBwcm9wYWdhdGVfdHJlZV92YWx1ZV9pbnRvX3N0bXQgKCZz aSwgaW50ZWdlcl96ZXJvX25vZGUpOwotCSAgICAgIHN0bXQgPSBnc2lfc3Rt dCAoc2kpOworCSAgICAgIHByb3BhZ2F0ZV90cmVlX3ZhbHVlX2ludG9fc3Rt dCAoc2ksIGludGVnZXJfemVyb19ub2RlKTsKKwkgICAgICBzdG10ID0gZ3Np X3N0bXQgKCpzaSk7CiAJICAgIH0KIAl9CiAKQEAgLTIwODksOSArMjEyNiw5 IEBAIGRvbV9vcHRfZG9tX3dhbGtlcjo6b3B0aW1pemVfc3RtdCAoYmFzaWMK IAl9CiAKICAgICAgIHVwZGF0ZV9zdG10X2lmX21vZGlmaWVkIChzdG10KTsK LSAgICAgIGVsaW1pbmF0ZV9yZWR1bmRhbnRfY29tcHV0YXRpb25zICgmc2ks IG1fY29uc3RfYW5kX2NvcGllcywKKyAgICAgIGVsaW1pbmF0ZV9yZWR1bmRh bnRfY29tcHV0YXRpb25zIChzaSwgbV9jb25zdF9hbmRfY29waWVzLAogCQkJ CQltX2F2YWlsX2V4cHJzX3N0YWNrKTsKLSAgICAgIHN0bXQgPSBnc2lfc3Rt dCAoc2kpOworICAgICAgc3RtdCA9IGdzaV9zdG10ICgqc2kpOwogCiAgICAg ICAvKiBQZXJmb3JtIHNpbXBsZSByZWR1bmRhbnQgc3RvcmUgZWxpbWluYXRp b24uICAqLwogICAgICAgaWYgKGdpbXBsZV9hc3NpZ25fc2luZ2xlX3AgKHN0 bXQpCkBAIC0yMTE4LDEzICsyMTU1LDE0IEBAIGRvbV9vcHRfZG9tX3dhbGtl cjo6b3B0aW1pemVfc3RtdCAoYmFzaWMKIAkgICAgewogCSAgICAgIGJhc2lj X2Jsb2NrIGJiID0gZ2ltcGxlX2JiIChzdG10KTsKIAkgICAgICB1bmxpbmtf c3RtdF92ZGVmIChzdG10KTsKLQkgICAgICBpZiAoZ3NpX3JlbW92ZSAoJnNp LCB0cnVlKSkKKwkgICAgICBpZiAoZ3NpX3JlbW92ZSAoc2ksIHRydWUpKQog CQl7CiAJCSAgYml0bWFwX3NldF9iaXQgKG5lZWRfZWhfY2xlYW51cCwgYmIt PmluZGV4KTsKIAkJICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQogCQkgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiICBG bGFnZ2VkIHRvIGNsZWFyIEVIIGVkZ2VzLlxuIik7CiAJCX0KIAkgICAgICBy ZWxlYXNlX2RlZnMgKHN0bXQpOworCSAgICAgICpyZW1vdmVkX3AgPSB0cnVl OwogCSAgICAgIHJldHVybiByZXR2YWw7CiAJICAgIH0KIAl9CkluZGV4OiBn Y2MvdGVzdHN1aXRlL2djYy5kZy90b3J0dXJlL3ByODk1OTUuYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGVzdHN1aXRlL2djYy5kZy90b3J0 dXJlL3ByODk1OTUuYwkobm9uZXhpc3RlbnQpCisrKyBnY2MvdGVzdHN1aXRl L2djYy5kZy90b3J0dXJlL3ByODk1OTUuYwkod29ya2luZyBjb3B5KQpAQCAt MCwwICsxLDM5IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLWFk ZGl0aW9uYWwtb3B0aW9ucyAiLWZnaW1wbGUiIH0gKi8KKworaW50IF9fYXR0 cmlidXRlX18oKG5vaXBhKSkKK19fR0lNUExFKHN0YXJ0d2l0aCgiZG9tIikp IGJhcihpbnQgY29uZCwgaW50IHZhbCkKK3sKKyAgaW50IGk7CisKKyAgaWYg KDAgIT0gMCkKKyAgICBnb3RvIGJiXzY7CisgIGVsc2UKKyAgICBnb3RvIGJi XzI7CisKK2JiXzI6CisgIGlmIChjb25kXzUoRCkgIT0gMCkKKyAgICBnb3Rv IGJiXzQ7CisgIGVsc2UKKyAgICBnb3RvIGJiXzU7CisKK2JiXzQ6CisgIGlf NiA9IHZhbF8yKEQpOworICBpXzEgPSB2YWxfMihEKSA+IDAgPyBpXzYgOiAw OworCitiYl81OgorICBpXzMgPSBfX1BISSAoYmJfNDogaV8xLCBiYl8yOiAw KTsKKyAgcmV0dXJuIGlfMzsKKworYmJfNjoKKyAgaV80ID0gMTsKKyAgaV85 ID0gMjsKKyAgZ290byBiYl8yOworfQorCitpbnQgbWFpbigpCit7CisgIGlm IChiYXIgKDEsIDEpICE9IDEpCisgICAgX19idWlsdGluX2Fib3J0ICgpOwor ICByZXR1cm4gMDsKK30K --00000000000082bc89058359eb20--