From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ua1-x92e.google.com (mail-ua1-x92e.google.com [IPv6:2607:f8b0:4864:20::92e]) by sourceware.org (Postfix) with ESMTPS id BB3013858405 for ; Wed, 10 Nov 2021 07:20:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org BB3013858405 Received: by mail-ua1-x92e.google.com with SMTP id e2so2870086uax.7 for ; Tue, 09 Nov 2021 23:20:30 -0800 (PST) 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=KK/2gt1QBzVIYosG0zbCB90sPZg/LEgHrT/eSdoTQL4=; b=AAcD6BiJGqEA7VcSaBvHdYuNyvzX9F7tfjvoH7/65YQhXikAcjCmJv7SrLOluQBGp8 E6O5bFHrIkb+LpQk7CsV8peAFOUGrq0sxMEoaDEpB0LDzj/HVbTmOJHp9ok5XZWUgPLb zt10/a8yYuRthsyiDPBeFerBHhp1LK+MrAWkqliF9pBE84+Qq3XoMc9Av/TcZsBLsBYT qJ7N5FxG1Dxy4QbsgbYYAGLm01A86ILyObJI7kr9ACR28GiOp+caLkp1Eeqh5ZtCsu8C 2xYeBfxSJGLMwXQd7RVXm3k/9WEadGhBFsRXjNEoQMY1VWLzjUG/YNQdGjW5xsyL5YhZ xa2Q== X-Gm-Message-State: AOAM533oDZuOHd4fEPDD+iaDyP9qsApcTT8sx1wV03HRhujeQREZN9ep MyK2FqeI5KEJOSBSYwDMWWOofBssKltGA/0ci38= X-Google-Smtp-Source: ABdhPJzfputW/mg/zGOPs04QCGXFaYAEurd0Pq9QqVaiMk8WpfVJIPd0IfFf5LQYCJuLHbgMPUOfNG5Fba3j2HpoZCU= X-Received: by 2002:ab0:3ca0:: with SMTP id a32mr19644650uax.63.1636528829799; Tue, 09 Nov 2021 23:20:29 -0800 (PST) MIME-Version: 1.0 References: <20211109020940.108983-1-hongtao.liu@intel.com> In-Reply-To: From: Hongtao Liu Date: Wed, 10 Nov 2021 15:26:57 +0800 Message-ID: Subject: Re: [PATCH] [pass_if_conversion] Extend is_cond_scalar_reduction to handle bit_and/bit_xor/bit_ior. To: Richard Biener Cc: liuhongt , GCC Patches Content-Type: multipart/mixed; boundary="00000000000090cd5d05d06a0f77" X-Spam-Status: No, score=-9.6 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 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: Wed, 10 Nov 2021 07:20:33 -0000 --00000000000090cd5d05d06a0f77 Content-Type: text/plain; charset="UTF-8" On Tue, Nov 9, 2021 at 6:22 PM Richard Biener via Gcc-patches wrote: > > On Tue, Nov 9, 2021 at 3:09 AM liuhongt wrote: > > > > This will enable transformation like > > > > - # sum1_50 = PHI > > - # sum2_52 = PHI > > + # sum1_50 = PHI <_87(13), 0(4)> > > + # sum2_52 = PHI <_89(13), 0(4)> > > # ivtmp_62 = PHI > > i.2_7 = (long unsigned int) i_49; > > _8 = i.2_7 * 8; > > ... > > vec1_i_38 = vec1_29 >> _10; > > vec2_i_39 = vec2_31 >> _10; > > _11 = vec1_i_38 & 1; > > - _63 = tmp_37 ^ sum1_50; > > - prephitmp_64 = _11 == 0 ? sum1_50 : _63; > > + _ifc__86 = _11 != 0 ? tmp_37 : 0; > > + _87 = sum1_50 ^ _ifc__86; > > _12 = vec2_i_39 & 1; > > : > > > > so that vectorizer won't failed due to > > > > /* If this isn't a nested cycle or if the nested cycle reduction value > > is used ouside of the inner loop we cannot handle uses of the reduction > > value. */ > > if (nlatch_def_loop_uses > 1 || nphi_def_loop_uses > 1) > > { > > if (dump_enabled_p ()) > > dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, > > "reduction used in loop.\n"); > > return NULL; > > } > > > > Bootstrap and regtest on x86_64-pc-linux-gnu{-m32,} > > Ok for trunk? > > > > gcc/ChangeLog: > > > > PR tree-optimization/103126 > > * tree-if-conv.c (is_cond_scalar_reduction): Handle > > BIT_XOR_EXPR/BIT_IOR_EXPR/BIT_AND_EXPR. > > (convert_scalar_cond_reduction): Ditto. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/i386/ifcvt-reduction-logic-op.c: New test. > > --- > > .../i386/ifcvt-reduction-logic-op.c | 80 +++++++++++++++++++ > > gcc/tree-if-conv.c | 19 +++-- > > 2 files changed, 92 insertions(+), 7 deletions(-) > > create mode 100644 gcc/testsuite/gcc.target/i386/ifcvt-reduction-logic-op.c > > > > diff --git a/gcc/testsuite/gcc.target/i386/ifcvt-reduction-logic-op.c b/gcc/testsuite/gcc.target/i386/ifcvt-reduction-logic-op.c > > new file mode 100644 > > index 00000000000..eeb822d5d43 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/i386/ifcvt-reduction-logic-op.c > > @@ -0,0 +1,80 @@ > > +/* PR tree-optimization/103126. */ > > +/* { dg-do compile } */ > > +/* { dg-options "-Ofast -mavx2 -ftree-vectorize -fdump-tree-vect-details" } */ > > +/* { dg-final { scan-tree-dump-times "vectorized \[1-3] loops" 3 "vect" } } */ > > +#include > > + > > +void xor_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans, > > + int64_t n) > > +{ > > + int64_t i; > > + uint64_t vec1, sum1; > > + uint64_t vec2, sum2; > > + > > + while (n > 0) { > > + sum1 = 0; > > + vec1 = a[n]; > > + sum2 = 0; > > + vec2 = b[n]; > > + > > + for (i = 0; i < 64; i++) { > > + uint64_t tmp = mat[i]; > > + uint64_t vec1_i = (vec1 >> i); > > + uint64_t vec2_i = (vec2 >> i); > > + sum1 ^= (vec1_i & 1) ? tmp : 0; > > + if (vec2_i&1) sum2 ^= tmp; > > + } > > + *ans++ ^= sum1; n--; > > + *ans++ ^= sum2; n--; > > + } > > +} > > + > > +void ior_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans, > > + int64_t n) > > +{ > > + int64_t i; > > + uint64_t vec1, sum1; > > + uint64_t vec2, sum2; > > + > > + while (n > 0) { > > + sum1 = 0; > > + vec1 = a[n]; > > + sum2 = 0; > > + vec2 = b[n]; > > + > > + for (i = 0; i < 64; i++) { > > + uint64_t tmp = mat[i]; > > + uint64_t vec1_i = (vec1 >> i); > > + uint64_t vec2_i = (vec2 >> i); > > + sum1 |= (vec1_i & 1) ? tmp : 0; > > + if (vec2_i&1) sum2 |= tmp; > > + } > > + *ans++ |= sum1; n--; > > + *ans++ |= sum2; n--; > > + } > > +} > > + > > +void and_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans, > > + int64_t n) > > +{ > > + int64_t i; > > + uint64_t vec1, sum1; > > + uint64_t vec2, sum2; > > + > > + while (n > 0) { > > + sum1 = -1; > > + vec1 = a[n]; > > + sum2 = 0; > > + vec2 = b[n]; > > + > > + for (i = 0; i < 64; i++) { > > + uint64_t tmp = mat[i]; > > + uint64_t vec1_i = (vec1 >> i); > > + uint64_t vec2_i = (vec2 >> i); > > + sum1 &= (vec1_i & 1) ? tmp : -1; > > + if (vec2_i&1) sum2 &= tmp; > > + } > > + *ans++ &= sum1; n--; > > + *ans++ &= sum2; n--; > > + } > > +} > > diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c > > index b165dc0c17f..7df1103ff89 100644 > > --- a/gcc/tree-if-conv.c > > +++ b/gcc/tree-if-conv.c > > @@ -1732,7 +1732,9 @@ is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, > > reduction_op = gimple_assign_rhs_code (stmt); > > } > > > > - if (reduction_op != PLUS_EXPR && reduction_op != MINUS_EXPR) > > + if (reduction_op != PLUS_EXPR && reduction_op != MINUS_EXPR > > + && reduction_op != BIT_IOR_EXPR && reduction_op != BIT_XOR_EXPR > > + && reduction_op != BIT_AND_EXPR) > > Please put each && on a separate line Changed. > > > return false; > > r_op1 = gimple_assign_rhs1 (stmt); > > r_op2 = gimple_assign_rhs2 (stmt); > > @@ -1742,7 +1744,7 @@ is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, > > > > /* Make R_OP1 to hold reduction variable. */ > > if (r_nop2 == PHI_RESULT (header_phi) > > - && reduction_op == PLUS_EXPR) > > + && commutative_tree_code (reduction_op)) > > { > > std::swap (r_op1, r_op2); > > std::swap (r_nop1, r_nop2); > > @@ -1811,7 +1813,10 @@ convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, > > tree rhs1 = gimple_assign_rhs1 (reduc); > > tree tmp = make_temp_ssa_name (TREE_TYPE (rhs1), NULL, "_ifc_"); > > tree c; > > - tree zero = build_zero_cst (TREE_TYPE (rhs1)); > > + enum tree_code reduction_op = gimple_assign_rhs_code (reduc); > > + tree op_nochange = reduction_op != BIT_AND_EXPR > > + ? build_zero_cst (TREE_TYPE (rhs1)) > > + : build_minus_one_cst (TREE_TYPE (rhs1)); > > maybe export neutral_op_for_reduction and use it here (supply NULL > initial_value)? Changed(didn't know there's such function.) > > Otherwise looks OK. > > Thanks, > Richard. > > > gimple_seq stmts = NULL; > > > > if (dump_file && (dump_flags & TDF_DETAILS)) > > @@ -1824,14 +1829,14 @@ convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, > > of reduction rhs. */ > > c = fold_build_cond_expr (TREE_TYPE (rhs1), > > unshare_expr (cond), > > - swap ? zero : op1, > > - swap ? op1 : zero); > > + swap ? op_nochange : op1, > > + swap ? op1 : op_nochange); > > > > /* Create assignment stmt and insert it at GSI. */ > > new_assign = gimple_build_assign (tmp, c); > > gsi_insert_before (gsi, new_assign, GSI_SAME_STMT); > > - /* Build rhs for unconditional increment/decrement. */ > > - rhs = gimple_build (&stmts, gimple_assign_rhs_code (reduc), > > + /* Build rhs for unconditional increment/decrement/logic_operation. */ > > + rhs = gimple_build (&stmts, reduction_op, > > TREE_TYPE (rhs1), op0, tmp); > > > > if (has_nop) > > -- > > 2.18.1 > > Here's the patch i'm going to check in. -- BR, Hongtao --00000000000090cd5d05d06a0f77 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-pass_if_conversion-Extend-is_cond_scalar_reduction-t.patch" Content-Disposition: attachment; filename="0001-pass_if_conversion-Extend-is_cond_scalar_reduction-t.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kvt788gk0 RnJvbSA0MWI4MDZiOTliYjRlN2JmNzYwYmIwYTQ5MDJhZTQyNmUyNTk2ZmQ1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBNb24sIDggTm92IDIwMjEgMTU6NDk6MTcgKzA4MDAKU3ViamVjdDogW1BBVENIXSBbcGFzc19p Zl9jb252ZXJzaW9uXSBFeHRlbmQgaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIHRvCiBoYW5kbGUg Yml0X2FuZC9iaXRfeG9yL2JpdF9pb3IuCgpUaGlzIHdpbGwgZW5hYmxlIHRyYW5zZm9ybWF0aW9u IGxpa2UKCi0gICMgc3VtMV81MCA9IFBISSA8cHJlcGhpdG1wXzY0KDEzKSwgMCg0KT4KLSAgIyBz dW0yXzUyID0gUEhJIDxzdW0yXzIxKDEzKSwgMCg0KT4KKyAgIyBzdW0xXzUwID0gUEhJIDxfODco MTMpLCAwKDQpPgorICAjIHN1bTJfNTIgPSBQSEkgPF84OSgxMyksIDAoNCk+CiAgICMgaXZ0bXBf NjIgPSBQSEkgPGl2dG1wXzYxKDEzKSwgNjQoNCk+CiAgIGkuMl83ID0gKGxvbmcgdW5zaWduZWQg aW50KSBpXzQ5OwogICBfOCA9IGkuMl83ICogODsKLi4uCiAgIHZlYzFfaV8zOCA9IHZlYzFfMjkg Pj4gXzEwOwogICB2ZWMyX2lfMzkgPSB2ZWMyXzMxID4+IF8xMDsKICAgXzExID0gdmVjMV9pXzM4 ICYgMTsKLSAgXzYzID0gdG1wXzM3IF4gc3VtMV81MDsKLSAgcHJlcGhpdG1wXzY0ID0gXzExID09 IDAgPyBzdW0xXzUwIDogXzYzOworICBfaWZjX184NiA9IF8xMSAhPSAwID8gdG1wXzM3IDogMDsK KyAgXzg3ID0gc3VtMV81MCBeIF9pZmNfXzg2OwogICBfMTIgPSB2ZWMyX2lfMzkgJiAxOwo6Cgpz byB0aGF0IHZlY3Rvcml6ZXIgd29uJ3QgZmFpbGVkIGR1ZSB0bwoKICAvKiBJZiB0aGlzIGlzbid0 IGEgbmVzdGVkIGN5Y2xlIG9yIGlmIHRoZSBuZXN0ZWQgY3ljbGUgcmVkdWN0aW9uIHZhbHVlCiAg ICAgaXMgdXNlZCBvdXNpZGUgb2YgdGhlIGlubmVyIGxvb3Agd2UgY2Fubm90IGhhbmRsZSB1c2Vz IG9mIHRoZSByZWR1Y3Rpb24KICAgICB2YWx1ZS4gICovCiAgaWYgKG5sYXRjaF9kZWZfbG9vcF91 c2VzID4gMSB8fCBucGhpX2RlZl9sb29wX3VzZXMgPiAxKQogICAgewogICAgICBpZiAoZHVtcF9l bmFibGVkX3AgKCkpCglkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNTRURfT1BUSU1JWkFUSU9OLCB2 ZWN0X2xvY2F0aW9uLAoJCQkgInJlZHVjdGlvbiB1c2VkIGluIGxvb3AuXG4iKTsKICAgICAgcmV0 dXJuIE5VTEw7CiAgICB9CgpnY2MvQ2hhbmdlTG9nOgoKCVBSIHRyZWUtb3B0aW1pemF0aW9uLzEw MzEyNgoJKiB0cmVlLXZlY3QtbG9vcC5jIChuZXV0cmFsX29wX2Zvcl9yZWR1Y3Rpb24pOiBSZW1v dmUgc3RhdGljLgoJKiB0cmVlLXZlY3Rvcml6ZXIuaCAobmV1dHJhbF9vcF9mb3JfcmVkdWN0aW9u KTogRGVjbGFyZS4KCSogdHJlZS1pZi1jb252LmMgOiBJbmNsdWRlIHRyZWUtdmVjdG9yaXplci5o LgoJKGlzX2NvbmRfc2NhbGFyX3JlZHVjdGlvbik6IEhhbmRsZQoJQklUX1hPUl9FWFBSL0JJVF9J T1JfRVhQUi9CSVRfQU5EX0VYUFIuCgkoY29udmVydF9zY2FsYXJfY29uZF9yZWR1Y3Rpb24pOiBE aXR0by4KCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoKCSogZ2NjLnRhcmdldC9pMzg2L2lmY3Z0 LXJlZHVjdGlvbi1sb2dpYy1vcC5jOiBOZXcgdGVzdC4KLS0tCiAuLi4vaTM4Ni9pZmN2dC1yZWR1 Y3Rpb24tbG9naWMtb3AuYyAgICAgICAgICAgfCA4MCArKysrKysrKysrKysrKysrKysrCiBnY2Mv dHJlZS1pZi1jb252LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMCArKystLQogZ2Nj L3RyZWUtdmVjdC1sb29wLmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGdjYy90 cmVlLXZlY3Rvcml6ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxICsKIDQgZmlsZXMg Y2hhbmdlZCwgOTUgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9pZmN2dC1yZWR1Y3Rpb24tbG9naWMt b3AuYwoKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2lmY3Z0LXJl ZHVjdGlvbi1sb2dpYy1vcC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvaWZjdnQt cmVkdWN0aW9uLWxvZ2ljLW9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLmVlYjgyMmQ1ZDQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvaWZjdnQtcmVkdWN0aW9uLWxvZ2ljLW9wLmMKQEAgLTAsMCArMSw4MCBAQAorLyog UFIgdHJlZS1vcHRpbWl6YXRpb24vMTAzMTI2LiAgKi8KKy8qIHsgZGctZG8gY29tcGlsZSB9ICov CisvKiB7IGRnLW9wdGlvbnMgIi1PZmFzdCAtbWF2eDIgLWZ0cmVlLXZlY3Rvcml6ZSAtZmR1bXAt dHJlZS12ZWN0LWRldGFpbHMiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10 aW1lcyAidmVjdG9yaXplZCBcWzEtM10gbG9vcHMiIDMgInZlY3QiIH0gfSAqLworI2luY2x1ZGU8 c3RkaW50Lmg+CisKK3ZvaWQgeG9yX2JpdF9hcnJfbm9sY2QgKHVpbnQ2NF90ICpfX3Jlc3RyaWN0 IG1hdCwgdWludDY0X3QqIGEsdWludDY0X3QqIGIsIHVpbnQ2NF90ICpfX3Jlc3RyaWN0IGFucywK KyAgICBpbnQ2NF90IG4pCit7CisgIGludDY0X3QgaTsKKyAgdWludDY0X3QgdmVjMSwgc3VtMTsK KyAgdWludDY0X3QgdmVjMiwgc3VtMjsKKworICB3aGlsZSAobiA+IDApIHsKKyAgICBzdW0xID0g MDsKKyAgICB2ZWMxID0gYVtuXTsKKyAgICBzdW0yID0gMDsKKyAgICB2ZWMyID0gYltuXTsKKwor ICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICB1aW50NjRfdCB0bXAgPSBtYXRb aV07CisgICAgICB1aW50NjRfdCB2ZWMxX2kgPSAodmVjMSA+PiBpKTsKKyAgICAgIHVpbnQ2NF90 IHZlYzJfaSA9ICh2ZWMyID4+IGkpOworICAgICAgc3VtMSBePSAodmVjMV9pICYgMSkgPyB0bXAg OiAwOworICAgICAgaWYgKHZlYzJfaSYxKSBzdW0yIF49IHRtcDsKKyAgICB9CisgICAgKmFucysr IF49IHN1bTE7ICBuLS07CisgICAgKmFucysrIF49IHN1bTI7ICBuLS07CisgIH0KK30KKwordm9p ZCBpb3JfYml0X2Fycl9ub2xjZCAodWludDY0X3QgKl9fcmVzdHJpY3QgbWF0LCB1aW50NjRfdCog YSx1aW50NjRfdCogYiwgdWludDY0X3QgKl9fcmVzdHJpY3QgYW5zLAorICAgIGludDY0X3QgbikK K3sKKyAgaW50NjRfdCBpOworICB1aW50NjRfdCB2ZWMxLCBzdW0xOworICB1aW50NjRfdCB2ZWMy LCBzdW0yOworCisgIHdoaWxlIChuID4gMCkgeworICAgIHN1bTEgPSAwOworICAgIHZlYzEgPSBh W25dOworICAgIHN1bTIgPSAwOworICAgIHZlYzIgPSBiW25dOworCisgICAgZm9yIChpID0gMDsg aSA8IDY0OyBpKyspIHsKKyAgICAgIHVpbnQ2NF90IHRtcCA9IG1hdFtpXTsKKyAgICAgIHVpbnQ2 NF90IHZlYzFfaSA9ICh2ZWMxID4+IGkpOworICAgICAgdWludDY0X3QgdmVjMl9pID0gKHZlYzIg Pj4gaSk7CisgICAgICBzdW0xIHw9ICh2ZWMxX2kgJiAxKSA/IHRtcCA6IDA7CisgICAgICBpZiAo dmVjMl9pJjEpIHN1bTIgfD0gdG1wOworICAgIH0KKyAgICAqYW5zKysgfD0gc3VtMTsgIG4tLTsK KyAgICAqYW5zKysgfD0gc3VtMjsgIG4tLTsKKyAgfQorfQorCit2b2lkIGFuZF9iaXRfYXJyX25v bGNkICh1aW50NjRfdCAqX19yZXN0cmljdCBtYXQsIHVpbnQ2NF90KiBhLHVpbnQ2NF90KiBiLCB1 aW50NjRfdCAqX19yZXN0cmljdCBhbnMsCisgICAgaW50NjRfdCBuKQoreworICBpbnQ2NF90IGk7 CisgIHVpbnQ2NF90IHZlYzEsIHN1bTE7CisgIHVpbnQ2NF90IHZlYzIsIHN1bTI7CisKKyAgd2hp bGUgKG4gPiAwKSB7CisgICAgc3VtMSA9IC0xOworICAgIHZlYzEgPSBhW25dOworICAgIHN1bTIg PSAwOworICAgIHZlYzIgPSBiW25dOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsK KyAgICAgIHVpbnQ2NF90IHRtcCA9IG1hdFtpXTsKKyAgICAgIHVpbnQ2NF90IHZlYzFfaSA9ICh2 ZWMxID4+IGkpOworICAgICAgdWludDY0X3QgdmVjMl9pID0gKHZlYzIgPj4gaSk7CisgICAgICBz dW0xICY9ICh2ZWMxX2kgJiAxKSA/IHRtcCA6IC0xOworICAgICAgaWYgKHZlYzJfaSYxKSBzdW0y ICY9IHRtcDsKKyAgICB9CisgICAgKmFucysrICY9IHN1bTE7ICBuLS07CisgICAgKmFucysrICY9 IHN1bTI7ICBuLS07CisgIH0KK30KZGlmZiAtLWdpdCBhL2djYy90cmVlLWlmLWNvbnYuYyBiL2dj Yy90cmVlLWlmLWNvbnYuYwppbmRleCBiMTY1ZGMwYzE3Zi4uZTg4ZGRjOWY3ODggMTAwNjQ0Ci0t LSBhL2djYy90cmVlLWlmLWNvbnYuYworKysgYi9nY2MvdHJlZS1pZi1jb252LmMKQEAgLTEyMCw2 ICsxMjAsNyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90 IHNlZQogI2luY2x1ZGUgInRyZWUtc3NhLXNjY3ZuLmgiCiAjaW5jbHVkZSAidHJlZS1jZmdjbGVh bnVwLmgiCiAjaW5jbHVkZSAidHJlZS1zc2EtZHNlLmgiCisjaW5jbHVkZSAidHJlZS12ZWN0b3Jp emVyLmgiCiAKIC8qIE9ubHkgaGFuZGxlIFBISXMgd2l0aCBubyBtb3JlIGFyZ3VtZW50cyB1bmxl c3Mgd2UgYXJlIGFza2VkIHRvIGJ5CiAgICBzaW1kIHByYWdtYS4gICovCkBAIC0xNzMyLDcgKzE3 MzMsMTEgQEAgaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChnaW1wbGUgKnBoaSwgZ2ltcGxlICoq cmVkdWMsIHRyZWUgYXJnXzAsIHRyZWUgYXJnXzEsCiAgICAgICByZWR1Y3Rpb25fb3AgPSBnaW1w bGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsKICAgICB9CiAKLSAgaWYgKHJlZHVjdGlvbl9vcCAh PSBQTFVTX0VYUFIgJiYgcmVkdWN0aW9uX29wICE9IE1JTlVTX0VYUFIpCisgIGlmIChyZWR1Y3Rp b25fb3AgIT0gUExVU19FWFBSCisgICAgICAmJiByZWR1Y3Rpb25fb3AgIT0gTUlOVVNfRVhQUgor ICAgICAgJiYgcmVkdWN0aW9uX29wICE9IEJJVF9JT1JfRVhQUgorICAgICAgJiYgcmVkdWN0aW9u X29wICE9IEJJVF9YT1JfRVhQUgorICAgICAgJiYgcmVkdWN0aW9uX29wICE9IEJJVF9BTkRfRVhQ UikKICAgICByZXR1cm4gZmFsc2U7CiAgIHJfb3AxID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10 KTsKICAgcl9vcDIgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOwpAQCAtMTc0Miw3ICsxNzQ3 LDcgQEAgaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChnaW1wbGUgKnBoaSwgZ2ltcGxlICoqcmVk dWMsIHRyZWUgYXJnXzAsIHRyZWUgYXJnXzEsCiAKICAgLyogTWFrZSBSX09QMSB0byBob2xkIHJl ZHVjdGlvbiB2YXJpYWJsZS4gICovCiAgIGlmIChyX25vcDIgPT0gUEhJX1JFU1VMVCAoaGVhZGVy X3BoaSkKLSAgICAgICYmIHJlZHVjdGlvbl9vcCA9PSBQTFVTX0VYUFIpCisgICAgICAmJiBjb21t dXRhdGl2ZV90cmVlX2NvZGUgKHJlZHVjdGlvbl9vcCkpCiAgICAgewogICAgICAgc3RkOjpzd2Fw IChyX29wMSwgcl9vcDIpOwogICAgICAgc3RkOjpzd2FwIChyX25vcDEsIHJfbm9wMik7CkBAIC0x ODExLDcgKzE4MTYsOCBAQCBjb252ZXJ0X3NjYWxhcl9jb25kX3JlZHVjdGlvbiAoZ2ltcGxlICpy ZWR1YywgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSwKICAgdHJlZSByaHMxID0gZ2ltcGxlX2Fz c2lnbl9yaHMxIChyZWR1Yyk7CiAgIHRyZWUgdG1wID0gbWFrZV90ZW1wX3NzYV9uYW1lIChUUkVF X1RZUEUgKHJoczEpLCBOVUxMLCAiX2lmY18iKTsKICAgdHJlZSBjOwotICB0cmVlIHplcm8gPSBi dWlsZF96ZXJvX2NzdCAoVFJFRV9UWVBFIChyaHMxKSk7CisgIGVudW0gdHJlZV9jb2RlIHJlZHVj dGlvbl9vcCAgPSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChyZWR1Yyk7CisgIHRyZWUgb3Bfbm9j aGFuZ2UgPSBuZXV0cmFsX29wX2Zvcl9yZWR1Y3Rpb24gKFRSRUVfVFlQRSAocmhzMSksIHJlZHVj dGlvbl9vcCwgTlVMTCk7CiAgIGdpbXBsZV9zZXEgc3RtdHMgPSBOVUxMOwogCiAgIGlmIChkdW1w X2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCkBAIC0xODI0LDE0ICsxODMwLDE0 IEBAIGNvbnZlcnRfc2NhbGFyX2NvbmRfcmVkdWN0aW9uIChnaW1wbGUgKnJlZHVjLCBnaW1wbGVf c3RtdF9pdGVyYXRvciAqZ3NpLAogICAgICBvZiByZWR1Y3Rpb24gcmhzLiAgKi8KICAgYyA9IGZv bGRfYnVpbGRfY29uZF9leHByIChUUkVFX1RZUEUgKHJoczEpLAogCQkJICAgIHVuc2hhcmVfZXhw ciAoY29uZCksCi0JCQkgICAgc3dhcCA/IHplcm8gOiBvcDEsCi0JCQkgICAgc3dhcCA/IG9wMSA6 IHplcm8pOworCQkJICAgIHN3YXAgPyBvcF9ub2NoYW5nZSA6IG9wMSwKKwkJCSAgICBzd2FwID8g b3AxIDogb3Bfbm9jaGFuZ2UpOwogCiAgIC8qIENyZWF0ZSBhc3NpZ25tZW50IHN0bXQgYW5kIGlu c2VydCBpdCBhdCBHU0kuICAqLwogICBuZXdfYXNzaWduID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAo dG1wLCBjKTsKICAgZ3NpX2luc2VydF9iZWZvcmUgKGdzaSwgbmV3X2Fzc2lnbiwgR1NJX1NBTUVf U1RNVCk7Ci0gIC8qIEJ1aWxkIHJocyBmb3IgdW5jb25kaXRpb25hbCBpbmNyZW1lbnQvZGVjcmVt ZW50LiAgKi8KLSAgcmhzID0gZ2ltcGxlX2J1aWxkICgmc3RtdHMsIGdpbXBsZV9hc3NpZ25fcmhz X2NvZGUgKHJlZHVjKSwKKyAgLyogQnVpbGQgcmhzIGZvciB1bmNvbmRpdGlvbmFsIGluY3JlbWVu dC9kZWNyZW1lbnQvbG9naWNfb3BlcmF0aW9uLiAgKi8KKyAgcmhzID0gZ2ltcGxlX2J1aWxkICgm c3RtdHMsIHJlZHVjdGlvbl9vcCwKIAkJICAgICAgVFJFRV9UWVBFIChyaHMxKSwgb3AwLCB0bXAp OwogCiAgIGlmIChoYXNfbm9wKQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtdmVjdC1sb29wLmMgYi9n Y2MvdHJlZS12ZWN0LWxvb3AuYwppbmRleCBhMjhiYjYzMjFkNy4uZmE0Y2Y4OGNlNTEgMTAwNjQ0 Ci0tLSBhL2djYy90cmVlLXZlY3QtbG9vcC5jCisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC5jCkBA IC0zMzMwLDcgKzMzMzAsNyBAQCByZWR1Y3Rpb25fZm5fZm9yX3NjYWxhcl9jb2RlIChlbnVtIHRy ZWVfY29kZSBjb2RlLCBpbnRlcm5hbF9mbiAqcmVkdWNfZm4pCiAgICBvZiB0aGUgc2NhbGFyIGVs ZW1lbnRzLiAgSWYgdGhlIHJlZHVjdGlvbiBoYXMganVzdCBhIHNpbmdsZSBpbml0aWFsIHZhbHVl CiAgICB0aGVuIElOSVRJQUxfVkFMVUUgaXMgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGl0IGlzIG51 bGwuICAqLwogCi1zdGF0aWMgdHJlZQordHJlZQogbmV1dHJhbF9vcF9mb3JfcmVkdWN0aW9uICh0 cmVlIHNjYWxhcl90eXBlLCB0cmVlX2NvZGUgY29kZSwgdHJlZSBpbml0aWFsX3ZhbHVlKQogewog ICBzd2l0Y2ggKGNvZGUpCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0b3JpemVyLmggYi9nY2Mv dHJlZS12ZWN0b3JpemVyLmgKaW5kZXggYjU1MmU5ZGNjY2UuLjUxYWIyMTg5NmFhIDEwMDY0NAot LS0gYS9nY2MvdHJlZS12ZWN0b3JpemVyLmgKKysrIGIvZ2NjL3RyZWUtdmVjdG9yaXplci5oCkBA IC0yMTIwLDYgKzIxMjAsNyBAQCBleHRlcm4gdHJlZSB2ZWN0X2NyZWF0ZV9hZGRyX2Jhc2VfZm9y X3ZlY3Rvcl9yZWYgKHZlY19pbmZvICosCiAJCQkJCQkgIHRyZWUpOwogCiAvKiBJbiB0cmVlLXZl Y3QtbG9vcC5jLiAgKi8KK2V4dGVybiB0cmVlIG5ldXRyYWxfb3BfZm9yX3JlZHVjdGlvbiAodHJl ZSwgdHJlZV9jb2RlLCB0cmVlKTsKIGV4dGVybiB3aWRlc3RfaW50IHZlY3RfaXZfbGltaXRfZm9y X3BhcnRpYWxfdmVjdG9ycyAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvKTsKIGJvb2wgdmVjdF9y Z3JvdXBfaXZfbWlnaHRfd3JhcF9wIChsb29wX3ZlY19pbmZvLCByZ3JvdXBfY29udHJvbHMgKik7 CiAvKiBVc2VkIGluIHRyZWUtdmVjdC1sb29wLW1hbmlwLmMgKi8KLS0gCjIuMTguMQoK --00000000000090cd5d05d06a0f77--