From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id 26ECD3858D1E for ; Fri, 30 Sep 2022 23:32:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 26ECD3858D1E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=ventanamicro.com Received: by mail-pl1-x630.google.com with SMTP id w24so74945pll.11 for ; Fri, 30 Sep 2022 16:32:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date; bh=4pQlxHlOo4jdZOslQU1JdphGo2fcfrfL3NxDtm5r2Bo=; b=YeCNuNsJJKh/X+xkSDqQfElJaLIr24pGYomCdbGpfWGvGZnW7k7Ydrht54kY9hochc wBxR3mmmVFVrNmJs7eXAap3EQEjxzD8NWNkqDf8tv5dsM3++YR5Ia0j2imAkRDzl1OCw adjCisiGUQW4vMNhcFnt/1pIXN9fOVIXREsWh13ZSamXfgQomPnsrHZndu9vVlUppq9S xmOWNj1b+6YWKhW5s3+B31r35QKar1MdGyYLnf2laEK6rpYQllU67rcGafxvymq+H2mH U9JpD9HpCuHXqCF8gHZEwiBG5tRkFOe6tGPSEFT010FpYFMUsUTxN164Id4soKBJea1F IgfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date; bh=4pQlxHlOo4jdZOslQU1JdphGo2fcfrfL3NxDtm5r2Bo=; b=1pR0O+0lmQoKGpKnKXYGyePIiul3OZ1Nqnjg4+23BLSJoYDoFSYSl3SBdjW9VhWhdk U2MFgusXVoAkLbUhoYb5FXLf653pk6l6mxoPKTFKD+RHfVEhczwp9mqVnIH+vbrK33Oj /G5cdgBCPSHYhRMsOm5RgtDdyBB+x70BVwIJDbbkWYI5RVjROCJMTeNn6kJWjwM0cMMb juAfP0EzfL1PHVPSurhgOOdYWuchsS7UP176g0mOCnTSOQLeAOs6WLNX3IsDkjm1X8p9 7THwkhfPGDwLmwzu0brQkAKSKKo9o6EQ70MWztTp3vAjXzcQGnkwNSBrpnbfDHQQdRwg 7K7w== X-Gm-Message-State: ACrzQf1VpSatdpeP0HHNCKhrIX6OMZkZ/dtBNssLvNRsdBKoZWhCh3ti 0+/AmoLBHegk5t0/59i5im4pyBNjdCSngQDC X-Google-Smtp-Source: AMsMyM6AcCOyo/7E3E9/S5bY/UDExIv0hZGTO4E2ZkrMhp5fNiKo2Z4fDodCZy62cAk4qX4+OXLh+A== X-Received: by 2002:a17:90b:1b52:b0:202:f03b:62fd with SMTP id nv18-20020a17090b1b5200b00202f03b62fdmr683366pjb.117.1664580755549; Fri, 30 Sep 2022 16:32:35 -0700 (PDT) Received: from ?IPV6:2601:681:8600:13d0::f0a? ([2601:681:8600:13d0::f0a]) by smtp.gmail.com with ESMTPSA id b11-20020a170902d50b00b0016edd557412sm636363plg.201.2022.09.30.16.32.34 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 30 Sep 2022 16:32:35 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------5QFyIDwbkA1Zsh46rEFuKGIV" Message-ID: <6baf42b9-0534-dc81-7a54-11317c732a68@ventanamicro.com> Date: Fri, 30 Sep 2022 17:32:34 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.1 Content-Language: en-US To: "gcc-patches@gcc.gnu.org" From: Jeff Law Subject: [committed] More gimple const/copy propagation opportunities X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------5QFyIDwbkA1Zsh46rEFuKGIV Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit While investigating a benchmark for optimization opportunities I came across single block loop which either iterates precisely once or forever.    This is an interesting scenario as we can ignore the infinite looping path and treat any PHI nodes as degenerates. So more concretely let's consider this trivial testcase: volatile void abort (void); void foo(int a) {  int b = 0;  while (1)    {      if (!a)        break;      b = 1;    }  if (b != 0)    abort (); } Quick analysis shows that b's initial value is 0 and its value only changes if we enter an infinite loop.  So if we get to the test b != 0, the only possible value b could have would be 0 and the test and its true arm can be eliminated. The DOM3 dump looks something like this: ;;   basic block 2, loop depth 0, count 118111600 (estimated locally), maybe hot ;;    prev block 0, next block 3, flags: (NEW, VISITED) ;;    pred:       ENTRY [always]  count:118111600 (estimated locally) (FALLTHRU,EXECUTABLE) ;;    succ:       3 [always]  count:118111600 (estimated locally) (FALLTHRU,EXECUTABLE) ;;   basic block 3, loop depth 1, count 1073741824 (estimated locally), maybe hot ;;    prev block 2, next block 4, flags: (NEW, VISITED) ;;    pred:       2 [always]  count:118111600 (estimated locally) (FALLTHRU,EXECUTABLE) ;;                3 [89.0% (guessed)]  count:955630224 (estimated locally) (FALSE_VALUE,EXECUTABLE)   # b_1 = PHI <0(2), 1(3)>   if (a_3(D) == 0)     goto ; [11.00%]   else     goto ; [89.00%] ;;    succ:       4 [11.0% (guessed)]  count:118111600 (estimated locally) (TRUE_VALUE,EXECUTABLE) ;;                3 [89.0% (guessed)]  count:955630224 (estimated locally) (FALSE_VALUE,EXECUTABLE) ;;   basic block 4, loop depth 0, count 118111600 (estimated locally), maybe hot ;;    prev block 3, next block 5, flags: (NEW, VISITED) ;;    pred:       3 [11.0% (guessed)]  count:118111600 (estimated locally) (TRUE_VALUE,EXECUTABLE)   if (b_1 != 0)     goto ; [0.00%]   else     goto ; [100.00%] ;;    succ:       5 [never]  count:0 (precise) (TRUE_VALUE,EXECUTABLE) ;;                6 [always]  count:118111600 (estimated locally) (FALSE_VALUE,EXECUTABLE) This is a good representative of what the benchmark code looks like. The primary effect we want to capture is to realize that the test if (b_1 != 0) is always false and optimize it accordingly. In the benchmark, this opportunity is well hidden until after the loop optimizers have completed, so the first chance to capture this case is in DOM3.  Furthermore, DOM wants loops normalized with latch blocks/edges.  So instead of bb3 looping back to itself, there's an intermediate empty block during DOM. I originally thought this was likely to only affect the benchmark.  But when I instrumented the optimization and bootstrapped GCC, much to my surprise there were several hundred similar cases identified in GCC itself.  So it's not as benchmark specific as I'd initially feared. Anyway, detecting this in DOM is pretty simple.   We detect the infinite loop, including the latch block.  Once we've done that, we walk the PHI nodes and attach equivalences to the appropriate outgoing edge.   That's all we need to do as the rest of DOM is already prepared to handle equivalences on edges. Pushed to the trunk, Jeff --------------5QFyIDwbkA1Zsh46rEFuKGIV Content-Type: text/plain; charset=UTF-8; name="P" Content-Disposition: attachment; filename="P" Content-Transfer-Encoding: base64 Y29tbWl0IDEyMTQxOTZkYTc5YWFiYmU1YzE0ZWQzNmU1YTI4MDEyZTE0MWYwNGMKQXV0aG9y OiBKZWZmIExhdyA8amVmZnJleWFsYXdAZ21haWwuY29tPgpEYXRlOiAgIEZyaSBTZXAgMzAg MTk6MjY6MzEgMjAyMiAtMDQwMAoKICAgIE1vcmUgZ2ltcGxlIGNvbnN0L2NvcHkgcHJvcGFn YXRpb24gb3Bwb3J0dW5pdGllcwogICAgCiAgICBXaGlsZSBpbnZlc3RpZ2F0aW5nIGEgYmVu Y2htYXJrIGZvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBJIGNhbWUgYWNyb3NzIHNp bmdsZSBibG9jayBsb29wIHdoaWNoIGVpdGhlciBpdGVyYXRlcyBwcmVjaXNlbHkgb25jZSBv ciBmb3JldmVyLiAgICBUaGlzIGlzIGFuIGludGVyZXN0aW5nIHNjZW5hcmlvIGFzIHdlIGNh biBpZ25vcmUgdGhlIGluZmluaXRlIGxvb3BpbmcgcGF0aCBhbmQgdHJlYXQgYW55IFBISSBu b2RlcyBhcyBkZWdlbmVyYXRlcy4gIFNvIG1vcmUgY29uY3JldGVseSBsZXQncyBjb25zaWRl ciB0aGlzIHRyaXZpYWwgdGVzdGNhc2U6CiAgICAKICAgIHZvbGF0aWxlIHZvaWQgYWJvcnQg KHZvaWQpOwogICAgCiAgICB2b2lkCiAgICBmb28oaW50IGEpCiAgICB7CiAgICAgaW50IGIg PSAwOwogICAgCiAgICAgd2hpbGUgKDEpCiAgICAgICB7CiAgICAgICAgIGlmICghYSkKICAg ICAgICAgICBicmVhazsKICAgICAgICAgYiA9IDE7CiAgICAgICB9CiAgICAKICAgICBpZiAo YiAhPSAwKQogICAgICAgYWJvcnQgKCk7CiAgICB9CiAgICAKICAgIFF1aWNrIGFuYWx5c2lz IHNob3dzIHRoYXQgYidzIGluaXRpYWwgdmFsdWUgaXMgMCBhbmQgaXRzIHZhbHVlIG9ubHkg Y2hhbmdlcyBpZiB3ZSBlbnRlciBhbiBpbmZpbml0ZSBsb29wLiAgU28gaWYgd2UgZ2V0IHRv IHRoZSB0ZXN0IGIgIT0gMCwgdGhlIG9ubHkgcG9zc2libGUgdmFsdWUgYiBjb3VsZCBoYXZl IHdvdWxkIGJlIDAgYW5kIHRoZSB0ZXN0IGFuZCBpdHMgdHJ1ZSBhcm0gY2FuIGJlIGVsaW1p bmF0ZWQuCiAgICAKICAgIFRoZSBET00zIGR1bXAgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhp czoKICAgIAogICAgOzsgICBiYXNpYyBibG9jayAyLCBsb29wIGRlcHRoIDAsIGNvdW50IDEx ODExMTYwMCAoZXN0aW1hdGVkIGxvY2FsbHkpLCBtYXliZSBob3QKICAgIDs7ICAgIHByZXYg YmxvY2sgMCwgbmV4dCBibG9jayAzLCBmbGFnczogKE5FVywgVklTSVRFRCkKICAgIDs7ICAg IHByZWQ6ICAgICAgIEVOVFJZIFthbHdheXNdICBjb3VudDoxMTgxMTE2MDAgKGVzdGltYXRl ZCBsb2NhbGx5KSAoRkFMTFRIUlUsRVhFQ1VUQUJMRSkKICAgIDs7ICAgIHN1Y2M6ICAgICAg IDMgW2Fsd2F5c10gIGNvdW50OjExODExMTYwMCAoZXN0aW1hdGVkIGxvY2FsbHkpIChGQUxM VEhSVSxFWEVDVVRBQkxFKQogICAgCiAgICA7OyAgIGJhc2ljIGJsb2NrIDMsIGxvb3AgZGVw dGggMSwgY291bnQgMTA3Mzc0MTgyNCAoZXN0aW1hdGVkIGxvY2FsbHkpLCBtYXliZSBob3QK ICAgIDs7ICAgIHByZXYgYmxvY2sgMiwgbmV4dCBibG9jayA0LCBmbGFnczogKE5FVywgVklT SVRFRCkKICAgIDs7ICAgIHByZWQ6ICAgICAgIDIgW2Fsd2F5c10gIGNvdW50OjExODExMTYw MCAoZXN0aW1hdGVkIGxvY2FsbHkpIChGQUxMVEhSVSxFWEVDVVRBQkxFKQogICAgOzsgICAg ICAgICAgICAgICAgMyBbODkuMCUgKGd1ZXNzZWQpXSAgY291bnQ6OTU1NjMwMjI0IChlc3Rp bWF0ZWQgbG9jYWxseSkgKEZBTFNFX1ZBTFVFLEVYRUNVVEFCTEUpCiAgICAgICMgYl8xID0g UEhJIDwwKDIpLCAxKDMpPgogICAgICBpZiAoYV8zKEQpID09IDApCiAgICAgICAgZ290byA8 YmIgND47IFsxMS4wMCVdCiAgICAgIGVsc2UKICAgICAgICBnb3RvIDxiYiAzPjsgWzg5LjAw JV0KICAgIDs7ICAgIHN1Y2M6ICAgICAgIDQgWzExLjAlIChndWVzc2VkKV0gIGNvdW50OjEx ODExMTYwMCAoZXN0aW1hdGVkIGxvY2FsbHkpIChUUlVFX1ZBTFVFLEVYRUNVVEFCTEUpCiAg ICA7OyAgICAgICAgICAgICAgICAzIFs4OS4wJSAoZ3Vlc3NlZCldICBjb3VudDo5NTU2MzAy MjQgKGVzdGltYXRlZCBsb2NhbGx5KSAoRkFMU0VfVkFMVUUsRVhFQ1VUQUJMRSkKICAgIAog ICAgOzsgICBiYXNpYyBibG9jayA0LCBsb29wIGRlcHRoIDAsIGNvdW50IDExODExMTYwMCAo ZXN0aW1hdGVkIGxvY2FsbHkpLCBtYXliZSBob3QKICAgIDs7ICAgIHByZXYgYmxvY2sgMywg bmV4dCBibG9jayA1LCBmbGFnczogKE5FVywgVklTSVRFRCkKICAgIDs7ICAgIHByZWQ6ICAg ICAgIDMgWzExLjAlIChndWVzc2VkKV0gIGNvdW50OjExODExMTYwMCAoZXN0aW1hdGVkIGxv Y2FsbHkpIChUUlVFX1ZBTFVFLEVYRUNVVEFCTEUpCiAgICAgIGlmIChiXzEgIT0gMCkKICAg ICAgICBnb3RvIDxiYiA1PjsgWzAuMDAlXQogICAgICBlbHNlCiAgICAgICAgZ290byA8YmIg Nj47IFsxMDAuMDAlXQogICAgOzsgICAgc3VjYzogICAgICAgNSBbbmV2ZXJdICBjb3VudDow IChwcmVjaXNlKSAoVFJVRV9WQUxVRSxFWEVDVVRBQkxFKQogICAgOzsgICAgICAgICAgICAg ICAgNiBbYWx3YXlzXSAgY291bnQ6MTE4MTExNjAwIChlc3RpbWF0ZWQgbG9jYWxseSkgKEZB TFNFX1ZBTFVFLEVYRUNVVEFCTEUpCiAgICAKICAgIFRoaXMgaXMgYSBnb29kIHJlcHJlc2Vu dGF0aXZlIG9mIHdoYXQgdGhlIGJlbmNobWFyayBjb2RlIGxvb2tzIGxpa2UuCiAgICAKICAg IFRoZSBwcmltYXJ5IGVmZmVjdCB3ZSB3YW50IHRvIGNhcHR1cmUgaXMgdG8gcmVhbGl6ZSB0 aGF0IHRoZSB0ZXN0IGlmIChiXzEgIT0gMCkgaXMgYWx3YXlzIGZhbHNlIGFuZCBvcHRpbWl6 ZSBpdCBhY2NvcmRpbmdseS4KICAgIAogICAgSW4gdGhlIGJlbmNobWFyaywgdGhpcyBvcHBv cnR1bml0eSBpcyB3ZWxsIGhpZGRlbiB1bnRpbCBhZnRlciB0aGUgbG9vcCBvcHRpbWl6ZXJz IGhhdmUgY29tcGxldGVkLCBzbyB0aGUgZmlyc3QgY2hhbmNlIHRvIGNhcHR1cmUgdGhpcyBj YXNlIGlzIGluIERPTTMuICBGdXJ0aGVybW9yZSwgRE9NIHdhbnRzIGxvb3BzIG5vcm1hbGl6 ZWQgd2l0aCBsYXRjaCBibG9ja3MvZWRnZXMuICBTbyBpbnN0ZWFkIG9mIGJiMyBsb29waW5n IGJhY2sgdG8gaXRzZWxmLCB0aGVyZSdzIGFuIGludGVybWVkaWF0ZSBlbXB0eSBibG9jayBk dXJpbmcgRE9NLgogICAgCiAgICBJIG9yaWdpbmFsbHkgdGhvdWdodCB0aGlzIHdhcyBsaWtl bHkgdG8gb25seSBhZmZlY3QgdGhlIGJlbmNobWFyay4gIEJ1dCB3aGVuIEkgaW5zdHJ1bWVu dGVkIHRoZSBvcHRpbWl6YXRpb24gYW5kIGJvb3RzdHJhcHBlZCBHQ0MsIG11Y2ggdG8gbXkg c3VycHJpc2UgdGhlcmUgd2VyZSBzZXZlcmFsIGh1bmRyZWQgc2ltaWxhciBjYXNlcyBpZGVu dGlmaWVkIGluIEdDQyBpdHNlbGYuICBTbyBpdCdzIG5vdCBhcyBiZW5jaG1hcmsgc3BlY2lm aWMgYXMgSSdkIGluaXRpYWxseSBmZWFyZWQuCiAgICAKICAgIEFueXdheSwgZGV0ZWN0aW5n IHRoaXMgaW4gRE9NIGlzIHByZXR0eSBzaW1wbGUuICAgV2UgZGV0ZWN0IHRoZSBpbmZpbml0 ZSBsb29wLCBpbmNsdWRpbmcgdGhlIGxhdGNoIGJsb2NrLiAgT25jZSB3ZSd2ZSBkb25lIHRo YXQsIHdlIHdhbGsgdGhlIFBISSBub2RlcyBhbmQgYXR0YWNoIGVxdWl2YWxlbmNlcyB0byB0 aGUgYXBwcm9wcmlhdGUgb3V0Z29pbmcgZWRnZS4gICBUaGF0J3MgYWxsIHdlIG5lZWQgdG8g ZG8gYXMgdGhlIHJlc3Qgb2YgRE9NIGlzIGFscmVhZHkgcHJlcGFyZWQgdG8gaGFuZGxlIGVx dWl2YWxlbmNlcyBvbiBlZGdlcy4KICAgIAogICAgZ2NjLwogICAgICAgICAgICAqIHRyZWUt c3NhLWRvbS5jYyAoc2luZ2xlX2Jsb2NrX2xvb3BfcCk6IE5ldyBmdW5jdGlvbi4KICAgICAg ICAgICAgKHJlY29yZF9lZGdlX2luZm8pOiBBbHNvIHJlY29yZCBlcXVpdmFsZW5jZXMgZm9y IHRoZSBvdXRnb2luZwogICAgICAgICAgICBlZGdlIG9mIGEgc2luZ2xlIGJsb2NrIGxvb3Ag d2hlcmUgdGhlIGNvbmRpdGlvbiBpcyBhbiBpbnZhcmlhbnQuCiAgICAKICAgIGdjYy90ZXN0 c3VpdGUvCiAgICAgICAgICAgICogZ2NjLmRnL2luZmluaXRlLWxvb3AuYzogTmV3IHRlc3Qu CgpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaW5maW5pdGUtbG9vcC5jIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaW5maW5pdGUtbG9vcC5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yNTAzN2EyMDI3ZQotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2luZmluaXRlLWxvb3AuYwpAQCAtMCwwICsxLDI2IEBA CisvKiB7IGRnLWRvIGxpbmsgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIiIH0gKi8KK3Zv aWQgbGlua19lcnJvciAodm9pZCk7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5l LG5vaXBhKSkKK2ZvbyhpbnQgYSkKK3sKKyBpbnQgYiA9IDA7CisKKyB3aGlsZSAoMSkKKyAg IHsKKyAgICAgaWYgKCFhKQorICAgICAgIGJyZWFrOworICAgICBiID0gMTsKKyAgIH0KKwor IGlmIChiICE9IDApCisgICBsaW5rX2Vycm9yICgpOworfQorCitpbnQKK21haW4oKQorewor ICBmb28gKDApOworfQorCmRpZmYgLS1naXQgYS9nY2MvdHJlZS1zc2EtZG9tLmNjIGIvZ2Nj L3RyZWUtc3NhLWRvbS5jYwppbmRleCBmYTQzZGJlNmM0NC4uOGQ4MzEyY2EzNTAgMTAwNjQ0 Ci0tLSBhL2djYy90cmVlLXNzYS1kb20uY2MKKysrIGIvZ2NjL3RyZWUtc3NhLWRvbS5jYwpA QCAtNDI2LDYgKzQyNiw3NCBAQCBmcmVlX2FsbF9lZGdlX2luZm9zICh2b2lkKQogICAgIH0K IH0KIAorLyogUmV0dXJuIFRSVUUgaWYgQkIgaGFzIHByZWNpc2VseSB0d28gcHJlZHMsIG9u ZSBvZiB3aGljaAorICAgaXMgYSBiYWNrZWRnZSBmcm9tIGEgZm9yd2FyZGVyIGJsb2NrIHdo ZXJlIHRoZSBmb3J3YXJkZXIKKyAgIGJsb2NrIGlzIGEgZGlyZWN0IHN1Y2Nlc3NvciBvZiBC Qi4gIEJlaW5nIGEgZm9yd2FyZGVyCisgICBibG9jaywgaXQgaGFzIG5vIHNpZGUgZWZmZWN0 cyBvdGhlciB0aGFuIHRyYW5zZmVyIG9mCisgICBjb250cm9sLiAgT3RoZXJ3aXNlIHJldHVy biBGQUxTRS4gICovCisKK3N0YXRpYyBib29sCitzaW5nbGVfYmxvY2tfbG9vcF9wIChiYXNp Y19ibG9jayBiYikKK3sKKyAgLyogVHdvIHByZWRzLiAgKi8KKyAgaWYgKEVER0VfQ09VTlQg KGJiLT5wcmVkcykgIT0gMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogT25lIGFuZCBv bmx5IG9uZSBvZiB0aGUgZWRnZXMgbXVzdCBiZSBtYXJrZWQgd2l0aAorICAgICBFREdFX0RG U19CQUNLLiAgKi8KKyAgYmFzaWNfYmxvY2sgcHJlZCA9IE5VTEw7CisgIHVuc2lnbmVkIGlu dCBjb3VudCA9IDA7CisgIGlmIChFREdFX1BSRUQgKGJiLCAwKS0+ZmxhZ3MgJiBFREdFX0RG U19CQUNLKQorICAgIHsKKyAgICAgIHByZWQgPSBFREdFX1BSRUQgKGJiLCAwKS0+c3JjOwor ICAgICAgY291bnQrKzsKKyAgICB9CisgIGlmIChFREdFX1BSRUQgKGJiLCAxKS0+ZmxhZ3Mg JiBFREdFX0RGU19CQUNLKQorICAgIHsKKyAgICAgIHByZWQgPSBFREdFX1BSRUQgKGJiLCAx KS0+c3JjOworICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgaWYgKGNvdW50ICE9IDEpCisg ICAgcmV0dXJuIGZhbHNlOworCisgIC8qIE5vdyBleGFtaW5lIFBSRUQuICBJdCBzaG91bGQg aGF2ZSBhIHNpbmdsZSBwcmVkZWNlc3NvciB3aGljaAorICAgICBpcyBCQiBhbmQgYSBzaW5n bGUgc3VjY2Vzc29yIHRoYXQgaXMgYWxzbyBCQi4gICovCisgIGlmIChFREdFX0NPVU5UIChw cmVkLT5wcmVkcykgIT0gMQorICAgICAgfHwgRURHRV9DT1VOVCAocHJlZC0+c3VjY3MpICE9 IDEKKyAgICAgIHx8IEVER0VfUFJFRCAocHJlZCwgMCktPnNyYyAhPSBiYgorICAgICAgfHwg RURHRV9TVUNDIChwcmVkLCAwKS0+ZGVzdCAhPSBiYikKKyAgICByZXR1cm4gZmFsc2U7CisK KyAgLyogVGhpcyBsb29rcyBnb29kIGZyb20gYSBDRkcgc3RhbmRwb2ludC4gIE5vdyBsb29r IGF0IHRoZSBndXRzCisgICAgIG9mIFBSRUQuICBCYXNpY2FsbHkgd2Ugd2FudCB0byB2ZXJp ZnkgdGhlcmUgYXJlIG5vIFBISSBub2RlcworICAgICBhbmQgbm8gcmVhbCBzdGF0ZW1lbnRz LiAgKi8KKyAgaWYgKCEgZ2ltcGxlX3NlcV9lbXB0eV9wIChwaGlfbm9kZXMgKHByZWQpKSkK KyAgICByZXR1cm4gZmFsc2U7CisKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOworICBm b3IgKGdzaSA9IGdzaV9sYXN0X2JiIChwcmVkKTsgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX3By ZXYgKCZnc2kpKQorICAgIHsKKyAgICAgIGdpbXBsZSAqc3RtdCA9IGdzaV9zdG10IChnc2kp OworCisgICAgICBzd2l0Y2ggKGdpbXBsZV9jb2RlIChzdG10KSkKKwl7CisJICBjYXNlIEdJ TVBMRV9MQUJFTDoKKwkgICAgaWYgKERFQ0xfTk9OTE9DQUwgKGdpbXBsZV9sYWJlbF9sYWJl bCAoYXNfYSA8Z2xhYmVsICo+IChzdG10KSkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkg ICAgYnJlYWs7CisKKwkgIGNhc2UgR0lNUExFX0RFQlVHOgorCSAgICBicmVhazsKKworCSAg ZGVmYXVsdDoKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRy dWU7Cit9CisKIC8qIFdlIGhhdmUgZmluaXNoZWQgb3B0aW1pemluZyBCQiwgcmVjb3JkIGFu eSBpbmZvcm1hdGlvbiBpbXBsaWVkIGJ5CiAgICB0YWtpbmcgYSBzcGVjaWZpYyBvdXRnb2lu ZyBlZGdlIGZyb20gQkIuICAqLwogCkBAIC00MzUsNiArNTAzLDEzIEBAIHJlY29yZF9lZGdl X2luZm8gKGJhc2ljX2Jsb2NrIGJiKQogICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSBn c2lfbGFzdF9iYiAoYmIpOwogICBjbGFzcyBlZGdlX2luZm8gKmVkZ2VfaW5mbzsKIAorICAv KiBGcmVlIGFsbCB0aGUgb3V0Z29pbmcgZWRnZSBpbmZvIGRhdGEgYXNzb2NpYXRlZCB3aXRo CisgICAgIEJCJ3Mgb3V0Z29pbmcgZWRnZXMuICAqLworICBlZGdlIGU7CisgIGVkZ2VfaXRl cmF0b3IgZWk7CisgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3MpCisgICAgZnJl ZV9kb21fZWRnZV9pbmZvIChlKTsKKwogICBpZiAoISBnc2lfZW5kX3AgKGdzaSkpCiAgICAg ewogICAgICAgZ2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKGdzaSk7CkBAIC00NTAsOCArNTI1 LDYgQEAgcmVjb3JkX2VkZ2VfaW5mbyAoYmFzaWNfYmxvY2sgYmIpCiAJICAgICAgaW50IGk7 CiAgICAgICAgICAgICAgIGludCBuX2xhYmVscyA9IGdpbXBsZV9zd2l0Y2hfbnVtX2xhYmVs cyAoc3dpdGNoX3N0bXQpOwogCSAgICAgIHRyZWUgKmluZm8gPSBYQ05FV1ZFQyAodHJlZSwg bGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGNmdW4pKTsKLQkgICAgICBlZGdlIGU7Ci0JICAg ICAgZWRnZV9pdGVyYXRvciBlaTsKIAogCSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2xhYmVs czsgaSsrKQogCQl7CkBAIC01ODMsNiArNjU2LDYyIEBAIHJlY29yZF9lZGdlX2luZm8gKGJh c2ljX2Jsb2NrIGJiKQogICAgICAgICAgICAgICBpZiAoY2FuX2luZmVyX3NpbXBsZV9lcXVp diAmJiBUUkVFX0NPREUgKGludmVydGVkKSA9PSBFUV9FWFBSKQogCQllZGdlX2luZm8tPnJl Y29yZF9zaW1wbGVfZXF1aXYgKG9wMCwgb3AxKTsKICAgICAgICAgICAgIH0KKworCSAgLyog SWYgdGhpcyBibG9jayBpcyBhIHNpbmdsZSBibG9jayBsb29wLCB0aGVuIHdlIG1heSBiZSBh YmxlIHRvCisJICAgICByZWNvcmQgc29tZSBlcXVpdmFsZW5jZXMgb24gdGhlIGxvb3AncyBl eGl0IGVkZ2UuICAqLworCSAgaWYgKHNpbmdsZV9ibG9ja19sb29wX3AgKGJiKSkKKwkgICAg eworCSAgICAgIC8qIFdlIGtub3cgaXQncyBhIHNpbmdsZSBibG9jayBsb29wLiAgTm93IGxv b2sgYXQgdGhlIGxvb3AKKwkJIGV4aXQgY29uZGl0aW9uLiAgV2hhdCB3ZSdyZSBsb29raW5n IGZvciBpcyB3aGV0aGVyIG9yIG5vdAorCQkgdGhlIGV4aXQgY29uZGl0aW9uIGlzIGxvb3Ag aW52YXJpYW50IHdoaWNoIHdlIGNhbiBkZXRlY3QKKwkJIGJ5IGNoZWNraW5nIGlmIGFsbCB0 aGUgU1NBX05BTUVzIHJlZmVyZW5jZWQgYXJlIGRlZmluZWQKKwkJIG91dHNpZGUgdGhlIGxv b3AuICAqLworCSAgICAgIGlmICgoVFJFRV9DT0RFIChvcDApICE9IFNTQV9OQU1FCisJCSAg IHx8IGdpbXBsZV9iYiAoU1NBX05BTUVfREVGX1NUTVQgKG9wMCkpICE9IGJiKQorCQkgICYm IChUUkVFX0NPREUgKG9wMSkgIT0gU1NBX05BTUUKKwkJICAgICAgfHwgZ2ltcGxlX2JiIChT U0FfTkFNRV9ERUZfU1RNVCAob3AxKSkgIT0gYmIpKQorCQl7CisJCSAgLyogQXQgdGhpcyBw b2ludCB3ZSBrbm93IHRoZSBleGl0IGNvbmRpdGlvbiBpcyBsb29wCisJCSAgICAgaW52YXJp YW50LiAgVGhlIG9ubHkgd2F5IHRvIGdldCBvdXQgb2YgdGhlIGxvb3AgaXMKKwkJICAgICBp ZiBuZXZlciB0cmF2ZXJzZXMgdGhlIGJhY2tlZGdlIHRvIGJlZ2luIHdpdGguICBUaGlzCisJ CSAgICAgaW1wbGllcyB0aGF0IGFueSBQSEkgbm9kZXMgY3JlYXRlIGVxdWl2YWxhbmNlcyB3 ZSBjYW4KKwkJICAgICBhdHRhY2ggdG8gdGhlIGxvb3AgZXhpdCBlZGdlLiAgKi8KKwkJICBp bnQgYWx0ZXJuYXRpdmUKKwkJICAgID0gKEVER0VfUFJFRCAoYmIsIDApLT5mbGFncyAmIEVE R0VfREZTX0JBQ0spID8gMSA6IDA7CisKKwkJICBncGhpX2l0ZXJhdG9yIGdzaTsKKwkJICBm b3IgKGdzaSA9IGdzaV9zdGFydF9waGlzIChiYik7CisJCSAgICAgICAhZ3NpX2VuZF9wIChn c2kpOworCQkgICAgICAgZ3NpX25leHQgKCZnc2kpKQorCQkgICAgeworCQkgICAgICAvKiBJ ZiB0aGUgb3RoZXIgYWx0ZXJuYXRpdmUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3VsdCwKKwkJ CSB0aGVuIHRoaXMgaXMgYSBkZWdlbmVyYXRlIGFuZCBjYW4gYmUgaWdub3JlZC4gICovCisJ CSAgICAgIGlmIChkc3QgPT0gUEhJX0FSR19ERUYgKHBoaSwgIWFsdGVybmF0aXZlKSkKKwkJ CWNvbnRpbnVlOworCisJCSAgICAgIC8qIE5vdyBnZXQgdGhlIEVER0VfSU5GTyBjbGFzcyBz byB3ZSBjYW4gYXBwZW5kCisJCQkgaXQgdG8gb3VyIGxpc3QuICBXZSB3YW50IHRoZSBzdWNj ZXNzb3IgZWRnZQorCQkJIHdoZXJlIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QgdGhlIHNvdXJj ZSBvZgorCQkJIGFuIGluY29taW5nIGVkZ2UuICAqLworCQkgICAgICBncGhpICpwaGkgPSBn c2kucGhpICgpOworCQkgICAgICB0cmVlIHNyYyA9IFBISV9BUkdfREVGIChwaGksIGFsdGVy bmF0aXZlKTsKKwkJICAgICAgdHJlZSBkc3QgPSBQSElfUkVTVUxUIChwaGkpOworCisJCSAg ICAgIGlmIChFREdFX1NVQ0MgKGJiLCAwKS0+ZGVzdAorCQkJICAhPSBFREdFX1BSRUQgKGJi LCAhYWx0ZXJuYXRpdmUpLT5zcmMpCisJCQllZGdlX2luZm8gPSAoY2xhc3MgZWRnZV9pbmZv ICopRURHRV9TVUNDIChiYiwgMCktPmF1eDsKKwkJICAgICAgZWxzZQorCQkJZWRnZV9pbmZv ID0gKGNsYXNzIGVkZ2VfaW5mbyAqKUVER0VfU1VDQyAoYmIsIDEpLT5hdXg7CisKKwkJICAg ICAgLyogTm90ZSB0aGF0IHNpbmNlIHRoaXMgcHJvY2Vzc2luZyBpcyBkb25lIGluZGVwZW5k ZW50bHkKKwkJCSBvZiBvdGhlciBlZGdlIGVxdWl2YWxlbmN5IHByb2Nlc3NpbmcsIHdlIG1h eSBub3QKKwkJCSBoYXZlIGFuIEVER0VfSU5GTyBzdHJ1Y3R1cmUgc2V0IHVwIHlldC4gICov CisJCSAgICAgIGlmIChlZGdlX2luZm8gPT0gTlVMTCkKKwkJCWVkZ2VfaW5mbyA9IG5ldyBj bGFzcyBlZGdlX2luZm8gKGZhbHNlX2VkZ2UpOworCQkgICAgICBlZGdlX2luZm8tPnJlY29y ZF9zaW1wbGVfZXF1aXYgKGRzdCwgc3JjKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CiAgICAg ICAgIH0KICAgICB9CiB9Cg== --------------5QFyIDwbkA1Zsh46rEFuKGIV--