From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 85715 invoked by alias); 16 Jun 2015 14:12:13 -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 85701 invoked by uid 89); 16 Jun 2015 14:12:12 -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-oi0-f54.google.com Received: from mail-oi0-f54.google.com (HELO mail-oi0-f54.google.com) (209.85.218.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 16 Jun 2015 14:12:10 +0000 Received: by oigx81 with SMTP id x81so12182657oig.1 for ; Tue, 16 Jun 2015 07:12:08 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.182.181.103 with SMTP id dv7mr441458obc.25.1434463928247; Tue, 16 Jun 2015 07:12:08 -0700 (PDT) Received: by 10.202.106.145 with HTTP; Tue, 16 Jun 2015 07:12:08 -0700 (PDT) In-Reply-To: References: Date: Tue, 16 Jun 2015 14:39: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=089e0111da7ee40f9c0518a32874 X-SW-Source: 2015-06/txt/msg01137.txt.bz2 --089e0111da7ee40f9c0518a32874 Content-Type: text/plain; charset=UTF-8 Content-length: 4849 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. I did not change tests for outer loops in slpeel_can_duplicate_loop_p as you proposed since it is not called outside vectorization. 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? 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. --089e0111da7ee40f9c0518a32874 Content-Type: application/octet-stream; name="patch.1.2" Content-Disposition: attachment; filename="patch.1.2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iazekj090 Content-length: 8528 SW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LW91dGVyLXNpbWQt Mi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHRlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC92ZWN0LW91dGVyLXNpbWQtMi5jCShyZXZpc2lvbiAwKQorKysg dGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtb3V0ZXItc2ltZC0yLmMJKHdv cmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyogeyBkZy1yZXF1aXJl LWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9zaW1kX2Nsb25lcyB9ICovCisvKiB7 IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAiLWZvcGVubXAtc2ltZCAtZmZhc3Qt bWF0aCIgfSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInRy ZWUtdmVjdC5oIgorI2RlZmluZSBOIDY0CisKK2Zsb2F0ICpweCwgKnB5Owor ZmxvYXQgKnR4LCAqdHk7CitmbG9hdCAqeDEsICp6MSwgKnQxLCAqdDI7CisK K3N0YXRpYyB2b2lkIGlubGluZSBiYXIgKGNvbnN0IGZsb2F0IGN4LCBmbG9h dCBjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdngsIGZs b2F0ICp2eSkKK3sKKyAgaW50IGo7CisgICAgZm9yIChqID0gMDsgaiA8IE47 ICsraikKKyAgICB7CisgICAgICAgIGNvbnN0IGZsb2F0IGR4ICA9IGN4IC0g cHhbal07CisgICAgICAgIGNvbnN0IGZsb2F0IGR5ICA9IGN5IC0gcHlbal07 CisgICAgICAgICp2eCAgICAgICAgICAgICAgIC09IGR4ICogdHhbal07Cisg ICAgICAgICp2eSAgICAgICAgICAgICAgIC09IGR5ICogdHlbal07CisgICAg fQorfQorCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSwgbm9jbG9uZSkpIHZv aWQgZm9vMSAoaW50IG4pCit7CisgIGludCBpOworI3ByYWdtYSBvbXAgc2lt ZAorICBmb3IgKGk9MDsgaTxuOyBpKyspCisgICAgYmFyIChweFtpXSwgcHlb aV0sIHgxK2ksIHoxK2kpOworfQorCitfX2F0dHJpYnV0ZV9fKChub2lubGlu ZSwgbm9jbG9uZSkpIHZvaWQgZm9vMiAoaW50IG4pCit7CisgIHZvbGF0aWxl IGludCBpOworICBmb3IgKGk9MDsgaTxuOyBpKyspCisgICAgYmFyIChweFtp XSwgcHlbaV0sIHgxK2ksIHoxK2kpOworfQorCisKK2ludCBtYWluICgpCit7 CisgIGZsb2F0ICpYID0gKGZsb2F0KiltYWxsb2MgKE4gKiA4ICogc2l6ZW9m IChmbG9hdCkpOworICBpbnQgaTsKKyAgaW50IG4gPSBOIC0gMTsKKyAgY2hl Y2tfdmVjdCAoKTsKKyAgcHggPSAmWFswXTsKKyAgcHkgPSAmWFtOICogMV07 CisgIHR4ID0gJlhbTiAqIDJdOworICB0eSA9ICZYW04gKiAzXTsKKyAgeDEg PSAmWFtOICogNF07CisgIHoxID0gJlhbTiAqIDVdOworICB0MSA9ICZYW04g KiA2XTsKKyAgdDIgPSAmWFtOICogN107CisKKyAgZm9yIChpPTA7IGk8Tjsg aSsrKQorICAgIHsKKyAgICAgIHB4W2ldID0gKGZsb2F0KSAoaSsyKTsKKyAg ICAgIHR4W2ldID0gKGZsb2F0KSAoaSsxKTsKKyAgICAgIHB5W2ldID0gKGZs b2F0KSAoaSs0KTsKKyAgICAgIHR5W2ldID0gKGZsb2F0KSAoaSszKTsKKyAg ICAgIHgxW2ldID0gejFbaV0gPSAxLjBmOworICAgIH0KKyAgZm9vMSAobik7 ICAvKiB2ZWN0b3IgdmFyaWFudC4gICovCisgIGZvciAoaT0wOyBpPE47aSsr KQorICAgIHsKKyAgICAgIHQxW2ldID0geDFbaV07IHgxW2ldID0gMS4wZjsK KyAgICAgIHQyW2ldID0gejFbaV07IHoxW2ldID0gMS4wZjsKKyAgICB9Cisg IGZvbzIgKG4pOyAgLyogc2NhbGFyIHZhcmlhbnQuICAqLworICBmb3IgKGk9 MDsgaTxOOyBpKyspCisgICAgaWYgKHgxW2ldICE9IHQxW2ldIHx8IHoxW2ld ICE9IHQyW2ldKQorICAgICAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfQor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJPVVRFUiBMT09QIFZF Q1RPUklaRUQiICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRyZWUtdmVjdC1kYXRh LXJlZnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0cmVlLXZlY3Qt ZGF0YS1yZWZzLmMJKHJldmlzaW9uIDIyNDEwMCkKKysrIHRyZWUtdmVjdC1k YXRhLXJlZnMuYwkod29ya2luZyBjb3B5KQpAQCAtOTk4LDcgKzk5OCwxMiBA QAogICBnaW1wbGUgc3RtdCA9IERSX1NUTVQgKGRyKTsKICAgc3RtdF92ZWNf aW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7CiAgIHRy ZWUgdmVjdHlwZSA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF9pbmZvKTsK KyAgbG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvID0gU1RNVF9WSU5GT19MT09Q X1ZJTkZPIChzdG10X2luZm8pOwogCisgIC8qIFBlZWxpbmcgb2Ygb3V0ZXIg bG9vcHMgY2FuJ3QgaW1wcm92ZSBhbGlnbm1lbnQuICAqLworICBpZiAobG9v cF92aW5mbyAmJiBMT09QX1ZJTkZPX0xPT1AgKGxvb3BfdmluZm8pLT5pbm5l cikKKyAgICByZXR1cm4gZmFsc2U7CisKICAgaWYgKFNUTVRfVklORk9fR1JP VVBFRF9BQ0NFU1MgKHN0bXRfaW5mbykpCiAgICAgewogICAgICAgLyogRm9y IGludGVybGVhdmVkIGFjY2VzcyB3ZSBwZWVsIG9ubHkgaWYgbnVtYmVyIG9m IGl0ZXJhdGlvbnMgaW4KQEAgLTE1MzcsOCArMTU0Miw5IEBACiAgICAgfQog CiAgIC8qIENoZWNrIGlmIHdlIGNhbiBwb3NzaWJseSBwZWVsIHRoZSBsb29w LiAgKi8KLSAgaWYgKCF2ZWN0X2Nhbl9hZHZhbmNlX2l2c19wIChsb29wX3Zp bmZvKQotICAgICAgfHwgIXNscGVlbF9jYW5fZHVwbGljYXRlX2xvb3BfcCAo bG9vcCwgc2luZ2xlX2V4aXQgKGxvb3ApKSkKKyAgaWYgKGRvX3BlZWxpbmcK KyAgICAgICYmICghdmVjdF9jYW5fYWR2YW5jZV9pdnNfcCAobG9vcF92aW5m bykKKwkgIHx8ICFzbHBlZWxfY2FuX2R1cGxpY2F0ZV9sb29wX3AgKGxvb3As IHNpbmdsZV9leGl0IChsb29wKSkpKQogICAgIGRvX3BlZWxpbmcgPSBmYWxz ZTsKIAogICBpZiAoZG9fcGVlbGluZwpJbmRleDogdHJlZS12ZWN0LWxvb3At bWFuaXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0cmVlLXZlY3Qt bG9vcC1tYW5pcC5jCShyZXZpc2lvbiAyMjQxMDApCisrKyB0cmVlLXZlY3Qt bG9vcC1tYW5pcC5jCSh3b3JraW5nIGNvcHkpCkBAIC05NywxMCArOTcsMTIg QEAKIH0KIAogCi0vKiBSZW5hbWVzIHRoZSB2YXJpYWJsZXMgaW4gYmFzaWMg YmxvY2sgQkIuICAqLworLyogUmVuYW1lcyB0aGUgdmFyaWFibGVzIGluIGJh c2ljIGJsb2NrIEJCLiAgQWxsb3cgcmVuYW1pbmcgIG9mIFBISSBhcmd1bW5l dHMKKyAgIG9uIGVkZ2VzIGluY29taW5nIGZyb20gb3V0ZXItYmxvY2sgaGVh ZGVyIGlmIFJFTkFNRV9GUk9NX09VVEVSX0xPT1AgaXMKKyAgIHRydWUuICAq LwogCiBzdGF0aWMgdm9pZAotcmVuYW1lX3ZhcmlhYmxlc19pbl9iYiAoYmFz aWNfYmxvY2sgYmIpCityZW5hbWVfdmFyaWFibGVzX2luX2JiIChiYXNpY19i bG9jayBiYiwgYm9vbCByZW5hbWVfZnJvbV9vdXRlcl9sb29wKQogewogICBn aW1wbGUgc3RtdDsKICAgdXNlX29wZXJhbmRfcCB1c2VfcDsKQEAgLTEwOCw3 ICsxMTAsMTQgQEAKICAgZWRnZSBlOwogICBlZGdlX2l0ZXJhdG9yIGVpOwog ICBzdHJ1Y3QgbG9vcCAqbG9vcCA9IGJiLT5sb29wX2ZhdGhlcjsKKyAgc3Ry dWN0IGxvb3AgKm91dGVyX2xvb3AgPSBOVUxMOwogCisgIGlmIChyZW5hbWVf ZnJvbV9vdXRlcl9sb29wKQorICAgIHsKKyAgICAgIGdjY19hc3NlcnQgKGxv b3ApOworICAgICAgb3V0ZXJfbG9vcCA9IGxvb3Bfb3V0ZXIgKGxvb3ApOwor ICAgIH0KKwogICBmb3IgKGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdz aV9zdGFydF9iYiAoYmIpOyAhZ3NpX2VuZF9wIChnc2kpOwogICAgICAgIGdz aV9uZXh0ICgmZ3NpKSkKICAgICB7CkBAIC0xMTksNyArMTI4LDggQEAKIAog ICBGT1JfRUFDSF9FREdFIChlLCBlaSwgYmItPnByZWRzKQogICAgIHsKLSAg ICAgIGlmICghZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29wLCBlLT5zcmMp KQorICAgICAgaWYgKCFmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3AsIGUt PnNyYykKKwkgICYmICghcmVuYW1lX2Zyb21fb3V0ZXJfbG9vcCB8fCBlLT5z cmMgIT0gb3V0ZXJfbG9vcC0+aGVhZGVyKSkKIAljb250aW51ZTsKICAgICAg IGZvciAoZ3BoaV9pdGVyYXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAoYmIp OyAhZ3NpX2VuZF9wIChnc2kpOwogCSAgIGdzaV9uZXh0ICgmZ3NpKSkKQEAg LTc3NSw2ICs3ODUsNyBAQAogICBib29sIHdhc19pbW1fZG9tOwogICBiYXNp Y19ibG9jayBleGl0X2Rlc3Q7CiAgIGVkZ2UgZXhpdCwgbmV3X2V4aXQ7Cisg IGJvb2wgZHVwbGljYXRlX291dGVyX2xvb3AgPSBmYWxzZTsKIAogICBleGl0 ID0gc2luZ2xlX2V4aXQgKGxvb3ApOwogICBhdF9leGl0ID0gKGUgPT0gZXhp dCk7CkBAIC03ODYsNyArNzk3LDkgQEAKIAogICBiYnMgPSBYTkVXVkVDIChi YXNpY19ibG9jaywgc2NhbGFyX2xvb3AtPm51bV9ub2RlcyArIDEpOwogICBn ZXRfbG9vcF9ib2R5X3dpdGhfc2l6ZSAoc2NhbGFyX2xvb3AsIGJicywgc2Nh bGFyX2xvb3AtPm51bV9ub2Rlcyk7Ci0KKyAgLyogQWxsb3cgZHVwbGljYXRp b24gb2Ygb3V0ZXIgbG9vcHMuICAqLworICBpZiAoc2NhbGFyX2xvb3AtPmlu bmVyKQorICAgIGR1cGxpY2F0ZV9vdXRlcl9sb29wID0gdHJ1ZTsKICAgLyog Q2hlY2sgd2hldGhlciBkdXBsaWNhdGlvbiBpcyBwb3NzaWJsZS4gICovCiAg IGlmICghY2FuX2NvcHlfYmJzX3AgKGJicywgc2NhbGFyX2xvb3AtPm51bV9u b2RlcykpCiAgICAgewpAQCAtODU1LDcgKzg2OCw3IEBACiAgICAgICByZWRp cmVjdF9lZGdlX2FuZF9icmFuY2hfZm9yY2UgKGUsIG5ld19wcmVoZWFkZXIp OwogICAgICAgZmx1c2hfcGVuZGluZ19zdG10cyAoZSk7CiAgICAgICBzZXRf aW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIG5ld19wcmVo ZWFkZXIsIGUtPnNyYyk7Ci0gICAgICBpZiAod2FzX2ltbV9kb20pCisgICAg ICBpZiAod2FzX2ltbV9kb20gfHwgZHVwbGljYXRlX291dGVyX2xvb3ApCiAJ c2V0X2ltbWVkaWF0ZV9kb21pbmF0b3IgKENESV9ET01JTkFUT1JTLCBleGl0 X2Rlc3QsIG5ld19leGl0LT5zcmMpOwogCiAgICAgICAvKiBBbmQgcmVtb3Zl IHRoZSBub24tbmVjZXNzYXJ5IGZvcndhcmRlciBhZ2Fpbi4gIEtlZXAgdGhl IG90aGVyCkBAIC04OTgsNyArOTExLDcgQEAKICAgICB9CiAKICAgZm9yICh1 bnNpZ25lZCBpID0gMDsgaSA8IHNjYWxhcl9sb29wLT5udW1fbm9kZXMgKyAx OyBpKyspCi0gICAgcmVuYW1lX3ZhcmlhYmxlc19pbl9iYiAobmV3X2Jic1tp XSk7CisgICAgcmVuYW1lX3ZhcmlhYmxlc19pbl9iYiAobmV3X2Jic1tpXSwg ZHVwbGljYXRlX291dGVyX2xvb3ApOwogCiAgIGlmIChzY2FsYXJfbG9vcCAh PSBsb29wKQogICAgIHsKQEAgLTk4NSw3ICs5OTgsOSBAQAogICAgKDMpIGl0 IGlzIHNpbmdsZSBlbnRyeSwgc2luZ2xlIGV4aXQKICAgICg0KSBpdHMgZXhp dCBjb25kaXRpb24gaXMgdGhlIGxhc3Qgc3RtdCBpbiB0aGUgaGVhZGVyCiAg ICAoNSkgRSBpcyB0aGUgZW50cnkvZXhpdCBlZGdlIG9mIExPT1AuCi0gKi8K KyAgIEFsbG93IGR1cGxpY2F0aW9uIG9mIG91dGVyIGxvb3BzIGlmIGl0IGlz IGNvbnNpc3RzIG9mIGV4YWN0bHkgNSBiYXNpYworICAgYmxvY2tzLgorICAg T3RoZXIgY29uZGl0aW9ucyBhcmUgdGFrZW4gYWJvdmUuICAqLwogCiBib29s CiBzbHBlZWxfY2FuX2R1cGxpY2F0ZV9sb29wX3AgKGNvbnN0IHN0cnVjdCBs b29wICpsb29wLCBjb25zdF9lZGdlIGUpCkBAIC05OTUsNiArMTAxMCwxMiBA QAogICBnY29uZCAqb3JpZ19jb25kID0gZ2V0X2xvb3BfZXhpdF9jb25kaXRp b24gKGxvb3ApOwogICBnaW1wbGVfc3RtdF9pdGVyYXRvciBsb29wX2V4aXRf Z3NpID0gZ3NpX2xhc3RfYmIgKGV4aXRfZS0+c3JjKTsKIAorICBpZiAobG9v cC0+aW5uZXIgJiYgbG9vcC0+bnVtX25vZGVzID09IDUKKyAgICAgICYmIGVt cHR5X2Jsb2NrX3AgKGxvb3AtPmxhdGNoKQorICAgICAgJiYgc2luZ2xlX2V4 aXQgKGxvb3ApICYmIChlID09IGV4aXRfZSB8fCBlID09IGVudHJ5X2UpCisg ICAgICAmJiBvcmlnX2NvbmQgJiYgb3JpZ19jb25kID09IGdzaV9zdG10IChs b29wX2V4aXRfZ3NpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKwogICBpZiAobG9v cC0+aW5uZXIKICAgICAgIC8qIEFsbCBsb29wcyBoYXZlIGFuIG91dGVyIHNj b3BlOyB0aGUgb25seSBjYXNlIGxvb3AtPm91dGVyIGlzIE5VTEwgaXMgZm9y CiAgICAgICAgICB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8K --089e0111da7ee40f9c0518a32874--