From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107011 invoked by alias); 17 Jun 2015 16:35:29 -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 106996 invoked by uid 89); 17 Jun 2015 16:35:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ob0-f170.google.com Received: from mail-ob0-f170.google.com (HELO mail-ob0-f170.google.com) (209.85.214.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 17 Jun 2015 16:35:25 +0000 Received: by obbgp2 with SMTP id gp2so36697159obb.2 for ; Wed, 17 Jun 2015 09:35:23 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.182.181.103 with SMTP id dv7mr5248090obc.25.1434558923792; Wed, 17 Jun 2015 09:35:23 -0700 (PDT) Received: by 10.202.106.145 with HTTP; Wed, 17 Jun 2015 09:35:23 -0700 (PDT) In-Reply-To: References: Date: Wed, 17 Jun 2015 17:13:00 -0000 Message-ID: Subject: Re: [PATCH] Yet another simple fix to enhance outer-loop vectorization. From: Yuri Rumyantsev To: Richard Biener Cc: gcc-patches , Igor Zamyatin Content-Type: multipart/mixed; boundary=089e0111da7e1064cd0518b94742 X-SW-Source: 2015-06/txt/msg01214.txt.bz2 --089e0111da7e1064cd0518b94742 Content-Type: text/plain; charset=UTF-8 Content-length: 7882 Richard, I attached updated patch. You asked me to explain why I did changes for renaming. If we do not change PHI arguments for inner loop header we can get the following IR: source outer loop: : outer-loop header # i_45 = PHI <0(4), i_18(9)> # .MEM_17 = PHI <.MEM_4(D)(4), .MEM_44(9)> :inner-loop header # .MEM_46 = PHI <.MEM_44(7), .MEM_17(5)> after duplication we have (without argument correction): : # i_74 = PHI # .MEM_73 = PHI <.MEM_97(13), .MEM_4(D)(17)> : # .MEM_63 = PHI <.MEM_17(12), .MEM_97(16)> and later we get verifier error: test1.c:20:6: error: definition in block 6 does not dominate use in block 10 void foo (int n) ^ for SSA_NAME: .MEM_17 in statement: .MEM_63 = PHI <.MEM_17(10), .MEM_97(14)> and you can see that we need to rename MEM_17 argument for out-coming edge to MEM_73 since MEM_17 was converted to MEM_73 in outer-loop header. This explains my simple fix in rename_variables_in_bb. Note also that loop distribution is not performed for outer loops. I also did a change in slpeel_can_duplicate_loop_p to simplify check. Any comments will be appreciated. Yuri. 2015-06-17 15:24 GMT+03:00 Richard Biener : > On Tue, Jun 16, 2015 at 4:12 PM, Yuri Rumyantsev wrote: >> Thanks a lot Richard for your review. >> >> I presented updated patch which is not gated by force_vectorize. >> I added test on outer-loop in vect_enhance_data_refs_alignment >> and it returns false for it because we can not improve dr alighment >> through outer-loop peeling in general. So I assume that only >> versioning for alignment can be applied for targets do not support >> unaligned memory access. > > @@ -998,7 +998,12 @@ > gimple stmt = DR_STMT (dr); > stmt_vec_info stmt_info = vinfo_for_stmt (stmt); > tree vectype = STMT_VINFO_VECTYPE (stmt_info); > + loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); > > + /* Peeling of outer loops can't improve alignment. */ > + if (loop_vinfo && LOOP_VINFO_LOOP (loop_vinfo)->inner) > + return false; > + > > but this looks wrong. It depends on the context (DRs in the outer loop > can improve alignment by peeling the outer loop and we can still > peel the inner loop for alignment). > > So IMHO the correct place to amend is vect_enhance_data_refs_alignment > (which it seems doesn't consider peeling the inner loop). > > I'd say you should simply add > > || loop->inner) > > to the > > /* Check if we can possibly peel the loop. */ > if (!vect_can_advance_ivs_p (loop_vinfo) > || !slpeel_can_duplicate_loop_p (loop, single_exit (loop))) > do_peeling = false; > > check. > >> I did not change tests for outer loops in slpeel_can_duplicate_loop_p >> as you proposed since it is not called outside vectorization. > > There is still no reason for this complex condition, so please remove it. > > _Please_ also generate diffs with -p, it is very tedious to see patch hunks > without a function name context. > > You didn't explain why you needed the renaming changes as I don't > remember needing it when using the code from loop distribution. > >> I also noticed one not-resolved issue with outer-loop peeling - we don't >> consider remainder for possible vectorization of inner-loop as we can see >> on the following example: >> >> for (i = 0; i < n; i++) { >> diff = 0; >> for (j = 0; j < M; j++) { >> diff += in[j+i]*coeff[j]; >> } >> out[i] = diff; >> } >> >> Is it worth to fix it? > > You mean vectorizing the inner loop in the niter peel epilogue loop > of the outer loop? Possibly yes. > > Thanks, > Richard. > >> 2015-06-16 Yuri Rumyantsev >> >> * tree-vect-loop-manip.c (rename_variables_in_bb): Add argument >> to allow renaming of PHI arguments on edges incoming from outer >> loop header, add corresponding check before start PHI iterator. >> (slpeel_tree_duplicate_loop_to_edge_cfg): Introduce new bool >> variable DUPLICATE_OUTER_LOOP and set it to true for outer loops >> with true force_vectorize. Set-up dominator for outer loop too. >> Pass DUPLICATE_OUTER_LOOP as argument to rename_variables_in_bb. >> (slpeel_can_duplicate_loop_p): Allow duplicate of outer loop if it >> was marked with force_vectorize and has restricted cfg. >> * tree-vect-data-refs.c (vector_alignment_reachable_p): Alignment can >> not be reachable for outer loops. >> (vect_enhance_data_refs_alignment): Add test on true value of >> do_peeling. >> >> gcc/testsuite/ChangeLog: >> * gcc.dg/vect/vect-outer-simd-2.c: New test. >> >> 2015-06-09 16:26 GMT+03:00 Richard Biener : >>> On Mon, Jun 8, 2015 at 12:27 PM, Yuri Rumyantsev wrote: >>>> Hi All, >>>> >>>> Here is a simple fix which allows duplication of outer loops to >>>> perform peeling for number of iterations if outer loop is marked with >>>> pragma omp simd. >>>> >>>> Bootstrap and regression testing did not show any new failures. >>>> Is it OK for trunk? >>> >>> Hmm, I don't remember needing to adjust rename_variables_in_bb >>> when teaching loop distibution to call slpeel_tree_duplicate_to_edge_cfg >>> on non-innermost loops... (I just copied, I never called >>> slpeel_can_duplicate_loop_p though). >>> >>> So - you should just remove the loop->inner condition from >>> slpeel_can_duplicate_loop_p as it is used by non-vectorizer >>> code as well (yeah, I never merged the nested loop support >>> for loop distribution...). >>> >>> Index: tree-vect-loop.c >>> =================================================================== >>> --- tree-vect-loop.c (revision 224100) >>> +++ tree-vect-loop.c (working copy) >>> @@ -1879,6 +1879,10 @@ >>> return false; >>> } >>> >>> + /* Peeling for alignment is not supported for outer-loop vectorization. */ >>> + if (LOOP_VINFO_LOOP (loop_vinfo)->inner) >>> + LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) = 0; >>> >>> I think you can't simply do this - if vect_enhance_data_refs_alignment >>> decided to peel for alignment then it has adjusted the DRs alignment >>> info already. So instead of the above simply disallow peeling for >>> alignment in vect_enhance_data_refs_alignment? Thus add >>> || ->inner to >>> >>> /* Check if we can possibly peel the loop. */ >>> if (!vect_can_advance_ivs_p (loop_vinfo) >>> || !slpeel_can_duplicate_loop_p (loop, single_exit (loop))) >>> do_peeling = false; >>> >>> ? >>> >>> I also can't see why the improvement has to be gated on force_vect, >>> it surely looks profitable to enable more outer loop vectorization in >>> general, no? >>> >>> How do the cost model calculations end up with peeling the outer loop >>> for niter? >>> >>> On targets which don't support unaligned accesses we're left with >>> versioning for alignment. Isn't peeling for alignment better there? >>> Thus only disallow peeling for alignment if there is no unhandled >>> alignment? >>> >>> Thanks, >>> Richard. >>> >>>> ChangeLog: >>>> >>>> 2015-06-08 Yuri Rumyantsev >>>> >>>> * tree-vect-loop-manip.c (rename_variables_in_bb): Add argument >>>> to allow renaming of PHI arguments on edges incoming from outer >>>> loop header, add corresponding check before start PHI iterator. >>>> (slpeel_tree_duplicate_loop_to_edge_cfg): Introduce new bool >>>> variable DUPLICATE_OUTER_LOOP and set it to true for outer loops >>>> with true force_vectorize. Set-up dominator for outer loop too. >>>> Pass DUPLICATE_OUTER_LOOP as argument to rename_variables_in_bb. >>>> (slpeel_can_duplicate_loop_p): Allow duplicate of outer loop if it >>>> was marked with force_vectorize and has restricted cfg. >>>> * tre-vect-loop.c (vect_analyze_loop_2): Prohibit alignment peeling >>>> for outer loops. >>>> >>>> gcc/testsuite/ChangeLog: >>>> * gcc.dg/vect/vect-outer-simd-2.c: New test. --089e0111da7e1064cd0518b94742 Content-Type: application/octet-stream; name="patch.1.3" Content-Disposition: attachment; filename="patch.1.3" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ib0zb2r00 Content-length: 8980 ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC1v dXRlci1zaW1kLTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVj dC1vdXRlci1zaW1kLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi4zYWUxMDIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdmVjdC92ZWN0LW91dGVyLXNpbWQtMi5jCkBAIC0wLDAg KzEsNzUgQEAKKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZl Y3Rfc2ltZF9jbG9uZXMgfSAqLworLyogeyBkZy1hZGRpdGlvbmFsLW9wdGlv bnMgIi1mb3Blbm1wLXNpbWQgLWZmYXN0LW1hdGgiIH0gKi8KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKyNkZWZpbmUg TiA2NAorCitmbG9hdCAqcHgsICpweTsKK2Zsb2F0ICp0eCwgKnR5OworZmxv YXQgKngxLCAqejEsICp0MSwgKnQyOworCitzdGF0aWMgdm9pZCBpbmxpbmUg YmFyIChjb25zdCBmbG9hdCBjeCwgZmxvYXQgY3ksCisgICAgICAgICAgICAg ICAgICAgICAgICAgZmxvYXQgKnZ4LCBmbG9hdCAqdnkpCit7CisgIGludCBq OworICAgIGZvciAoaiA9IDA7IGogPCBOOyArK2opCisgICAgeworICAgICAg ICBjb25zdCBmbG9hdCBkeCAgPSBjeCAtIHB4W2pdOworICAgICAgICBjb25z dCBmbG9hdCBkeSAgPSBjeSAtIHB5W2pdOworICAgICAgICAqdnggICAgICAg ICAgICAgICAtPSBkeCAqIHR4W2pdOworICAgICAgICAqdnkgICAgICAgICAg ICAgICAtPSBkeSAqIHR5W2pdOworICAgIH0KK30KKworX19hdHRyaWJ1dGVf Xygobm9pbmxpbmUsIG5vY2xvbmUpKSB2b2lkIGZvbzEgKGludCBuKQorewor ICBpbnQgaTsKKyNwcmFnbWEgb21wIHNpbWQKKyAgZm9yIChpPTA7IGk8bjsg aSsrKQorICAgIGJhciAocHhbaV0sIHB5W2ldLCB4MStpLCB6MStpKTsKK30K KworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUsIG5vY2xvbmUpKSB2b2lkIGZv bzIgKGludCBuKQoreworICB2b2xhdGlsZSBpbnQgaTsKKyAgZm9yIChpPTA7 IGk8bjsgaSsrKQorICAgIGJhciAocHhbaV0sIHB5W2ldLCB4MStpLCB6MStp KTsKK30KKworCitpbnQgbWFpbiAoKQoreworICBmbG9hdCAqWCA9IChmbG9h dCopbWFsbG9jIChOICogOCAqIHNpemVvZiAoZmxvYXQpKTsKKyAgaW50IGk7 CisgIGludCBuID0gTiAtIDE7CisgIGNoZWNrX3ZlY3QgKCk7CisgIHB4ID0g JlhbMF07CisgIHB5ID0gJlhbTiAqIDFdOworICB0eCA9ICZYW04gKiAyXTsK KyAgdHkgPSAmWFtOICogM107CisgIHgxID0gJlhbTiAqIDRdOworICB6MSA9 ICZYW04gKiA1XTsKKyAgdDEgPSAmWFtOICogNl07CisgIHQyID0gJlhbTiAq IDddOworCisgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICB7CisgICAgICBw eFtpXSA9IChmbG9hdCkgKGkrMik7CisgICAgICB0eFtpXSA9IChmbG9hdCkg KGkrMSk7CisgICAgICBweVtpXSA9IChmbG9hdCkgKGkrNCk7CisgICAgICB0 eVtpXSA9IChmbG9hdCkgKGkrMyk7CisgICAgICB4MVtpXSA9IHoxW2ldID0g MS4wZjsKKyAgICB9CisgIGZvbzEgKG4pOyAgLyogdmVjdG9yIHZhcmlhbnQu ICAqLworICBmb3IgKGk9MDsgaTxOO2krKykKKyAgICB7CisgICAgICB0MVtp XSA9IHgxW2ldOyB4MVtpXSA9IDEuMGY7CisgICAgICB0MltpXSA9IHoxW2ld OyB6MVtpXSA9IDEuMGY7CisgICAgfQorICBmb28yIChuKTsgIC8qIHNjYWxh ciB2YXJpYW50LiAgKi8KKyAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgIGlm ICh4MVtpXSAhPSB0MVtpXSB8fCB6MVtpXSAhPSB0MltpXSkKKyAgICAgIGFi b3J0ICgpOworICByZXR1cm4gMDsKK30KKy8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcCAiT1VURVIgTE9PUCBWRUNUT1JJWkVEIiAidmVjdCIgfSB9 ICovCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LWRhdGEtcmVmcy5jIGIv Z2NjL3RyZWUtdmVjdC1kYXRhLXJlZnMuYwppbmRleCAzZmMxMjI2Li5mNmQ3 ODc0IDEwMDY0NAotLS0gYS9nY2MvdHJlZS12ZWN0LWRhdGEtcmVmcy5jCisr KyBiL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmMKQEAgLTE1MjUsNyArMTUy NSw4IEBAIHZlY3RfZW5oYW5jZV9kYXRhX3JlZnNfYWxpZ25tZW50IChsb29w X3ZlY19pbmZvIGxvb3BfdmluZm8pCiAKICAgLyogQ2hlY2sgaWYgd2UgY2Fu IHBvc3NpYmx5IHBlZWwgdGhlIGxvb3AuICAqLwogICBpZiAoIXZlY3RfY2Fu X2FkdmFuY2VfaXZzX3AgKGxvb3BfdmluZm8pCi0gICAgICB8fCAhc2xwZWVs X2Nhbl9kdXBsaWNhdGVfbG9vcF9wIChsb29wLCBzaW5nbGVfZXhpdCAobG9v cCkpKQorICAgICAgfHwgIXNscGVlbF9jYW5fZHVwbGljYXRlX2xvb3BfcCAo bG9vcCwgc2luZ2xlX2V4aXQgKGxvb3ApKQorICAgICAgfHwgbG9vcC0+aW5u ZXIpCiAgICAgZG9fcGVlbGluZyA9IGZhbHNlOwogCiAgIGlmIChkb19wZWVs aW5nCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LWxvb3AtbWFuaXAuYyBi L2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jCmluZGV4IDc5MGNjOTguLjQx NGUzNTcgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5j CisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jCkBAIC04OCwxMCAr ODgsMTIgQEAgcmVuYW1lX3VzZV9vcCAodXNlX29wZXJhbmRfcCBvcF9wKQog fQogCiAKLS8qIFJlbmFtZXMgdGhlIHZhcmlhYmxlcyBpbiBiYXNpYyBibG9j ayBCQi4gICovCisvKiBSZW5hbWVzIHRoZSB2YXJpYWJsZXMgaW4gYmFzaWMg YmxvY2sgQkIuICBBbGxvdyByZW5hbWluZyAgb2YgUEhJIGFyZ3VtbmV0cwor ICAgb24gZWRnZXMgaW5jb21pbmcgZnJvbSBvdXRlci1ibG9jayBoZWFkZXIg aWYgUkVOQU1FX0ZST01fT1VURVJfTE9PUCBpcworICAgdHJ1ZS4gICovCiAK IHN0YXRpYyB2b2lkCi1yZW5hbWVfdmFyaWFibGVzX2luX2JiIChiYXNpY19i bG9jayBiYikKK3JlbmFtZV92YXJpYWJsZXNfaW5fYmIgKGJhc2ljX2Jsb2Nr IGJiLCBib29sIHJlbmFtZV9mcm9tX291dGVyX2xvb3ApCiB7CiAgIGdpbXBs ZSBzdG10OwogICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwpAQCAtOTksNiArMTAx LDEzIEBAIHJlbmFtZV92YXJpYWJsZXNfaW5fYmIgKGJhc2ljX2Jsb2NrIGJi KQogICBlZGdlIGU7CiAgIGVkZ2VfaXRlcmF0b3IgZWk7CiAgIHN0cnVjdCBs b29wICpsb29wID0gYmItPmxvb3BfZmF0aGVyOworICBzdHJ1Y3QgbG9vcCAq b3V0ZXJfbG9vcCA9IE5VTEw7CisKKyAgaWYgKHJlbmFtZV9mcm9tX291dGVy X2xvb3ApCisgICAgeworICAgICAgZ2NjX2Fzc2VydCAobG9vcCk7CisgICAg ICBvdXRlcl9sb29wID0gbG9vcF9vdXRlciAobG9vcCk7CisgICAgfQogCiAg IGZvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpID0gZ3NpX3N0YXJ0X2Ji IChiYik7ICFnc2lfZW5kX3AgKGdzaSk7CiAgICAgICAgZ3NpX25leHQgKCZn c2kpKQpAQCAtMTEwLDcgKzExOSw4IEBAIHJlbmFtZV92YXJpYWJsZXNfaW5f YmIgKGJhc2ljX2Jsb2NrIGJiKQogCiAgIEZPUl9FQUNIX0VER0UgKGUsIGVp LCBiYi0+cHJlZHMpCiAgICAgewotICAgICAgaWYgKCFmbG93X2JiX2luc2lk ZV9sb29wX3AgKGxvb3AsIGUtPnNyYykpCisgICAgICBpZiAoIWZsb3dfYmJf aW5zaWRlX2xvb3BfcCAobG9vcCwgZS0+c3JjKQorCSAgJiYgKCFyZW5hbWVf ZnJvbV9vdXRlcl9sb29wIHx8IGUtPnNyYyAhPSBvdXRlcl9sb29wLT5oZWFk ZXIpKQogCWNvbnRpbnVlOwogICAgICAgZm9yIChncGhpX2l0ZXJhdG9yIGdz aSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKGdzaSk7CiAJ ICAgZ3NpX25leHQgKCZnc2kpKQpAQCAtNzY2LDYgKzc3Niw3IEBAIHNscGVl bF90cmVlX2R1cGxpY2F0ZV9sb29wX3RvX2VkZ2VfY2ZnIChzdHJ1Y3QgbG9v cCAqbG9vcCwKICAgYm9vbCB3YXNfaW1tX2RvbTsKICAgYmFzaWNfYmxvY2sg ZXhpdF9kZXN0OwogICBlZGdlIGV4aXQsIG5ld19leGl0OworICBib29sIGR1 cGxpY2F0ZV9vdXRlcl9sb29wID0gZmFsc2U7CiAKICAgZXhpdCA9IHNpbmds ZV9leGl0IChsb29wKTsKICAgYXRfZXhpdCA9IChlID09IGV4aXQpOwpAQCAt Nzc3LDcgKzc4OCw5IEBAIHNscGVlbF90cmVlX2R1cGxpY2F0ZV9sb29wX3Rv X2VkZ2VfY2ZnIChzdHJ1Y3QgbG9vcCAqbG9vcCwKIAogICBiYnMgPSBYTkVX VkVDIChiYXNpY19ibG9jaywgc2NhbGFyX2xvb3AtPm51bV9ub2RlcyArIDEp OwogICBnZXRfbG9vcF9ib2R5X3dpdGhfc2l6ZSAoc2NhbGFyX2xvb3AsIGJi cywgc2NhbGFyX2xvb3AtPm51bV9ub2Rlcyk7Ci0KKyAgLyogQWxsb3cgZHVw bGljYXRpb24gb2Ygb3V0ZXIgbG9vcHMuICAqLworICBpZiAoc2NhbGFyX2xv b3AtPmlubmVyKQorICAgIGR1cGxpY2F0ZV9vdXRlcl9sb29wID0gdHJ1ZTsK ICAgLyogQ2hlY2sgd2hldGhlciBkdXBsaWNhdGlvbiBpcyBwb3NzaWJsZS4g ICovCiAgIGlmICghY2FuX2NvcHlfYmJzX3AgKGJicywgc2NhbGFyX2xvb3At Pm51bV9ub2RlcykpCiAgICAgewpAQCAtODQ2LDcgKzg1OSw3IEBAIHNscGVl bF90cmVlX2R1cGxpY2F0ZV9sb29wX3RvX2VkZ2VfY2ZnIChzdHJ1Y3QgbG9v cCAqbG9vcCwKICAgICAgIHJlZGlyZWN0X2VkZ2VfYW5kX2JyYW5jaF9mb3Jj ZSAoZSwgbmV3X3ByZWhlYWRlcik7CiAgICAgICBmbHVzaF9wZW5kaW5nX3N0 bXRzIChlKTsKICAgICAgIHNldF9pbW1lZGlhdGVfZG9taW5hdG9yIChDRElf RE9NSU5BVE9SUywgbmV3X3ByZWhlYWRlciwgZS0+c3JjKTsKLSAgICAgIGlm ICh3YXNfaW1tX2RvbSkKKyAgICAgIGlmICh3YXNfaW1tX2RvbSB8fCBkdXBs aWNhdGVfb3V0ZXJfbG9vcCkKIAlzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAo Q0RJX0RPTUlOQVRPUlMsIGV4aXRfZGVzdCwgbmV3X2V4aXQtPnNyYyk7CiAK ICAgICAgIC8qIEFuZCByZW1vdmUgdGhlIG5vbi1uZWNlc3NhcnkgZm9yd2Fy ZGVyIGFnYWluLiAgS2VlcCB0aGUgb3RoZXIKQEAgLTg4OSw3ICs5MDIsNyBA QCBzbHBlZWxfdHJlZV9kdXBsaWNhdGVfbG9vcF90b19lZGdlX2NmZyAoc3Ry dWN0IGxvb3AgKmxvb3AsCiAgICAgfQogCiAgIGZvciAodW5zaWduZWQgaSA9 IDA7IGkgPCBzY2FsYXJfbG9vcC0+bnVtX25vZGVzICsgMTsgaSsrKQotICAg IHJlbmFtZV92YXJpYWJsZXNfaW5fYmIgKG5ld19iYnNbaV0pOworICAgIHJl bmFtZV92YXJpYWJsZXNfaW5fYmIgKG5ld19iYnNbaV0sIGR1cGxpY2F0ZV9v dXRlcl9sb29wKTsKIAogICBpZiAoc2NhbGFyX2xvb3AgIT0gbG9vcCkKICAg ICB7CkBAIC05NzEsMTEgKzk4NCwxMSBAQCBzbHBlZWxfYWRkX2xvb3BfZ3Vh cmQgKGJhc2ljX2Jsb2NrIGd1YXJkX2JiLCB0cmVlIGNvbmQsCiAKIAogLyog VGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IHRoZSBmb2xsb3dpbmcgcmVz dHJpY3Rpb25zIGFwcGx5IHRvIExPT1A6Ci0gICAoMSkgaXQgaXMgaW5uZXJt b3N0Ci0gICAoMikgaXQgY29uc2lzdHMgb2YgZXhhY3RseSAyIGJhc2ljIGJs b2NrcyAtIGhlYWRlciwgYW5kIGFuIGVtcHR5IGxhdGNoLgotICAgKDMpIGl0 IGlzIHNpbmdsZSBlbnRyeSwgc2luZ2xlIGV4aXQKLSAgICg0KSBpdHMgZXhp dCBjb25kaXRpb24gaXMgdGhlIGxhc3Qgc3RtdCBpbiB0aGUgaGVhZGVyCi0g ICAoNSkgRSBpcyB0aGUgZW50cnkvZXhpdCBlZGdlIG9mIExPT1AuCisgICAo MSkgaXQgY29uc2lzdHMgb2YgZXhhY3RseSAyIGJhc2ljIGJsb2NrcyAtIGhl YWRlciwgYW5kIGFuIGVtcHR5IGxhdGNoCisgICAgICAgZm9yIGlubmVybW9z dCBsb29wIGFuZCA1IGJhc2ljIGJsb2NrcyBmb3Igb3V0ZXItbG9vcC4KKyAg ICgyKSBpdCBpcyBzaW5nbGUgZW50cnksIHNpbmdsZSBleGl0CisgICAoMykg aXRzIGV4aXQgY29uZGl0aW9uIGlzIHRoZSBsYXN0IHN0bXQgaW4gdGhlIGhl YWRlcgorICAgKDQpIEUgaXMgdGhlIGVudHJ5L2V4aXQgZWRnZSBvZiBMT09Q LgogICovCiAKIGJvb2wKQEAgLTk4NSwxMiArOTk4LDEyIEBAIHNscGVlbF9j YW5fZHVwbGljYXRlX2xvb3BfcCAoY29uc3Qgc3RydWN0IGxvb3AgKmxvb3As IGNvbnN0X2VkZ2UgZSkKICAgZWRnZSBlbnRyeV9lID0gbG9vcF9wcmVoZWFk ZXJfZWRnZSAobG9vcCk7CiAgIGdjb25kICpvcmlnX2NvbmQgPSBnZXRfbG9v cF9leGl0X2NvbmRpdGlvbiAobG9vcCk7CiAgIGdpbXBsZV9zdG10X2l0ZXJh dG9yIGxvb3BfZXhpdF9nc2kgPSBnc2lfbGFzdF9iYiAoZXhpdF9lLT5zcmMp OworICB1bnNpZ25lZCBpbnQgbnVtX2JiID0gbG9vcC0+aW5uZXI/IDUgOiAy OwogCi0gIGlmIChsb29wLT5pbm5lcgogICAgICAgLyogQWxsIGxvb3BzIGhh dmUgYW4gb3V0ZXIgc2NvcGU7IHRoZSBvbmx5IGNhc2UgbG9vcC0+b3V0ZXIg aXMgTlVMTCBpcyBmb3IKICAgICAgICAgIHRoZSBmdW5jdGlvbiBpdHNlbGYu ICAqLwotICAgICAgfHwgIWxvb3Bfb3V0ZXIgKGxvb3ApCi0gICAgICB8fCBs b29wLT5udW1fbm9kZXMgIT0gMgorICAgICAgaWYgKCFsb29wX291dGVyIChs b29wKQorICAgICAgfHwgbG9vcC0+bnVtX25vZGVzICE9IG51bV9iYgogICAg ICAgfHwgIWVtcHR5X2Jsb2NrX3AgKGxvb3AtPmxhdGNoKQogICAgICAgfHwg IXNpbmdsZV9leGl0IChsb29wKQogICAgICAgLyogVmVyaWZ5IHRoYXQgbmV3 IGxvb3AgZXhpdCBjb25kaXRpb24gY2FuIGJlIHRyaXZpYWxseSBtb2RpZmll ZC4gICovCg== --089e0111da7e1064cd0518b94742--