From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by sourceware.org (Postfix) with ESMTPS id 3EB73385782D for ; Thu, 17 Mar 2022 00:50:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3EB73385782D Received: by mail-io1-xd32.google.com with SMTP id r2so4326321iod.9 for ; Wed, 16 Mar 2022 17:50:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=6qcYmXELZdZ0HaSzwgs4bNyHU7HijqvE3G5n0//TH4Q=; b=EFhAOdL3/Ye7BYbbYBW0bqXIHA+o9S3HVPZeGVtJXGSNdH9AjehuKUhofw91B7v18b iovNXUwL72H2Se1Vt1U2UiuA3Zg3tJ4I51nZWwZ0PSPsHc6Mi2h/LCC5TNCC52YXK7W9 dJe4DtWL3YIW7EzJie7BFyCd0WiS6bedC0Kbeqb2MnNk1tkT8nWGhFWUX/BtKHA5jey3 2ktjTTl/wBqC3YVnYIrXAPmHQ+8IvaMvU1nROsMtoCMXxuQThaaMlol2uYgsMITOibW7 9CHoKVBTBtbH37zHb6W0e2ERuZeltlXVb0drTY0CwGoqgXGJH/5m89Gd6iX8/zdONk15 mkTQ== X-Gm-Message-State: AOAM533VhRuKPmWivCli27Fz9EV1MpImhi8vbqC2jnISe8NnYfGK2WeW PfZQMsrw4DmbQPJsc5FHam5iN4ZCDu3NyzeYTqYXemOo1FY= X-Google-Smtp-Source: ABdhPJxc7q4zgj/iEzjof05ZODZLBrUvpjCOuvY6s7fdzTdo5pys/C5ZiOXtuHhX8yv+5eRUZS1zJH+JIB01CpBr8Ss= X-Received: by 2002:a05:6638:2192:b0:31a:db8:8d97 with SMTP id s18-20020a056638219200b0031a0db88d97mr848024jaj.201.1647478226049; Wed, 16 Mar 2022 17:50:26 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Zhao Wei Liew Date: Thu, 17 Mar 2022 08:49:50 +0800 Message-ID: Subject: Re: [PATCH][v2] tree-optimization: Fold (type)X / (type)Y [PR103855] To: Richard Biener Cc: GCC Patches Content-Type: multipart/mixed; boundary="00000000000071379c05da5f6adb" X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Mar 2022 00:50:30 -0000 --00000000000071379c05da5f6adb Content-Type: text/plain; charset="UTF-8" Thanks for the detailed review. I have uploaded patch v2 based on the review. v1: https://gcc.gnu.org/pipermail/gcc-patches/2022-February/590604.html Changes since v1: 1. Add patterns for the cases CST / (T)x and (T)x / CST as well. Fix test regressions caused by those patterns. 2. Support signed integers except for the possible INT_MIN / -1 case. 3. Support cases where X and Y have different precisions. On Tue, 22 Feb 2022 at 15:54, Richard Biener wrote: > +/* (type)X / (type)Y -> (type)(X / Y) > + when the resulting type is at least precise as the original types > + and when all the types are unsigned integral types. */ > +(simplify > + (trunc_div (convert @0) (convert @1)) > + (if (INTEGRAL_TYPE_P (type) > + && INTEGRAL_TYPE_P (TREE_TYPE (@0)) > + && INTEGRAL_TYPE_P (TREE_TYPE (@1)) > + && TYPE_UNSIGNED (type) > + && TYPE_UNSIGNED (TREE_TYPE (@0)) > + && TYPE_UNSIGNED (TREE_TYPE (@1)) > + && TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1)) > + && TYPE_PRECISION (type) >= TYPE_PRECISION (TREE_TYPE (@0))) > + (convert (trunc_div @0 @1)))) > > since you are requiring the types of @0 and @1 to match it's easier to write > > && types_match (TREE_TYPE(@0), TREE_TYPE (@1)) > Thanks. In the new patch, TREE_TYPE (@0) and TREE_TYPE (@1) can now have different precisions, so I believe that I can't use types_match() anymore. > that allows you to elide checks on either @0 or @1. I suppose the transform > does not work for signed types because of the -INT_MIN / -1 overflow case? > It might be possible to use expr_not_equal_to (@0, -INT_MIN) || > expr_not_equal_to (@1, -1) > (correctly written, lookup the existing examples in match.pd for the X > % -Y transform) That's right. I have made changes to support signed types except for the INT_MIN / -1 case. > I'll note that as written the transform will not catch CST / (T)x or > (T)x / CST since > you'll not see conversions around constants. I'm not sure whether > using (convert[12]? ...) > or writing special patterns with INTEGER_CST operands is more convenient. > There is int_fits_type_p to check whether a constant will fit in a > type without truncation > or sign change. I see. I couldn't find an easy way to use (convert[12]? ...) in this case so I added 2 other patterns for the CST / (T)x and (T)x / CST cases. > When @0 and @1 do not have the same type there might still be a common type > that can be used and is smaller than 'type', it might be as simple as using > build_nonstandard_integer_type (MIN (@0-prec, @1-prec), 1 /*unsigned_p*/). Thanks for the tip. I've made a similar change, but using either TREE_TYPE (@0) or TREE_TYPE (@1) instead of build_nonstandard_integer_type(). > > In the past there have been attempts to more globally narrow operations using > a new pass rather than using individual patterns. So for more complicated cases > that might be the way to go. There's now also the ISEL pass which does > pre-RTL expansion transforms that need some global context and for example > can look at SSA uses. I had wanted to do something similar to handle all integral trunc_divs, but I'm not sure where/how to start. It seems out of my league at this moment. I'll gladly explore it after this change though! --00000000000071379c05da5f6adb Content-Type: text/plain; charset="US-ASCII"; name="0001-tree-optimization-PR103855-Fold-type-X-type-Y.patch.txt" Content-Disposition: attachment; filename="0001-tree-optimization-PR103855-Fold-type-X-type-Y.patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l0u9ww550 RnJvbSBmNWY3NjhiNTVmNmNhZGNkOWViYTQ1OTU2MWFiZmMxZDdlMjhmOTRlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBaaGFvIFdlaSBMaWV3IDx6aGFvd2VpbGlld0BnbWFpbC5jb20+ CkRhdGU6IFNhdCwgMTkgRmViIDIwMjIgMTY6Mjg6MzggKzA4MDAKU3ViamVjdDogW1BBVENIXSB0 cmVlLW9wdGltaXphdGlvbjogW1BSMTAzODU1XSBGb2xkICh0eXBlKVggLyAodHlwZSlZCgpUaGlz IHBhdHRlcm4gY29udmVydHMgKHRydW5jX2RpdiAoY29udmVydCBYKSAoY29udmVydCBZKSkgdG8K KGNvbnZlcnQgKHRydW5jX2RpdiBYIFkpKSB3aGVuOgoKMS4gdHlwZSwgWCwgYW5kIFkgYXJlIGFs bCBJTlRFR1JBTF9UWVBFUyB3aXRoIHRoZSBzYW1lIHNpZ25lZG5lc3MuCjIuIHR5cGUgaGFzIFRZ UEVfUFJFQ0lTSU9OIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRob3NlIG9mIFggYW5kIFkuCjMuIHRo ZSByZXN1bHQgb2YgdGhlIGRpdmlzaW9uIGlzIGd1YXJhbnRlZWQgdG8gZml0IGluIGVpdGhlcgog ICB0aGUgdHlwZSBvZiBZIG9yIHRoZSB0eXBlIG9mIFkuCgpUaGlzIHBhdGNoIGFsc28gYWRkcyBj b3JyZXNwb25kaW5nIHBhdHRlcm5zIGZvciBDU1QgLyAodHlwZSlZCmFuZCAodHlwZSlYIC8gQ1NU LgoKVGhlc2UgcGF0dGVybnMgdXNlZnVsIGFzIHdpZGVyIGRpdmlzaW9ucyBhcmUgdHlwaWNhbGx5 IG1vcmUgZXhwZW5zaXZlLgoKQm9vdHN0cmFwcGVkIGFuZCByZWdyZXNzaW9uIHRlc3RlZCBvbiB4 ODZfNjQtcGMtbGludXgtZ251LgoKU2lnbmVkLW9mZi1ieTogWmhhbyBXZWkgTGlldyA8emhhb3dl aWxpZXdAZ21haWwuY29tPgoKCVBSIHRyZWUtb3B0aW1pemF0aW9uLzEwMzg1NQoKZ2NjL0NoYW5n ZUxvZzoKCgkqIG1hdGNoLnBkOiBBZGQgcGF0dGVybnMgZm9yICh0eXBlKVggLyAodHlwZSlZLAog ICAgICAgICAgQ1NUIC8gKHR5cGUpWSwgYW5kICh0eXBlKVggLyBDU1QuCgpnY2MvdGVzdHN1aXRl L0NoYW5nZUxvZzoKCgkqIGdjYy5kZy9pcGEvcHI5MTA4OC5jOiBGaXggYSB0ZXN0IHJlZ3Jlc3Np b24uCgkqIGdjYy5kZy90cmVlLXNzYS9kaXZpZGUtOC5jOiBOZXcgdGVzdC4KLS0tCiBnY2MvbWF0 Y2gucGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTcgKysrKysrKysrKysrKysrKysr KysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvcHI5MTA4OC5jICAgICAgIHwgIDQgKy0K IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2RpdmlkZS04LmMgfCA0NSArKysrKysrKysr KysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEwNCBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL2Rp dmlkZS04LmMKCmRpZmYgLS1naXQgYS9nY2MvbWF0Y2gucGQgYi9nY2MvbWF0Y2gucGQKaW5kZXgg OGI0NGI1Y2M5MmMuLmIwYmZiOTRmNTA2IDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIv Z2NjL21hdGNoLnBkCkBAIC02ODcsNiArNjg3LDYzIEBAIERFRklORV9JTlRfQU5EX0ZMT0FUX1JP VU5EX0ZOIChSSU5UKQogIChpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBlKSB8fCBWRUNUT1JfSU5U RUdFUl9UWVBFX1AgKHR5cGUpKQogICAoY29udmVydCAodHJ1bmNfbW9kIEAwIEAxKSkpKQogCisv KiAodHlwZSlYIC8gKHR5cGUpWSAtPiAodHlwZSkoWCAvIFkpCisgICB3aGVuIGFsbCB0eXBlcyBh cmUgaW50ZWdyYWwgYW5kIGhhdmUgdGhlIHNhbWUgc2lnbiBhbmQKKyAgIHRoZSByZXN1bHRpbmcg dHlwZSBpcyBhdCBsZWFzdCBwcmVjaXNlIGFzIHRoZSBvcmlnaW5hbCB0eXBlcywgKi8KKyhzaW1w bGlmeQorICh0cnVuY19kaXYgKGNvbnZlcnQgQDApIChjb252ZXJ0IEAxKSkKKyAoaWYgKElOVEVH UkFMX1RZUEVfUCAodHlwZSkKKyAgICAgICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChA MCkpCisgICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDEpKQorICAgICAgJiYg VFlQRV9QUkVDSVNJT04gKHR5cGUpID49IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKEAwKSkK KyAgICAgICYmIFRZUEVfUFJFQ0lTSU9OICh0eXBlKSA+PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9U WVBFIChAMSkpCisgICAgICAmJiBUWVBFX1VOU0lHTkVEICh0eXBlKSA9PSBUWVBFX1VOU0lHTkVE IChUUkVFX1RZUEUgKEAwKSkKKyAgICAgICYmIFRZUEVfVU5TSUdORUQgKHR5cGUpID09IFRZUEVf VU5TSUdORUQgKFRSRUVfVFlQRSAoQDEpKSkKKyAgKHdpdGgKKyAgIHsKKyAgICB0cmVlIHN0eXBl ID0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAoQDApKSA+IFRZUEVfUFJFQ0lTSU9OIChUUkVF X1RZUEUgKEAxKSkKKyAgICAgICAgICAgICAgICAgPyBUUkVFX1RZUEUgKEAwKSA6IFRSRUVfVFlQ RSAoQDEpOworICAgfQorICAgKGlmIChUWVBFX1VOU0lHTkVEICh0eXBlKQorICAgICAgICAvKiBB dm9pZCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlmIFggbWlnaHQgYmUgSU5UX01JTiBvZiB0aGUgbGFy Z2VyIHR5cGUgb3IKKyAgICAgICAgICAgWSBtaWdodCBiZSAtMSBiZWNhdXNlIHRoZSByZXN1bHQg bWlnaHQgb3ZlcmZsb3cuICovCisgICAgICAgIHx8IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUg KEAwKSkgPCBUWVBFX1BSRUNJU0lPTiAoc3R5cGUpCisgICAgICAgIHx8IGV4cHJfbm90X2VxdWFs X3RvIChAMCwgd2k6OnRvX3dpZGUgKFRZUEVfTUlOX1ZBTFVFIChUUkVFX1RZUEUgKEAwKSkpKQor ICAgICAgICB8fCBleHByX25vdF9lcXVhbF90byAoQDEsIHdpOjptaW51c19vbmUgKFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKEAxKSkpKSkKKyAgICAoY29udmVydCAodHJ1bmNfZGl2IChjb252 ZXJ0OnN0eXBlIEAwKSAoY29udmVydDpzdHlwZSBAMSkpKSkpKSkKKworLyogKHR5cGUpWCAvIENT VCAtPiAodHlwZSkoWCAvIENTVCkgKi8KKyhzaW1wbGlmeQorICh0cnVuY19kaXYgKGNvbnZlcnQg QDApIElOVEVHRVJfQ1NUQDEpCisgKGlmIChJTlRFR1JBTF9UWVBFX1AgKHR5cGUpCisgICAgICAm JiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDApKQorICAgICAgJiYgVFlQRV9VTlNJR05F RCAoVFJFRV9UWVBFIChAMCkpID09IFRZUEVfVU5TSUdORUQgKHR5cGUpCisgICAgICAmJiBpbnRf Zml0c190eXBlX3AgKEAxLCBUUkVFX1RZUEUgKEAwKSkKKyAgICAgICYmIFRZUEVfUFJFQ0lTSU9O ICh0eXBlKSA+PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChAMCkpCisgICAgICAmJiAoVFlQ RV9VTlNJR05FRCAodHlwZSkKKyAgICAgICAvKiBBdm9pZCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlm IFggbWlnaHQgYmUgTUlOX1ZBTFVFIG9yCisgICAgICAgICAgWSBtaWdodCBiZSAtMSBiZWNhdXNl IHRoZSByZXN1bHQgbWlnaHQgb3ZlcmZsb3cuICovCisgICAgICAgfHwgZXhwcl9ub3RfZXF1YWxf dG8gKEAwLCB3aTo6dG9fd2lkZSAoVFlQRV9NSU5fVkFMVUUgKFRSRUVfVFlQRSAoQDApKSkpCisg ICAgICAgfHwgd2k6OnRvX3dpZGUgKEAxKSAhPSAtMSkpCisgICAod2l0aCB7IHRyZWUgc3R5cGUg PSBUUkVFX1RZUEUgKEAwKTsgfQorICAgIChjb252ZXJ0ICh0cnVuY19kaXYgQDAgKGNvbnZlcnQ6 c3R5cGUgQDEpKSkpKSkKKworLyogQ1NUIC8gKHR5cGUpWSAtPiAodHlwZSkoQ1NUIC8gWSkgKi8K KyhzaW1wbGlmeQorICh0cnVuY19kaXYgSU5URUdFUl9DU1RAMCAoY29udmVydCBAMSkpCisgKGlm IChJTlRFR1JBTF9UWVBFX1AgKHR5cGUpCisgICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVf VFlQRSAoQDEpKQorICAgICAgJiYgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChAMSkpID09IFRZ UEVfVU5TSUdORUQgKHR5cGUpCisgICAgICAmJiBpbnRfZml0c190eXBlX3AgKEAwLCBUUkVFX1RZ UEUgKEAxKSkKKyAgICAgICYmIFRZUEVfUFJFQ0lTSU9OICh0eXBlKSA+PSBUWVBFX1BSRUNJU0lP TiAoVFJFRV9UWVBFIChAMSkpCisgICAgICAmJiAoVFlQRV9VTlNJR05FRCAodHlwZSkKKyAgICAg ICAgICAvKiBBdm9pZCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlmIFggbWlnaHQgYmUgTUlOX1ZBTFVF IG9yCisgICAgICAgICAgICAgWSBtaWdodCBiZSAtMSBiZWNhdXNlIHRoZSByZXN1bHQgbWlnaHQg b3ZlcmZsb3cuICovCisgICAgICAgICAgfHwgIXRyZWVfaW50X2NzdF9lcXVhbCAoVFlQRV9NSU5f VkFMVUUgKFRSRUVfVFlQRSAoQDEpKSwgQDApCisgICAgICAgICAgfHwgZXhwcl9ub3RfZXF1YWxf dG8gKEAxLCB3aTo6bWludXNfb25lIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChAMSkpKSkp KQorICAgKHdpdGggeyB0cmVlIHN0eXBlID0gVFJFRV9UWVBFIChAMSk7IH0KKyAgICAoY29udmVy dCAodHJ1bmNfZGl2IChjb252ZXJ0OnN0eXBlIEAwKSBAMSkpKSkpCisKIC8qIHggKiAoMSArIHkg LyB4KSAtIHkgLT4geCAtIHkgJSB4ICovCiAoc2ltcGxpZnkKICAobWludXMgKG11bHQ6Y3MgQDAg KHBsdXM6cyAodHJ1bmNfZGl2OnMgQDEgQDApIGludGVnZXJfb25lcCkpIEAxKQpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvaXBhL3ByOTEwODguYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL2lwYS9wcjkxMDg4LmMKaW5kZXggY2MxNDZhODgxMzQuLmQ3MzMyOTc0ZTM3IDEwMDY0NAot LS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9pcGEvcHI5MTA4OC5jCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL2lwYS9wcjkxMDg4LmMKQEAgLTYwLDcgKzYwLDcgQEAgaW50IGNhbGxlZTEgKHN0 cnVjdCBBIGEpCiAgIGlmICgoYS5mMiArIDcpICYgMTcpCiAgICAgZm9vICgpOwogCi0gIGlmICgo MTMwMCAvIChzaG9ydClhLmYzKSA9PSAxOSkKKyAgaWYgKCgxMzAwIC8gKGEuZjMgJiAweGZmZmYp KSA9PSAxOSkKICAgICBsYXJnZV9jb2RlOwogCiAgIHJldHVybiAxOwpAQCAtMTE1LDYgKzExNSw2 IEBAIGludCBjYWxsZXIgKCkKIC8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wLXRpbWVzICJD cmVhdGluZyBhIHNwZWNpYWxpemVkIG5vZGUgb2YgY2FsbGVlMSIgMSAiY3AiIH0gfSAqLwogLyog eyBkZy1maW5hbCB7IHNjYW4taXBhLWR1bXAtdGltZXMgIkNyZWF0aW5nIGEgc3BlY2lhbGl6ZWQg bm9kZSBvZiBjYWxsZWUyIiAxICJjcCIgfSB9ICovCiAvKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEt ZHVtcC10aW1lcyAiQ3JlYXRpbmcgYSBzcGVjaWFsaXplZCBub2RlIG9mIGNhbGxlZTMiIDEgImNw IiB9IH0gKi8KLS8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJvcDBcXFxbb2Zmc2V0OiAz Ml0sXFwoXFwoc2hvcnQgaW50XFwpICNcXCksXFwoXFwoaW50XFwpICNcXCksXFwoMTMwMCAvICNc XCkgPT0gMTkiICJjcCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1pcGEtZHVtcCAib3Aw XFxcW29mZnNldDogMzJdLFxcKCMgJiA2NTUzNVxcKSxcXCgxMzAwIC8gI1xcKSA9PSAxOSIgImNw IiB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWlwYS1kdW1wICJvcDBcXFxbcmVmIG9mZnNl dDogMF0sXFwoIyBcXF4gMVxcKSA8IiAiY3AiIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4t aXBhLWR1bXAgIm9wMCxcXCgjICYgMjU1XFwpLFxcKDEgLSAjXFwpLFxcKCMgXFwqIDNcXCksXFwo MjcgJSAjXFwpIDwiICJjcCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5k Zy90cmVlLXNzYS9kaXZpZGUtOC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvZGl2 aWRlLTguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZTM4OWU4NWEw NGYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9kaXZp ZGUtOC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIFBSIHRyZWUtb3B0aW1pemF0aW9uLzEwMzg1NSAq LworLyogeyBkZy1vcHRpb25zICItTyAtZmR1bXAtdHJlZS1vcHRpbWl6ZWQiIH0gKi8KKwordW5z aWduZWQgaW50IGYxKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYikgeworCXVuc2lnbmVk IGxvbmcgbG9uZyBhbGwgPSBhOworCXJldHVybiBhbGwgLyBiOworfQorCit1bnNpZ25lZCBpbnQg ZjIodW5zaWduZWQgY2hhciBhLCB1bnNpZ25lZCBpbnQgYikgeworCXVuc2lnbmVkIGxvbmcgbG9u ZyBhbGwgPSBhOworCXJldHVybiBhbGwgLyBiOworfQorCit1bnNpZ25lZCBpbnQgZjModW5zaWdu ZWQgaW50IGEsIHVuc2lnbmVkIGNoYXIgYikgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBhbGwgPSBh OworCXJldHVybiBhbGwgLyBiOworfQorCitpbnQgZjQoY2hhciBhLCBpbnQgYikgeworCWxvbmcg bG9uZyBhbGwgPSBhOworCXJldHVybiBhbGwgLyBiOworfQorCit1bnNpZ25lZCBpbnQgZjUodW5z aWduZWQgaW50IGEpIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWxsID0gYTsKKwlyZXR1cm4gYWxs IC8gMTIzNDU2Nzg5OworfQorCit1bnNpZ25lZCBpbnQgZjYodW5zaWduZWQgaW50IGIpIHsKKwl1 bnNpZ25lZCBsb25nIGxvbmcgYmxsID0gYjsKKwlyZXR1cm4gMTIzNDU2Nzg5IC8gYmxsOworfQor CitpbnQgZjcoaW50IGEpIHsKKyAgbG9uZyBsb25nIGFsbCA9IGE7CisJcmV0dXJuIGFsbCAvIDEy MzQ1Njc4OTsKK30KKworaW50IGY4KGludCBiKSB7CisJbG9uZyBsb25nIGJsbCA9IGI7CisJcmV0 dXJuIDEyMzQ1Njc4OSAvIGJsbDsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w LW5vdCAiXFxcKGxvbmcgbG9uZyB1bnNpZ25lZCBpbnRcXFwpIiAib3B0aW1pemVkIiB9IH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIlxcXChsb25nIGxvbmcgaW50XFxc KSIgIm9wdGltaXplZCIgfSB9ICovCi0tIAoyLjI1LjEKCg== --00000000000071379c05da5f6adb--