From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 47660 invoked by alias); 31 Mar 2016 16:44:08 -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 47649 invoked by uid 89); 31 Mar 2016 16:44:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=richard.guenther@gmail.com, richardguenthergmailcom, bin.cheng@arm.com, binchengarmcom X-HELO: mail-vk0-f65.google.com Received: from mail-vk0-f65.google.com (HELO mail-vk0-f65.google.com) (209.85.213.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 31 Mar 2016 16:43:57 +0000 Received: by mail-vk0-f65.google.com with SMTP id e6so12242397vkh.1 for ; Thu, 31 Mar 2016 09:43:57 -0700 (PDT) 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; bh=RvBrCg/cOBs6V2FqQ9sCnXdSQC/uy+XetgKRzRpwsPo=; b=Qm9b5cGd6Ov/QsDxe4M5Je8ulejlKug5NmKGNga4vZHqTRLt/gB8dz1Vb3OUXAG3jR gqN3yljqUClg71ESe9acspfLsWRa44YVCir1Y+KrYUI5+2z929SXTOw8crUlgwplPYqW N2uFMTQxijKtk53yNt079iXHy9NJF/g/T8C0CO69q6wcClod2ok0/fsi/MMFIt6wZEwk whTjxqNf6VHA+nbGoqDOvL7AqNNm9yey4HD9/0RF1XoU/4/HB03mLXG0ggB0T+V+i++M Lzbv3rDH5jPbIQvUsxBb52ZmN7er7SxT+7Gwu5/k6Kv96HO5ernBxVxudPAA10SJqQEx ybJQ== X-Gm-Message-State: AD7BkJIX0vz1sJQjbC/BG8jB9j/W0XCtv8wliy4M9mpTr5Dk/S0yktB1nZi1iVdMXG6Zfv1c91uQKm4I8FEGTg== MIME-Version: 1.0 X-Received: by 10.159.37.181 with SMTP id 50mr1859203uaf.2.1459442635102; Thu, 31 Mar 2016 09:43:55 -0700 (PDT) Received: by 10.103.95.129 with HTTP; Thu, 31 Mar 2016 09:43:54 -0700 (PDT) In-Reply-To: References: Date: Thu, 31 Mar 2016 17:08:00 -0000 Message-ID: Subject: Re: [PATCH PR69489/01]Improve tree ifcvt by storing/tracking DR against its innermost loop bahavior if possible From: "Bin.Cheng" To: Richard Biener Cc: GCC Patches Content-Type: multipart/mixed; boundary=001a113979f6d6209f052f5af797 X-IsSubscribed: yes X-SW-Source: 2016-03/txt/msg01701.txt.bz2 --001a113979f6d6209f052f5af797 Content-Type: text/plain; charset=UTF-8 Content-length: 10834 On Tue, Mar 29, 2016 at 9:37 AM, Richard Biener wrote: > On Mon, Mar 28, 2016 at 9:57 PM, Bin.Cheng wrote: >> Sorry, Should have replied to gcc-patches list. >> >> Thanks, >> bin >> >> ---------- Forwarded message ---------- >> From: "Bin.Cheng" >> Date: Tue, 29 Mar 2016 03:55:04 +0800 >> Subject: Re: [PATCH PR69489/01]Improve tree ifcvt by storing/tracking >> DR against its innermost loop bahavior if possible >> To: Richard Biener >> >> On 3/17/16, Richard Biener wrote: >>> On Wed, Mar 16, 2016 at 5:17 PM, Bin.Cheng wrote: >>>> On Wed, Mar 16, 2016 at 12:20 PM, Richard Biener >>>> wrote: >>>>> >>>>> Hmm. >>>> Hi, >>>> Thanks for reviewing. >>>>> >>>>> + equal_p = true; >>>>> + if (e1->base_address && e2->base_address) >>>>> + equal_p &= operand_equal_p (e1->base_address, e2->base_address, 0); >>>>> + if (e1->offset && e2->offset) >>>>> + equal_p &= operand_equal_p (e1->offset, e2->offset, 0); >>>>> >>>>> surely better to return false early. >>>>> >>>>> I think we don't want this in tree-data-refs.h also because of ... >>>>> >>>>> @@ -615,15 +619,29 @@ >>>>> hash_memrefs_baserefs_and_store_DRs_read_written_info >>>>> (data_reference_p a) >>>>> data_reference_p *master_dr, *base_master_dr;and REALPART) before >>>>> creating the DR (or adjust the equality function >>>> and hashing >>>>> tree ref = DR_REF (a); >>>>> tree base_ref = DR_BASE_OBJECT (a); >>>>> + innermost_loop_behavior *innermost = &DR_INNERMOST (a); >>>>> tree ca = bb_predicate (gimple_bb (DR_STMT (a))); >>>>> bool exist1, exist2; >>>>> >>>>> - while (TREE_CODE (ref) == COMPONENT_REF >>>>> - || TREE_CODE (ref) == IMAGPART_EXPR >>>>> - || TREE_CODE (ref) == REALPART_EXPR) >>>>> - ref = TREE_OPERAND (ref, 0); >>>>> + /* If reference in DR has innermost loop behavior and it is not >>>>> + a compound memory reference, we store it to innermost_DR_map, >>>>> + otherwise to ref_DR_map. */ >>>>> + if (TREE_CODE (ref) == COMPONENT_REF >>>>> + || TREE_CODE (ref) == IMAGPART_EXPR >>>>> + || TREE_CODE (ref) == REALPART_EXPR >>>>> + || !(DR_BASE_ADDRESS (a) || DR_OFFSET (a) >>>>> + || DR_INIT (a) || DR_STEP (a) || DR_ALIGNED_TO (a))) >>>>> + { >>>>> + while (TREE_CODE (ref) == COMPONENT_REF >>>>> + || TREE_CODE (ref) == IMAGPART_EXPR >>>>> + || TREE_CODE (ref) == REALPART_EXPR) >>>>> + ref = TREE_OPERAND (ref, 0); >>>>> + >>>>> + master_dr = &ref_DR_map->get_or_insert (ref, &exist1); >>>>> + } >>>>> + else >>>>> + master_dr = &innermost_DR_map->get_or_insert (innermost, &exist1); >>>>> >>>>> we don't want an extra hashmap but replace ref_DR_map entirely. So we'd >>>>> need to >>>>> strip outermost non-variant handled-components (COMPONENT_REF, IMAGPART >>>>> and REALPART) before creating the DR (or adjust the equality function >>>>> and hashing >>>>> to disregard them which means subtracting their offset from DR_INIT. >>>> I am not sure if I understand correctly. But for component reference, >>>> it is the base object that we want to record/track. For example, >>>> >>>> for (i = 0; i < N; i++) { >>>> m = *data++; >>>> >>>> m1 = p1->x - m; >>>> m2 = p2->x + m; >>>> >>>> p3->y = (m1 >= m2) ? p1->y : p2->y; >>>> >>>> p1++; >>>> p2++; >>>> p3++; >>>> } >>>> We want to infer that reads of p1/p2 in condition statement won't trap >>>> because there are unconditional reads of the structures, though the >>>> unconditional reads are actual of other sub-objects. Here it is the >>>> invariant part of address that we want to track. >>> >>> Well, the variant parts - we want to strip invariant parts as far as we can >>> (offsetof (x) and offsetof (y)) >>> >>>> Also illustrated by this example, we can't rely on data-ref analyzer >>>> here. Because in gathering/scattering cases, the address could be not >>>> affine at all. >>> >>> Sure, but that's a different issue. >>> >>>>> >>>>> To adjust the references we collect you'd maybe could use a callback >>>>> to get_references_in_stmt >>>>> to adjust them. >>>>> >>>>> OTOH post-processing the DRs in if_convertible_loop_p_1 can be as simple >>>>> as >>>> Is this a part of the method you suggested above, or is it an >>>> alternative one? If it's the latter, then I have below questions >>>> embedded. >>> >>> It is an alternative to adding a hook to get_references_in_stmt and >>> probably "easier". >>> >>>>> >>>>> Index: tree-if-conv.c >>>>> =================================================================== >>>>> --- tree-if-conv.c (revision 234215) >>>>> +++ tree-if-conv.c (working copy) >>>>> @@ -1235,6 +1220,38 @@ if_convertible_loop_p_1 (struct loop *lo >>>>> >>>>> for (i = 0; refs->iterate (i, &dr); i++) >>>>> { >>>>> + tree *refp = &DR_REF (dr); >>>>> + while ((TREE_CODE (*refp) == COMPONENT_REF >>>>> + && TREE_OPERAND (*refp, 2) == NULL_TREE) >>>>> + || TREE_CODE (*refp) == IMAGPART_EXPR >>>>> + || TREE_CODE (*refp) == REALPART_EXPR) >>>>> + refp = &TREE_OPERAND (*refp, 0); >>>>> + if (refp != &DR_REF (dr)) >>>>> + { >>>>> + tree saved_base = *refp; >>>>> + *refp = integer_zero_node; >>>>> + >>>>> + if (DR_INIT (dr)) >>>>> + { >>>>> + tree poffset; >>>>> + int punsignedp, preversep, pvolatilep; >>>>> + machine_mode pmode; >>>>> + HOST_WIDE_INT pbitsize, pbitpos; >>>>> + get_inner_reference (DR_REF (dr), &pbitsize, &pbitpos, >>>>> &poffset, >>>>> + &pmode, &punsignedp, &preversep, >>>>> &pvolatilep, >>>>> + false); >>>>> + gcc_assert (poffset == NULL_TREE); >>>>> + >>>>> + DR_INIT (dr) >>>>> + = wide_int_to_tree (ssizetype, >>>>> + wi::sub (DR_INIT (dr), >>>>> + pbitpos / BITS_PER_UNIT)); >>>>> + } >>>>> + >>>>> + *refp = saved_base; >>>>> + DR_REF (dr) = *refp; >>>>> + } >>>> Looks to me the code is trying to resolve difference between two (or >>>> more) component references, which is DR_INIT in the code. But DR_INIT >>>> is not the only thing needs to be handled. For a structure containing >>>> two sub-arrays, DR_OFFSET may be different too. >>> >>> Yes, but we can't say that if >>> >>> a->a[i] >>> >>> doesn't trap that then >>> >>> a->b[i] >>> >>> doesn't trap either. We can only "strip" outermost >>> non-variable-offset components. >>> >>> But maybe I'm missing what example you are thinking of. >> Hmm, this was the case I meant. What I don't understand is current >> code logic does infer trap information for a.b[i] from a.a[i]. Given >> below example: >> struct str >> { >> int a[10]; >> int b[20]; >> char c; >> }; >> >> void bar (struct str *); >> int foo (int x, int n) >> { >> int i; >> struct str s; >> bar (&s); >> for (i = 0; i < n; i++) >> { >> s.a[i] = s.b[i]; >> if (x > i) >> s.b[i] = 0; >> } >> bar (&s); >> return 0; >> } >> The loop is convertible because of below code in function >> ifcvt_memrefs_wont_trap: >> >> /* If a is unconditionally accessed then ... */ >> if (DR_RW_UNCONDITIONALLY (*master_dr)) >> { >> /* an unconditional read won't trap. */ >> if (DR_IS_READ (a)) >> return true; >> >> /* an unconditionaly write won't trap if the base is written >> to unconditionally. */ >> if (base_master_dr >> && DR_BASE_W_UNCONDITIONALLY (*base_master_dr)) >> return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES); >> else >> { >> /* or the base is know to be not readonly. */ >> tree base_tree = get_base_address (DR_REF (a)); >> if (DECL_P (base_tree) >> && decl_binds_to_current_def_p (base_tree) >> && ! TREE_READONLY (base_tree)) >> return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES); >> } >> } >> It is the main object '&s' that is recorded in base_master_dr, so >> s.b[i] is considered not trap. Even it's not, I suppose >> get_base_address will give same result? > > Well, for this case it sees that s.b[i] is read from so it can't be an > out-of-bound > access. And s.a[i] is written to unconditionally so 's' cannot be a > readonly object. > With both pieces of information we can conclude that s.b[i] = 0 doesn't trap. Hi Richard, Attachment is the updated patch. I made below changes wrto your review comments: 1) Moved hash class for innermost loop behavior from tree-data-ref.h to tree-if-conv.c. I also removed check on innermost_loop_behavior.aligned_to which seems redundant to me because it's computed from offset and we have already checked equality for offset. 2) Replaced ref_DR_map with new map innermost_DR_map. 3) Post-processed DR in if_convertible_loop_p_1 for compound reference or references don't have innermost behavior. This cleans up following code using DR information. 4) Added a vectorization test for PR56625. I didn't incorporate your proposed code because I think it handles COMPONENT_REF of structure array like struct_arr[i].x/struct_arr[i].y. Looks to me it is another ifcvt opportunity different from PR69489. Anyway, fix is easy, I can send another patch in GCC7. Bootstrap and test on x86_64/AArch64, so any comments on this version? Thanks, bin 2016-03-30 Bin Cheng PR tree-optimization/56625 PR tree-optimization/69489 * tree-data-ref.h (DR_INNERMOST): New macro. * tree-if-conv.c (innermost_loop_behavior_hash): New class for hashing struct innermost_loop_behavior. (ref_DR_map): Remove. (innermost_DR_map): New map. (baseref_DR_map): Revise comment. (hash_memrefs_baserefs_and_store_DRs_read_written_info): Store DR to innermost_DR_map accroding to its innermost loop behavior. (ifcvt_memrefs_wont_trap): Get DR from innermost_DR_map according to its innermost loop behavior. (if_convertible_loop_p_1): Remove intialization for ref_DR_map. Add initialization for innermost_DR_map. Record memory reference in DR_BASE_ADDRESS if the reference is compound one or it doesn't have innermost loop behavior. (if_convertible_loop_p): Remove release for ref_DR_map. Release innermost_DR_map. gcc/testsuite/ChangeLog 2016-03-30 Bin Cheng PR tree-optimization/56625 PR tree-optimization/69489 * gcc.dg/vect/pr56625.c: New test. * gcc.dg/tree-ssa/ifc-pr69489-1.c: New test. --001a113979f6d6209f052f5af797 Content-Type: text/plain; charset=US-ASCII; name="pr69489-part1-20160330.txt" Content-Disposition: attachment; filename="pr69489-part1-20160330.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_imgigicx0 Content-length: 10354 ZGlmZiAtLWdpdCBhL2djYy90cmVlLWRhdGEtcmVmLmggYi9nY2MvdHJlZS1k YXRhLXJlZi5oCmluZGV4IGViMjRkMTYuLjg1NmRkNTggMTAwNjQ0Ci0tLSBh L2djYy90cmVlLWRhdGEtcmVmLmgKKysrIGIvZ2NjL3RyZWUtZGF0YS1yZWYu aApAQCAtMTQ0LDYgKzE0NCw3IEBAIHN0cnVjdCBkYXRhX3JlZmVyZW5jZQog I2RlZmluZSBEUl9TVEVQKERSKSAgICAgICAgICAgICAgICAoRFIpLT5pbm5l cm1vc3Quc3RlcAogI2RlZmluZSBEUl9QVFJfSU5GTyhEUikgICAgICAgICAg ICAoRFIpLT5hbGlhcy5wdHJfaW5mbwogI2RlZmluZSBEUl9BTElHTkVEX1RP KERSKSAgICAgICAgICAoRFIpLT5pbm5lcm1vc3QuYWxpZ25lZF90bworI2Rl ZmluZSBEUl9JTk5FUk1PU1QoRFIpICAgICAgICAgICAoRFIpLT5pbm5lcm1v c3QKIAogdHlwZWRlZiBzdHJ1Y3QgZGF0YV9yZWZlcmVuY2UgKmRhdGFfcmVm ZXJlbmNlX3A7CiAKZGlmZiAtLWdpdCBhL2djYy90cmVlLWlmLWNvbnYuYyBi L2djYy90cmVlLWlmLWNvbnYuYwppbmRleCA5ZTMwNWM3Li44ODQwMDZjIDEw MDY0NAotLS0gYS9nY2MvdHJlZS1pZi1jb252LmMKKysrIGIvZ2NjL3RyZWUt aWYtY29udi5jCkBAIC0xMTQsMTYgKzExNCw2OCBAQCBhbG9uZyB3aXRoIEdD Qzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1 ZGUgImJ1aWx0aW5zLmgiCiAjaW5jbHVkZSAicGFyYW1zLmgiCiAKKy8qIEhh c2ggZm9yIHN0cnVjdCBpbm5lcm1vc3RfbG9vcF9iZWhhdmlvci4gIEl0IGRl cGVuZHMgb24gdGhlIHVzZXIgdG8KKyAgIGZyZWUgdGhlIG1lbW9yeS4gICov CisKK3N0cnVjdCBpbm5lcm1vc3RfbG9vcF9iZWhhdmlvcl9oYXNoIDogbm9m cmVlX3B0cl9oYXNoIDxpbm5lcm1vc3RfbG9vcF9iZWhhdmlvcj4KK3sKKyAg c3RhdGljIGlubGluZSBoYXNodmFsX3QgaGFzaCAoY29uc3QgdmFsdWVfdHlw ZSAmKTsKKyAgc3RhdGljIGlubGluZSBib29sIGVxdWFsIChjb25zdCB2YWx1 ZV90eXBlICYsCisJCQkgICAgY29uc3QgY29tcGFyZV90eXBlICYpOworfTsK KworaW5saW5lIGhhc2h2YWxfdAoraW5uZXJtb3N0X2xvb3BfYmVoYXZpb3Jf aGFzaDo6aGFzaCAoY29uc3QgdmFsdWVfdHlwZSAmZSkKK3sKKyAgaGFzaHZh bF90IGhhc2g7CisKKyAgaGFzaCA9IGl0ZXJhdGl2ZV9oYXNoX2V4cHIgKGUt PmJhc2VfYWRkcmVzcywgMCk7CisgIGhhc2ggPSBpdGVyYXRpdmVfaGFzaF9l eHByIChlLT5vZmZzZXQsIGhhc2gpOworICBoYXNoID0gaXRlcmF0aXZlX2hh c2hfZXhwciAoZS0+aW5pdCwgaGFzaCk7CisgIHJldHVybiBpdGVyYXRpdmVf aGFzaF9leHByIChlLT5zdGVwLCBoYXNoKTsKK30KKworaW5saW5lIGJvb2wK K2lubmVybW9zdF9sb29wX2JlaGF2aW9yX2hhc2g6OmVxdWFsIChjb25zdCB2 YWx1ZV90eXBlICZlMSwKKwkJCQkgICAgIGNvbnN0IGNvbXBhcmVfdHlwZSAm ZTIpCit7CisgIGlmICgoZTEtPmJhc2VfYWRkcmVzcyAmJiAhZTItPmJhc2Vf YWRkcmVzcykKKyAgICAgIHx8ICghZTEtPmJhc2VfYWRkcmVzcyAmJiBlMi0+ YmFzZV9hZGRyZXNzKQorICAgICAgfHwgKCFlMS0+b2Zmc2V0ICYmIGUyLT5v ZmZzZXQpCisgICAgICB8fCAoZTEtPm9mZnNldCAmJiAhZTItPm9mZnNldCkK KyAgICAgIHx8ICghZTEtPmluaXQgJiYgZTItPmluaXQpCisgICAgICB8fCAo ZTEtPmluaXQgJiYgIWUyLT5pbml0KQorICAgICAgfHwgKCFlMS0+c3RlcCAm JiBlMi0+c3RlcCkKKyAgICAgIHx8IChlMS0+c3RlcCAmJiAhZTItPnN0ZXAp KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoZTEtPmJhc2VfYWRkcmVz cyAmJiBlMi0+YmFzZV9hZGRyZXNzCisgICAgICAmJiAhb3BlcmFuZF9lcXVh bF9wIChlMS0+YmFzZV9hZGRyZXNzLCBlMi0+YmFzZV9hZGRyZXNzLCAwKSkK KyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChlMS0+b2Zmc2V0ICYmIGUyLT5v ZmZzZXQKKyAgICAgICYmICFvcGVyYW5kX2VxdWFsX3AgKGUxLT5vZmZzZXQs IGUyLT5vZmZzZXQsIDApKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGUx LT5pbml0ICYmIGUyLT5pbml0CisgICAgICAmJiAhb3BlcmFuZF9lcXVhbF9w IChlMS0+aW5pdCwgZTItPmluaXQsIDApKQorICAgIHJldHVybiBmYWxzZTsK KyAgaWYgKGUxLT5zdGVwICYmIGUyLT5zdGVwCisgICAgICAmJiAhb3BlcmFu ZF9lcXVhbF9wIChlMS0+c3RlcCwgZTItPnN0ZXAsIDApKQorICAgIHJldHVy biBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwogLyogTGlzdCBvZiBi YXNpYyBibG9ja3MgaW4gaWYtY29udmVyc2lvbi1zdWl0YWJsZSBvcmRlci4g ICovCiBzdGF0aWMgYmFzaWNfYmxvY2sgKmlmY19iYnM7CiAKIC8qIEFwcGx5 IG1vcmUgYWdncmVzc2l2ZSAoZXh0ZW5kZWQpIGlmLWNvbnZlcnNpb24gaWYg dHJ1ZS4gICovCiBzdGF0aWMgYm9vbCBhZ2dyZXNzaXZlX2lmX2NvbnY7CiAK LS8qIEhhc2ggdGFibGUgdG8gc3RvcmUgcmVmZXJlbmNlcywgRFIgcGFpcnMu ICAqLwotc3RhdGljIGhhc2hfbWFwPHRyZWVfb3BlcmFuZF9oYXNoLCBkYXRh X3JlZmVyZW5jZV9wPiAqcmVmX0RSX21hcDsKKy8qIEhhc2ggdGFibGUgdG8g c3RvcmUgPERSJ3MgaW5uZXJtb3N0IGxvb3AgYmVoYXZpb3IsIERSPiBwYWly cy4gICovCitzdGF0aWMgaGFzaF9tYXA8aW5uZXJtb3N0X2xvb3BfYmVoYXZp b3JfaGFzaCwKKwkJZGF0YV9yZWZlcmVuY2VfcD4gKmlubmVybW9zdF9EUl9t YXA7CiAKLS8qIEhhc2ggdGFibGUgdG8gc3RvcmUgYmFzZSByZWZlcmVuY2Us IERSIHBhaXJzLiAgKi8KKy8qIEhhc2ggdGFibGUgdG8gc3RvcmUgPGJhc2Ug cmVmZXJlbmNlLCBEUj4gcGFpcnMuICAqLwogc3RhdGljIGhhc2hfbWFwPHRy ZWVfb3BlcmFuZF9oYXNoLCBkYXRhX3JlZmVyZW5jZV9wPiAqYmFzZXJlZl9E Ul9tYXA7CiAKIC8qIFN0cnVjdHVyZSB1c2VkIHRvIHByZWRpY2F0ZSBiYXNp YyBibG9ja3MuICBUaGlzIGlzIGF0dGFjaGVkIHRvIHRoZQpAQCAtNjEzLDE3 ICs2NjUsMTIgQEAgaGFzaF9tZW1yZWZzX2Jhc2VyZWZzX2FuZF9zdG9yZV9E UnNfcmVhZF93cml0dGVuX2luZm8gKGRhdGFfcmVmZXJlbmNlX3AgYSkKIHsK IAogICBkYXRhX3JlZmVyZW5jZV9wICptYXN0ZXJfZHIsICpiYXNlX21hc3Rl cl9kcjsKLSAgdHJlZSByZWYgPSBEUl9SRUYgKGEpOwogICB0cmVlIGJhc2Vf cmVmID0gRFJfQkFTRV9PQkpFQ1QgKGEpOworICBpbm5lcm1vc3RfbG9vcF9i ZWhhdmlvciAqaW5uZXJtb3N0ID0gJkRSX0lOTkVSTU9TVCAoYSk7CiAgIHRy ZWUgY2EgPSBiYl9wcmVkaWNhdGUgKGdpbXBsZV9iYiAoRFJfU1RNVCAoYSkp KTsKICAgYm9vbCBleGlzdDEsIGV4aXN0MjsKIAotICB3aGlsZSAoVFJFRV9D T0RFIChyZWYpID09IENPTVBPTkVOVF9SRUYKLQkgfHwgVFJFRV9DT0RFIChy ZWYpID09IElNQUdQQVJUX0VYUFIKLQkgfHwgVFJFRV9DT0RFIChyZWYpID09 IFJFQUxQQVJUX0VYUFIpCi0gICAgcmVmID0gVFJFRV9PUEVSQU5EIChyZWYs IDApOwotCi0gIG1hc3Rlcl9kciA9ICZyZWZfRFJfbWFwLT5nZXRfb3JfaW5z ZXJ0IChyZWYsICZleGlzdDEpOworICBtYXN0ZXJfZHIgPSAmaW5uZXJtb3N0 X0RSX21hcC0+Z2V0X29yX2luc2VydCAoaW5uZXJtb3N0LCAmZXhpc3QxKTsK ICAgaWYgKCFleGlzdDEpCiAgICAgKm1hc3Rlcl9kciA9IGE7CiAKQEAgLTY4 NSwyMSArNzMyLDE4IEBAIGlmY3Z0X21lbXJlZnNfd29udF90cmFwIChnaW1w bGUgKnN0bXQsIHZlYzxkYXRhX3JlZmVyZW5jZV9wPiBkcnMpCiAgIGRhdGFf cmVmZXJlbmNlX3AgKm1hc3Rlcl9kciwgKmJhc2VfbWFzdGVyX2RyOwogICBk YXRhX3JlZmVyZW5jZV9wIGEgPSBkcnNbZ2ltcGxlX3VpZCAoc3RtdCkgLSAx XTsKIAotICB0cmVlIHJlZl9iYXNlX2EgPSBEUl9SRUYgKGEpOwogICB0cmVl IGJhc2UgPSBEUl9CQVNFX09CSkVDVCAoYSk7CisgIGlubmVybW9zdF9sb29w X2JlaGF2aW9yICppbm5lcm1vc3QgPSAmRFJfSU5ORVJNT1NUIChhKTsKIAog ICBnY2NfYXNzZXJ0IChEUl9TVE1UIChhKSA9PSBzdG10KTsKKyAgZ2NjX2Fz c2VydCAoRFJfQkFTRV9BRERSRVNTIChhKSB8fCBEUl9PRkZTRVQgKGEpCisg ICAgICAgICAgICAgIHx8IERSX0lOSVQgKGEpIHx8IERSX1NURVAgKGEpKTsK IAotICB3aGlsZSAoVFJFRV9DT0RFIChyZWZfYmFzZV9hKSA9PSBDT01QT05F TlRfUkVGCi0JIHx8IFRSRUVfQ09ERSAocmVmX2Jhc2VfYSkgPT0gSU1BR1BB UlRfRVhQUgotCSB8fCBUUkVFX0NPREUgKHJlZl9iYXNlX2EpID09IFJFQUxQ QVJUX0VYUFIpCi0gICAgcmVmX2Jhc2VfYSA9IFRSRUVfT1BFUkFORCAocmVm X2Jhc2VfYSwgMCk7CisgIG1hc3Rlcl9kciA9IGlubmVybW9zdF9EUl9tYXAt PmdldCAoaW5uZXJtb3N0KTsKKyAgZ2NjX2Fzc2VydCAobWFzdGVyX2RyICE9 IE5VTEwpOwogCi0gIG1hc3Rlcl9kciA9IHJlZl9EUl9tYXAtPmdldCAocmVm X2Jhc2VfYSk7CiAgIGJhc2VfbWFzdGVyX2RyID0gYmFzZXJlZl9EUl9tYXAt PmdldCAoYmFzZSk7CiAKLSAgZ2NjX2Fzc2VydCAobWFzdGVyX2RyICE9IE5V TEwpOwotCiAgIC8qIElmIGEgaXMgdW5jb25kaXRpb25hbGx5IHdyaXR0ZW4g dG8gaXQgZG9lc24ndCB0cmFwLiAgKi8KICAgaWYgKERSX1dfVU5DT05ESVRJ T05BTExZICgqbWFzdGVyX2RyKSkKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEy MjgsMTMgKzEyNzIsMTYgQEAgaWZfY29udmVydGlibGVfbG9vcF9wXzEgKHN0 cnVjdCBsb29wICpsb29wLAogCiAgIGRhdGFfcmVmZXJlbmNlX3AgZHI7CiAK LSAgcmVmX0RSX21hcCA9IG5ldyBoYXNoX21hcDx0cmVlX29wZXJhbmRfaGFz aCwgZGF0YV9yZWZlcmVuY2VfcD47CisgIGlubmVybW9zdF9EUl9tYXAKKwkg ID0gbmV3IGhhc2hfbWFwPGlubmVybW9zdF9sb29wX2JlaGF2aW9yX2hhc2gs IGRhdGFfcmVmZXJlbmNlX3A+OwogICBiYXNlcmVmX0RSX21hcCA9IG5ldyBo YXNoX21hcDx0cmVlX29wZXJhbmRfaGFzaCwgZGF0YV9yZWZlcmVuY2VfcD47 CiAKICAgcHJlZGljYXRlX2JicyAobG9vcCk7CiAKICAgZm9yIChpID0gMDsg cmVmcy0+aXRlcmF0ZSAoaSwgJmRyKTsgaSsrKQogICAgIHsKKyAgICAgIHRy ZWUgcmVmID0gRFJfUkVGIChkcik7CisKICAgICAgIGRyLT5hdXggPSBYTkVX IChzdHJ1Y3QgaWZjX2RyKTsKICAgICAgIERSX0JBU0VfV19VTkNPTkRJVElP TkFMTFkgKGRyKSA9IGZhbHNlOwogICAgICAgRFJfUldfVU5DT05ESVRJT05B TExZIChkcikgPSBmYWxzZTsKQEAgLTEyNDQsNiArMTI5MSwyNyBAQCBpZl9j b252ZXJ0aWJsZV9sb29wX3BfMSAoc3RydWN0IGxvb3AgKmxvb3AsCiAgICAg ICBJRkNfRFIgKGRyKS0+YmFzZV93X3ByZWRpY2F0ZSA9IGJvb2xlYW5fZmFs c2Vfbm9kZTsKICAgICAgIGlmIChnaW1wbGVfdWlkIChEUl9TVE1UIChkcikp ID09IDApCiAJZ2ltcGxlX3NldF91aWQgKERSX1NUTVQgKGRyKSwgaSArIDEp OworCisgICAgICAvKiBJZiBEUiBkb2Vzbid0IGhhdmUgaW5uZXJtb3N0IGxv b3AgYmVoYXZpb3Igb3IgaXQncyBhIGNvbXBvdW5kCisgICAgICAgICBtZW1v cnkgcmVmZXJlbmNlLCB3ZSBzeW50aGVzaXplIGl0cyBpbm5lcm1vc3QgbG9v cCBiZWhhdmlvcgorICAgICAgICAgZm9yIGhhc2hpbmcuICAqLworICAgICAg aWYgKFRSRUVfQ09ERSAocmVmKSA9PSBDT01QT05FTlRfUkVGCisgICAgICAg ICAgfHwgVFJFRV9DT0RFIChyZWYpID09IElNQUdQQVJUX0VYUFIKKyAgICAg ICAgICB8fCBUUkVFX0NPREUgKHJlZikgPT0gUkVBTFBBUlRfRVhQUgorICAg ICAgICAgIHx8ICEoRFJfQkFTRV9BRERSRVNTIChkcikgfHwgRFJfT0ZGU0VU IChkcikKKwkgICAgICAgfHwgRFJfSU5JVCAoZHIpIHx8IERSX1NURVAgKGRy KSkpCisgICAgICAgIHsKKyAgICAgICAgICB3aGlsZSAoVFJFRV9DT0RFIChy ZWYpID09IENPTVBPTkVOVF9SRUYKKwkgICAgICAgICB8fCBUUkVFX0NPREUg KHJlZikgPT0gSU1BR1BBUlRfRVhQUgorCSAgICAgICAgIHx8IFRSRUVfQ09E RSAocmVmKSA9PSBSRUFMUEFSVF9FWFBSKQorCSAgICByZWYgPSBUUkVFX09Q RVJBTkQgKHJlZiwgMCk7CisKKyAgICAgICAgICBEUl9CQVNFX0FERFJFU1Mg KGRyKSA9IHJlZjsKKyAgICAgICAgICBEUl9PRkZTRVQgKGRyKSA9IE5VTEw7 CisgICAgICAgICAgRFJfSU5JVCAoZHIpID0gTlVMTDsKKyAgICAgICAgICBE Ul9TVEVQIChkcikgPSBOVUxMOworICAgICAgICAgIERSX0FMSUdORURfVE8g KGRyKSA9IE5VTEw7CisgICAgICAgIH0KICAgICAgIGhhc2hfbWVtcmVmc19i YXNlcmVmc19hbmRfc3RvcmVfRFJzX3JlYWRfd3JpdHRlbl9pbmZvIChkcik7 CiAgICAgfQogCkBAIC0xMzM4LDggKzE0MDYsOCBAQCBpZl9jb252ZXJ0aWJs ZV9sb29wX3AgKHN0cnVjdCBsb29wICpsb29wLCBib29sICphbnlfbWFza19s b2FkX3N0b3JlKQogCiAgIGZyZWVfZGF0YV9yZWZzIChyZWZzKTsKIAotICBk ZWxldGUgcmVmX0RSX21hcDsKLSAgcmVmX0RSX21hcCA9IE5VTEw7CisgIGRl bGV0ZSBpbm5lcm1vc3RfRFJfbWFwOworICBpbm5lcm1vc3RfRFJfbWFwID0g TlVMTDsKIAogICBkZWxldGUgYmFzZXJlZl9EUl9tYXA7CiAgIGJhc2VyZWZf RFJfbWFwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL2lmYy1wcjY5NDg5LTEuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL2lmYy1wcjY5NDg5LTEuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE2NzMxCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvaWZjLXByNjk0 ODktMS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnRyZWUtdmVjdG9yaXplIC1m ZHVtcC10cmVlLWlmY3Z0LXN0YXRzIiB7IHRhcmdldCAqLSotKiB9IH0gKi8K Kwordm9pZCBmb28gKGludCBhW10sIGludCBiW10pCit7CisgIGludCBpOwor ICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgeworICAgICAgaWYg KGFbaV0gPT0gMCkKKwlhW2ldID0gYltpXSo0OworICAgICAgZWxzZQorCWFb aV0gPSBiW2ldKjM7CisgICAgfQorfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgIkFwcGx5aW5nIGlmLWNvbnZlcnNpb24iIDEg ImlmY3Z0IiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL3ZlY3QvcHI1NjYyNS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVj dC9wcjU2NjI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MC4uYjkwM2JlMwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3ZlY3QvcHI1NjYyNS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsg ZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZl LXRhcmdldCB2ZWN0X2ludCB9ICovCisKK3ZvaWQgZm9vIChpbnQgYVtdLCBp bnQgYltdKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsg aSsrKQorICAgIHsKKyAgICAgIGlmIChhW2ldID09IDApCisJYVtpXSA9IGJb aV0qNDsKKyAgICAgIGVsc2UKKwlhW2ldID0gYltpXSozOworICAgIH0KK30K KworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2ZWN0 b3JpemVkIDEgbG9vcHMiIDEgInZlY3QiIH0gfSAqLwo= --001a113979f6d6209f052f5af797--