From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 88506 invoked by alias); 10 Jul 2015 10:03:02 -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 88485 invoked by uid 89); 10 Jul 2015 10:03:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 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-f48.google.com Received: from mail-oi0-f48.google.com (HELO mail-oi0-f48.google.com) (209.85.218.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 10 Jul 2015 10:03:01 +0000 Received: by oiab3 with SMTP id b3so89753303oia.1 for ; Fri, 10 Jul 2015 03:02:59 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.60.39.65 with SMTP id n1mr18259212oek.31.1436522579349; Fri, 10 Jul 2015 03:02:59 -0700 (PDT) Received: by 10.202.106.145 with HTTP; Fri, 10 Jul 2015 03:02:59 -0700 (PDT) Date: Fri, 10 Jul 2015 10:03:00 -0000 Message-ID: Subject: [PATCH] Unswitching outer loops. From: Yuri Rumyantsev To: gcc-patches , Richard Biener , Igor Zamyatin Content-Type: multipart/mixed; boundary=089e013d085a0e38a3051a827adb X-SW-Source: 2015-07/txt/msg00864.txt.bz2 --089e013d085a0e38a3051a827adb Content-Type: text/plain; charset=UTF-8 Content-length: 1136 Hi All, Here is presented simple transformation which tries to hoist out of outer-loop a check on zero trip count for inner-loop. This is very restricted transformation since it accepts outer-loops with very simple cfg, as for example: acc = 0; for (i = 1; i <= m; i++) { for (j = 0; j < n; j++) if (l[j] == i) { v[j] = acc; acc++; }; acc <<= 1; } Note that degenerative outer loop (without inner loop) will be completely deleted as dead code. The main goal of this transformation was to convert outer-loop to form accepted by outer-loop vectorization (such test-case is also included to patch). Bootstrap and regression testing did not show any new failures. Is it OK for trunk? ChangeLog: 2015-07-10 Yuri Rumyantsev * tree-ssa-loop-unswitch.c: Include "tree-cfgcleanup.h" and "gimple-iterator.h", add prototype for tree_unswitch_outer_loop. (tree_ssa_unswitch_loops): Add invoke of tree_unswitch_outer_loop. (tree_unswitch_outer_loop): New function. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/unswitch-outer-loop-1.c: New test. * gcc.dg/vect/vect-outer-simd-3.c: New test. --089e013d085a0e38a3051a827adb Content-Type: application/octet-stream; name="patch.3" Content-Disposition: attachment; filename="patch.3" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ibxgfw0a0 Content-length: 13067 ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3Vu c3dpdGNoLW91dGVyLWxvb3AtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv dHJlZS1zc2EvdW5zd2l0Y2gtb3V0ZXItbG9vcC0xLmMKbmV3IGZpbGUgbW9k ZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjk2ZDE4ZgotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3Vuc3dpdGNo LW91dGVyLWxvb3AtMS5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnVuc3dpdGNo LWxvb3BzIC1mZHVtcC10cmVlLXVuc3dpdGNoLWRldGFpbHMiIH0gKi8KKwor dm9pZCBmb28gKGludCAqdiwgaW50IG4sIGludCBtLCBpbnQgKmwpCit7Cisg ICBpbnQgYWNjLCBpLCBqOworCisgICBhY2MgPSAwOworICAgZm9yIChpID0g MTsgaSA8PSBtOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBq KyspCisJaWYgKGxbal0gPT0gaSkKKwkgIHsKKwkgICAgdltqXSA9IGFjYzsg YWNjKys7CisJICB9CisgICAgICBhY2MgPDw9IDE7CisgICB9Cit9CisKKy8q IE91dGVyIGxvb3Agc2hvdWxkIGJlIHVuc3dpdGNoZWQuICAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJVbnN3aXRjaGluZyBvdXRlciBs b29wIiAidW5zd2l0Y2giIH0gfSAqLworCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtb3V0ZXItc2ltZC0zLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtb3V0ZXItc2ltZC0zLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxYWZiYwotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVj dC1vdXRlci1zaW1kLTMuYwpAQCAtMCwwICsxLDc4IEBACisvKiB7IGRnLXJl cXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X3NpbWRfY2xvbmVzIH0gKi8K Ky8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItZnVuc3dpdGNoLWxvb3Bz IC1mb3Blbm1wLXNpbWQgLWZmYXN0LW1hdGgiIH0gKi8KKyNpbmNsdWRlIDxz dGRsaWIuaD4KKyNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKyNkZWZpbmUgTiA2 NAorCitmbG9hdCAqcHgsICpweTsKK2Zsb2F0ICp0eCwgKnR5OworZmxvYXQg KngxLCAqejEsICp0MSwgKnQyOworaW50IGJvdW5kW05dOworCitzdGF0aWMg dm9pZCBpbmxpbmUgYmFyKGNvbnN0IGZsb2F0IGN4LCBmbG9hdCBjeSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdngsIGZsb2F0ICp2eSwg aW50IG4pCit7CisgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCBuOyAr K2opCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCBkeCAgPSBjeCAtIHB4 W2pdOworICAgICAgICBjb25zdCBmbG9hdCBkeSAgPSBjeSAtIHB5W2pdOwor ICAgICAgICAqdnggICAgICAgICAgICAgICAtPSBkeCAqIHR4W2pdOworICAg ICAgICAqdnkgICAgICAgICAgICAgICAtPSBkeSAqIHR5W2pdOworICAgIH0K K30KKworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUsIG5vY2xvbmUpKSB2b2lk IGZvbzEgKCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gYm91bmRbNjNdOwor I3ByYWdtYSBvbXAgc2ltZAorICBmb3IgKGk9MDsgaTxOOyBpKyspCisgICAg YmFyKHB4W2ldLCBweVtpXSwgeDEraSwgejEraSwgbik7Cit9CisKK19fYXR0 cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkgdm9pZCBmb28yICgpCit7 CisgIHZvbGF0aWxlIGludCBpOworICBpbnQgbiA9IGJvdW5kWzYzXTsKKyAg Zm9yIChpPTA7IGk8TjsgaSsrKQorICAgIGJhcihweFtpXSwgcHlbaV0sIHgx K2ksIHoxK2ksIG4pOworfQorCisKK2ludCBtYWluKCkKK3sKKyAgZmxvYXQg KlggPSAoZmxvYXQqKW1hbGxvYyhOICogOCAqIHNpemVvZiAoZmxvYXQpKTsK KyAgaW50IGk7CisgIGNoZWNrX3ZlY3QgKCk7CisgIHB4ID0gJlhbMF07Cisg IHB5ID0gJlhbTiAqIDFdOworICB0eCA9ICZYW04gKiAyXTsKKyAgdHkgPSAm WFtOICogM107CisgIHgxID0gJlhbTiAqIDRdOworICB6MSA9ICZYW04gKiA1 XTsKKyAgdDEgPSAmWFtOICogNl07CisgIHQyID0gJlhbTiAqIDddOworCisg IGZvciAoaT0wOyBpPE47IGkrKykKKyAgICB7CisgICAgICBweFtpXSA9IChm bG9hdCkgKGkrMik7CisgICAgICB0eFtpXSA9IChmbG9hdCkgKGkrMSk7Cisg ICAgICBweVtpXSA9IChmbG9hdCkgKGkrNCk7CisgICAgICB0eVtpXSA9IChm bG9hdCkgKGkrMyk7CisgICAgICB4MVtpXSA9IHoxW2ldID0gMS4wZjsKKyAg ICAgIGJvdW5kW2ldID0gaSArIDE7CisgICAgfQorICBmb28xICgpOyAgLyog dmVjdG9yIHZhcmlhbnQuICAqLworICBmb3IgKGk9MDsgaTxOO2krKykKKyAg ICB7CisgICAgICB0MVtpXSA9IHgxW2ldOyB4MVtpXSA9IDEuMGY7CisgICAg ICB0MltpXSA9IHoxW2ldOyB6MVtpXSA9IDEuMGY7CisgICAgfQorICBmb28y ICgpOyAgLyogc2NhbGFyIHZhcmlhbnQuICAqLworICBmb3IgKGk9MDsgaTxO OyBpKyspCisgICAgaWYgKHgxW2ldICE9IHQxW2ldIHx8IHoxW2ldICE9IHQy W2ldKQorICAgICAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfQorLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJPVVRFUiBMT09QIFZFQ1RPUkla RUQiICJ2ZWN0IiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90cmVlLXNzYS1s b29wLXVuc3dpdGNoLmMgYi9nY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5j CmluZGV4IDBiZTkxNDIuLmJlZmRlN2EgMTAwNjQ0Ci0tLSBhL2djYy90cmVl LXNzYS1sb29wLXVuc3dpdGNoLmMKKysrIGIvZ2NjL3RyZWUtc3NhLWxvb3At dW5zd2l0Y2guYwpAQCAtNDgsNiArNDgsOCBAQCBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUg InBhcmFtcy5oIgogI2luY2x1ZGUgInRyZWUtcGFzcy5oIgogI2luY2x1ZGUg InRyZWUtaW5saW5lLmgiCisjaW5jbHVkZSAidHJlZS1jZmdjbGVhbnVwLmgi CisjaW5jbHVkZSAiZ2ltcGxlLWl0ZXJhdG9yLmgiCiAKIC8qIFRoaXMgZmls ZSBpbXBsZW1lbnRzIHRoZSBsb29wIHVuc3dpdGNoaW5nLCBpLmUuIHRyYW5z Zm9ybWF0aW9uIG9mIGxvb3BzIGxpa2UKIApAQCAtODgsNiArOTAsNyBAQCBh bG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90 IHNlZQogc3RhdGljIHN0cnVjdCBsb29wICp0cmVlX3Vuc3dpdGNoX2xvb3Ag KHN0cnVjdCBsb29wICosIGJhc2ljX2Jsb2NrLCB0cmVlKTsKIHN0YXRpYyBi b29sIHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKHN0cnVjdCBsb29wICos IGludCk7CiBzdGF0aWMgdHJlZSB0cmVlX21heV91bnN3aXRjaF9vbiAoYmFz aWNfYmxvY2ssIHN0cnVjdCBsb29wICopOworc3RhdGljIGJvb2wgdHJlZV91 bnN3aXRjaF9vdXRlcl9sb29wIChzdHJ1Y3QgbG9vcCAqKTsKIAogLyogTWFp biBlbnRyeSBwb2ludC4gIFBlcmZvcm0gbG9vcCB1bnN3aXRjaGluZyBvbiBh bGwgc3VpdGFibGUgbG9vcHMuICAqLwogCkBAIC0xMTIsNiArMTE1LDEzIEBA IHRyZWVfc3NhX3Vuc3dpdGNoX2xvb3BzICh2b2lkKQogICAgICAgICAgIGNv bnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgIC8qIFRyeSB0byB1bnN3aXRj aCBvdXRlciBsb29wLiAgKi8KKyAgICAgIGlmICh0cmVlX3Vuc3dpdGNoX291 dGVyX2xvb3AgKGxvb3ApKQorCXsKKwkgIGNoYW5nZWQgPSB0cnVlOworCSAg Y29udGludWU7CisJfQorCiAgICAgICAvKiBUaGUgbG9vcCBzaG91bGQgbm90 IGJlIHRvbyBsYXJnZSwgdG8gbGltaXQgY29kZSBncm93dGguICovCiAgICAg ICBpZiAodHJlZV9udW1fbG9vcF9pbnNucyAobG9vcCwgJmVuaV9zaXplX3dl aWdodHMpCiAgICAgICAgICAgPiAodW5zaWduZWQpIFBBUkFNX1ZBTFVFIChQ QVJBTV9NQVhfVU5TV0lUQ0hfSU5TTlMpKQpAQCAtNDEyLDYgKzQyMiwxODAg QEAgdHJlZV91bnN3aXRjaF9sb29wIChzdHJ1Y3QgbG9vcCAqbG9vcCwKIAkJ ICAgICAgIFJFR19CUl9QUk9CX0JBU0UgLSBwcm9iX3RydWUsIGZhbHNlKTsK IH0KIAorLyogVHJ5IHRvIHVuc3dpdGNoIG91dGVyIGxvb3AgaWYgYW55IHRv IHN1cHBvcnQgdmVjdG9yaXphdGlvbiBvZiBvdXRlciBsb29wCisgICB3aXRo IG5vbi1jb25zdGFudCBpbnZhcmlhbnQgdXBwZXIgYm91bmQgb2YgaW5uZXJt b3N0IGxvb3AuICBJbiBmYWN0IGl0IHRyaWVzCisgICB0byBob2lzdCBvdXQg YSBjaGVjayBvbiB6ZXJvIHRyaXAgY291bnQgZm9yIGlubmVybW9zdCBsb29w LgorICAgUmV0dXJucyB0cnVlIGlmIHVuc3dpdGNoaW5nIHRvb2sgcGxhY2Uu ICAqLworc3RhdGljIGJvb2wKK3RyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAo c3RydWN0IGxvb3AgKmlubmVyX2xvb3ApCit7CisgIHN0cnVjdCBsb29wICps b29wID0gbG9vcF9vdXRlciAoaW5uZXJfbG9vcCk7CisgIGJhc2ljX2Jsb2Nr IGhlYWRlcjsKKyAgYmFzaWNfYmxvY2sgaW5uZXJfaGVhZGVyOworICBnaW1w bGUgc3RtdDsKKyAgYmFzaWNfYmxvY2sgZXhpdF9iYjsKKyAgdHJlZSBjb25k LCBjb25kX25ldzsKKyAgc3NhX29wX2l0ZXIgaXRlcjsKKyAgdHJlZSB1c2U7 CisgIGJhc2ljX2Jsb2NrIGRlZl9iYiwgbWVyZ2VfYmI7CisgIGdpbXBsZSBk ZWY7CisgIHN0cnVjdCBsb29wICpubG9vcDsKKyAgdW5zaWduZWQgcHJvYl90 cnVlOworICBlZGdlIGVkZ2VfdHJ1ZSwgZWRnZV9mYWxzZTsKKyAgZ2NvbmQg KmNvbmRfc3RtdDsKKyAgZ3BoaV9pdGVyYXRvciBnc2k7CisKKyAgaWYgKCFs b29wIHx8IGxvb3AtPm5leHQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlm ICghc2luZ2xlX2V4aXQgKGlubmVyX2xvb3ApIHx8ICFzaW5nbGVfZXhpdCAo bG9vcCkpCisgICAgcmV0dXJuIGZhbHNlOworICBoZWFkZXIgPSBsb29wLT5o ZWFkZXI7CisgIHN0bXQgPSBsYXN0X3N0bXQgKGhlYWRlcik7CisgIGlmICgh c3RtdCB8fCBnaW1wbGVfY29kZSAoc3RtdCkgIT0gR0lNUExFX0NPTkQpCisg ICAgcmV0dXJuIGZhbHNlOworICAvKiBEZXRlcm1pbmUgZXhpdCBiYiBhbmQg aGVhZGVyIG9mIGlubmVyIGxvb3AuICAqLworICBpbm5lcl9oZWFkZXIgPSBF REdFX1NVQ0MgKGhlYWRlciwgMCktPmRlc3Q7CisgIGlmICghZmxvd19iYl9p bnNpZGVfbG9vcF9wIChsb29wLCBpbm5lcl9oZWFkZXIpKQorICAgIHJldHVy biBmYWxzZTsKKyAgLyogU2tpcCBlbXB0eSBiYi4gICovCisgIGlmIChlbXB0 eV9ibG9ja19wIChpbm5lcl9oZWFkZXIpKQorICAgIHsKKyAgICAgIGlmICgh c2luZ2xlX3N1Y2NfcCAoaW5uZXJfaGVhZGVyKSkKKwlyZXR1cm4gZmFsc2U7 CisgICAgICBpbm5lcl9oZWFkZXIgPSBzaW5nbGVfc3VjYyAoaW5uZXJfaGVh ZGVyKTsKKyAgICB9CisgIGV4aXRfYmIgPSBFREdFX1NVQ0MgKGhlYWRlciwg MSktPmRlc3Q7CisgIGlmICghZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29w LCBleGl0X2JiKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChlbXB0eV9i bG9ja19wIChleGl0X2JiKSkKKyAgICB7CisgICAgICBpZiAoIXNpbmdsZV9z dWNjX3AgKGV4aXRfYmIpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGV4aXRf YmIgPSBzaW5nbGVfc3VjYyAoZXhpdF9iYik7CisgICAgfQorICBpZiAoaW5u ZXJfaGVhZGVyICE9IGlubmVyX2xvb3AtPmhlYWRlcikKKyAgICB7CisgICAg ICBiYXNpY19ibG9jayB0bXAgPSBpbm5lcl9oZWFkZXI7CisgICAgICBpZiAo ZXhpdF9iYiAhPSBpbm5lcl9sb29wLT5oZWFkZXIpCisJcmV0dXJuIGZhbHNl OworICAgICAgaW5uZXJfaGVhZGVyID0gZXhpdF9iYjsKKyAgICAgIGV4aXRf YmIgPSB0bXA7CisgICAgfQorICBpZiAoRURHRV9DT1VOVCAoZXhpdF9iYi0+ c3VjY3MpICE9IDIpCisgICAgcmV0dXJuIGZhbHNlOzsKKyAgZ2NjX2Fzc2Vy dCAobGFzdF9zdG10IChpbm5lcl9oZWFkZXIpKTsKKyAgaWYgKEVER0VfQ09V TlQgKGV4aXRfYmItPnByZWRzKSAhPSAyKQorICAgIHJldHVybiBmYWxzZTsK KyAgZ2NjX2Fzc2VydCAobGFzdF9zdG10IChleGl0X2JiKSk7CisgIGlmICgh bG9vcF9leGl0X2VkZ2VfcCAobG9vcCwgRURHRV9TVUNDIChleGl0X2JiLCAw KSkpCisgICAgeworICAgICAgaWYgKCFsb29wX2V4aXRfZWRnZV9wIChsb29w LCBFREdFX1NVQ0MgKGV4aXRfYmIsIDEpKQorCSAgfHwgRURHRV9TVUNDIChl eGl0X2JiLCAwKS0+ZGVzdCAhPSBsb29wLT5sYXRjaCkKKwlyZXR1cm4gZmFs c2U7CisgICAgfQorICBlbHNlIGlmIChFREdFX1NVQ0MgKGV4aXRfYmIsIDEp LT5kZXN0ICE9IGxvb3AtPmxhdGNoKQorICAgIHJldHVybiBmYWxzZTsKKyAg LyogSXMgY29uZGl0aW9uIGxvb3AgaW52YXJpYW50PyAgKi8KKyAgRk9SX0VB Q0hfU1NBX1RSRUVfT1BFUkFORCAodXNlLCBzdG10LCBpdGVyLCBTU0FfT1Bf VVNFKQorICAgIHsKKyAgICAgIGRlZiA9IFNTQV9OQU1FX0RFRl9TVE1UICh1 c2UpOworICAgICAgZGVmX2JiID0gZ2ltcGxlX2JiIChkZWYpOworICAgICAg aWYgKGRlZl9iYiAmJiBmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3AsIGRl Zl9iYikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBjb25kID0gYnVp bGQyIChnaW1wbGVfY29uZF9jb2RlKHN0bXQpLCBib29sZWFuX3R5cGVfbm9k ZSwKKwkJIGdpbXBsZV9jb25kX2xocyAoc3RtdCksIGdpbXBsZV9jb25kX3Jo cyAoc3RtdCkpOworICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQorICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIjs7IFVu c3dpdGNoaW5nIG91dGVyIGxvb3BcbiIpOworICBpbml0aWFsaXplX29yaWdp bmFsX2NvcHlfdGFibGVzICgpOworICBleHRyYWN0X3RydWVfZmFsc2VfZWRn ZXNfZnJvbV9ibG9jayAoaGVhZGVyLCAmZWRnZV90cnVlLCAmZWRnZV9mYWxz ZSk7CisgIHByb2JfdHJ1ZSA9IGVkZ2VfdHJ1ZS0+cHJvYmFiaWxpdHk7Cisg IG5sb29wID0gbG9vcF92ZXJzaW9uIChsb29wLCB1bnNoYXJlX2V4cHIgKGNv bmQpLCBOVUxMLCBwcm9iX3RydWUsIHByb2JfdHJ1ZSwKKwkJCVJFR19CUl9Q Uk9CX0JBU0UgLSBwcm9iX3RydWUsIGZhbHNlKTsKKyAgaWYgKCFubG9vcCkK KyAgICB7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQorCWZwcmludGYoZHVtcF9maWxlLCAiQ2FuJ3QgY3Jl YXRlIHZlcnNpb24hXG4iKTsKKyAgICAgIGZyZWVfb3JpZ2luYWxfY29weV90 YWJsZXMgKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlm ICghbmxvb3AtPmZvcmNlX3ZlY3Rvcml6ZSkKKyAgICBubG9vcC0+Zm9yY2Vf dmVjdG9yaXplID0gdHJ1ZTsKKyAgaWYgKGxvb3AtPnNhZmVsZW4gIT0gMCkK KyAgICBubG9vcC0+c2FmZWxlbiA9IGxvb3AtPnNhZmVsZW47CisgIGhlYWRl ciA9IGxvb3AtPmhlYWRlcjsKKyAgc3RtdCA9IGxhc3Rfc3RtdCAoaGVhZGVy KTsKKyAgY29uZF9uZXcgPSBzaW1wbGlmeV91c2luZ19lbnRyeV9jaGVja3Mg KGxvb3AsIGNvbmQpOworICBjb25kX3N0bXQgPSBhc19hIDxnY29uZCAqPiAo c3RtdCk7CisgIGlmIChpbnRlZ2VyX25vbnplcm9wIChjb25kX25ldykpCisg ICAgZ2ltcGxlX2NvbmRfc2V0X2NvbmRpdGlvbl9mcm9tX3RyZWUgKGNvbmRf c3RtdCwgYm9vbGVhbl90cnVlX25vZGUpOworICBlbHNlIGlmIChpbnRlZ2Vy X3plcm9wIChjb25kX25ldykpCisgICAgZ2ltcGxlX2NvbmRfc2V0X2NvbmRp dGlvbl9mcm9tX3RyZWUgKGNvbmRfc3RtdCwgYm9vbGVhbl9mYWxzZV9ub2Rl KTsKKyAgZWxzZQorICAgIGdjY191bnJlYWNoYWJsZSAoKTsKKworICBoZWFk ZXIgPSBubG9vcC0+aGVhZGVyOworICBzdG10ID0gbGFzdF9zdG10IChoZWFk ZXIpOworICBjb25kX25ldyA9IHNpbXBsaWZ5X3VzaW5nX2VudHJ5X2NoZWNr cyAobmxvb3AsIGNvbmQpOworICBjb25kX3N0bXQgPSBhc19hIDxnY29uZCAq PiAoc3RtdCk7CisgIGlmIChpbnRlZ2VyX25vbnplcm9wIChjb25kX25ldykp CisgICAgZ2ltcGxlX2NvbmRfc2V0X2NvbmRpdGlvbl9mcm9tX3RyZWUgKGNv bmRfc3RtdCwgYm9vbGVhbl90cnVlX25vZGUpOworICBlbHNlIGlmIChpbnRl Z2VyX3plcm9wIChjb25kX25ldykpCisgICAgZ2ltcGxlX2NvbmRfc2V0X2Nv bmRpdGlvbl9mcm9tX3RyZWUgKGNvbmRfc3RtdCwgYm9vbGVhbl9mYWxzZV9u b2RlKTsKKyAgZWxzZQorICAgIGdjY191bnJlYWNoYWJsZSAoKTsKKworICBt ZXJnZV9iYiA9IHNpbmdsZV9leGl0IChsb29wKS0+ZGVzdDsKKyAgaWYgKEVE R0VfQ09VTlQgKG1lcmdlX2JiLT5wcmVkcykgPj0gMikKKyAgICBzcGxpdF9l ZGdlIChzaW5nbGVfZXhpdCAobG9vcCkpOworICAvKiBDbGVhbi11cCBjZmcg dG8gcmVtb3ZlIHVzZWxlc3Mgb25lLWFyZ3VtZW50IHBoaSBpbiBleGl0IGJs b2NrIG9mCisgICAgIG91dGVyLWxvb3AuICAqLworICBjbGVhbnVwX3RyZWVf Y2ZnICgpOworICBtYXJrX3ZpcnR1YWxfb3BlcmFuZHNfZm9yX3JlbmFtaW5n IChjZnVuKTsKKyAgdXBkYXRlX3NzYSAoVE9ET191cGRhdGVfc3NhKTsKKwor ICAvKiBEZXRlcm1pbmUgd2hpY2ggbG9vcCBpcyBsb29wIG5lc3QuICAqLwor ICBpZiAoIWxvb3AtPmlubmVyKQorICAgIHsKKyAgICAgIGdjY19hc3NlcnQg KG5sb29wLT5pbm5lcik7CisgICAgICBsb29wID0gbmxvb3A7CisgICAgfQor ICBleGl0X2JiID0gc2luZ2xlX2V4aXQgKGxvb3ApLT5zcmM7CisgIGdjY19h c3NlcnQgKEVER0VfQ09VTlQgKGV4aXRfYmItPnByZWRzKSA9PSAxKTsKKyAg LyogUGVyZm9ybSBzdWJzdGl0dXRpb24gb2YgcmhzIG9mIHBoaSBub2RlcyBh a2EgY29weSBwcm9wYWdhdGlvbiBzaW5jZQorICAgICB2ZWN0b3JpemVyIGRv ZXMgbm90IGFjY2VwdCBwaGkgbm9kZXMgaW4gbm9uLWhlYWRlciBiYi4gICov CisgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X3BoaXMgKGV4aXRfYmIpOyAhZ3Np X2VuZF9wIChnc2kpOykKKyAgICB7CisgICAgICBncGhpICpwaGk7CisgICAg ICB0cmVlIGFyZzsKKyAgICAgIGdpbXBsZSBzdG10OworICAgICAgaW1tX3Vz ZV9pdGVyYXRvciBpbW1faXRlcjsKKyAgICAgIHVzZV9vcGVyYW5kX3AgdXNl X3A7CisKKyAgICAgIHBoaSA9IGdzaS5waGkgKCk7CisgICAgICBhcmcgPSBn aW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMCk7CisgICAgICBpZiAoVFJFRV9D T0RFIChhcmcpID09IFNTQV9OQU1FKQorCXsKKwkgIGlmIChkdW1wX2ZpbGUg JiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJICAgIGZwcmludGYo ZHVtcF9maWxlLCAiUmVtb3ZlIHBoaSBpbiBleGl0IGJsb2NrIG9mIG91dGVy LWxvb3BcbiIpOworCSAgRk9SX0VBQ0hfSU1NX1VTRV9TVE1UIChzdG10LCBp bW1faXRlciwgUEhJX1JFU1VMVCAocGhpKSkKKwkgICAgeworCSAgICAgIGlm IChzdG10ICE9IHBoaSkKKwkJRk9SX0VBQ0hfSU1NX1VTRV9PTl9TVE1UICh1 c2VfcCwgaW1tX2l0ZXIpCisJCSAgU0VUX1VTRSAodXNlX3AsIGFyZyk7CisJ ICAgIH0KKyAgICAgICAgICByZW1vdmVfcGhpX25vZGUgKCZnc2ksIHRydWUp OworCX0KKyAgICAgIGVsc2UKKwlnc2lfbmV4dCAoJmdzaSk7CisgICAgfQor ICBmcmVlX29yaWdpbmFsX2NvcHlfdGFibGVzICgpOworICByZXR1cm4gdHJ1 ZTsKK30KKwogLyogTG9vcCB1bnN3aXRjaGluZyBwYXNzLiAgKi8KIAogbmFt ZXNwYWNlIHsK --089e013d085a0e38a3051a827adb--