From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3065 invoked by alias); 10 Oct 2011 13:22:15 -0000 Received: (qmail 3037 invoked by uid 22791); 10 Oct 2011 13:22:13 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-vx0-f175.google.com (HELO mail-vx0-f175.google.com) (209.85.220.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 10 Oct 2011 13:21:55 +0000 Received: by vcbfl17 with SMTP id fl17so5322093vcb.20 for ; Mon, 10 Oct 2011 06:21:54 -0700 (PDT) Received: by 10.220.39.10 with SMTP id d10mr1427190vce.0.1318252914038; Mon, 10 Oct 2011 06:21:54 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.150.13 with HTTP; Mon, 10 Oct 2011 06:21:34 -0700 (PDT) In-Reply-To: References: From: Artem Shinkarov Date: Mon, 10 Oct 2011 13:27:00 -0000 Message-ID: Subject: Re: New warning for expanded vector operations To: Richard Guenther Cc: GCC Patches Content-Type: multipart/mixed; boundary=bcaec54ee5f0aa58f404aef1ac48 X-IsSubscribed: yes 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 X-SW-Source: 2011-10/txt/msg00761.txt.bz2 --bcaec54ee5f0aa58f404aef1ac48 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 11086 On Mon, Oct 10, 2011 at 12:02 PM, Richard Guenther wrote: > On Fri, Oct 7, 2011 at 9:44 AM, Artem Shinkarov > wrote: >> On Fri, Oct 7, 2011 at 6:22 AM, Artem Shinkarov >> wrote: >>> On Wed, Oct 5, 2011 at 12:35 PM, Richard Guenther >>> wrote: >>>> On Wed, Oct 5, 2011 at 1:28 PM, Artem Shinkarov >>>> wrote: >>>>> On Wed, Oct 5, 2011 at 9:40 AM, Richard Guenther >>>>> wrote: >>>>>> On Wed, Oct 5, 2011 at 12:18 AM, Artem Shinkarov >>>>>> wrote: >>>>>>> Hi >>>>>>> >>>>>>> Here is a patch to inform a programmer about the expanded vector op= eration. >>>>>>> Bootstrapped on x86-unknown-linux-gnu. >>>>>>> >>>>>>> ChangeLog: >>>>>>> >>>>>>> =A0 =A0 =A0 =A0* gcc/tree-vect-generic.c (expand_vector_piecewise):= Adjust to >>>>>>> =A0 =A0 =A0 =A0 =A0produce the warning. >>>>>>> =A0 =A0 =A0 =A0 =A0(expand_vector_parallel): Adjust to produce the = warning. >>>>>> >>>>>> Entries start without gcc/, they are relative to the gcc/ChangeLog f= ile. >>>>> >>>>> Sure, sorry. >>>>> >>>>>>> =A0 =A0 =A0 =A0 =A0(lower_vec_shuffle): Adjust to produce the warni= ng. >>>>>>> =A0 =A0 =A0 =A0* gcc/common.opt: New warning Wvector-operation-expa= nded. >>>>>>> =A0 =A0 =A0 =A0* gcc/doc/invoke.texi: Document the wawning. >>>>>>> >>>>>>> >>>>>>> Ok? >>>>>> >>>>>> I don't like the name -Wvector-operation-expanded. =A0We emit a >>>>>> similar warning for missed inline expansions with -Winline, so >>>>>> maybe -Wvector-extensions (that's the name that appears >>>>>> in the C extension documentation). >>>>> >>>>> Hm, I don't care much about the name, unless it gets clear what the >>>>> warning is used for. =A0I am not really sure that Wvector-extensions >>>>> makes it clear. =A0Also, I don't see anything bad if the warning will >>>>> pop up during the vectorisation. Any vector operation performed >>>>> outside the SIMD accelerator looks suspicious, because it actually >>>>> doesn't improve performance. =A0Such a warning during the vectorisati= on >>>>> could mean that a programmer forgot some flag, or the constant >>>>> propagation failed to deliver a constant, or something else. >>>>> >>>>> Conceptually the text I am producing is not really a warning, it is >>>>> more like an information, but I am not aware of the mechanisms that >>>>> would allow me to introduce a flag triggering inform () or something >>>>> similar. >>>>> >>>>> What I think we really need to avoid is including this warning in the >>>>> standard Ox. >>>>> >>>>>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>>>>> + >>>>>> + =A0warning_at (loc, OPT_Wvector_operation_expanded, >>>>>> + =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded piecewi= se"); >>>>>> >>>>>> =A0 v =3D VEC_alloc(constructor_elt, gc, (nunits + delta - 1) / delt= a); >>>>>> =A0 for (i =3D 0; i < nunits; >>>>>> @@ -260,6 +264,10 @@ expand_vector_parallel (gimple_stmt_iter >>>>>> =A0 tree result, compute_type; >>>>>> =A0 enum machine_mode mode; >>>>>> =A0 int n_words =3D tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_= PER_WORD; >>>>>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>>>>> + >>>>>> + =A0warning_at (loc, OPT_Wvector_operation_expanded, >>>>>> + =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded in para= llel"); >>>>>> >>>>>> what's the difference between 'piecewise' and 'in parallel'? >>>>> >>>>> Parallel is a little bit better for performance than piecewise. >>>> >>>> I see. =A0That difference should probably be documented, maybe with >>>> an example. >>>> >>>> Richard. >>>> >>>>>> @@ -301,16 +309,15 @@ expand_vector_addition (gimple_stmt_iter >>>>>> =A0{ >>>>>> =A0 int parts_per_word =3D UNITS_PER_WORD >>>>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 / tree_low_cst (TYPE_SIZ= E_UNIT (TREE_TYPE (type)), 1); >>>>>> + =A0location_t loc =3D gimple_location (gsi_stmt (*gsi)); >>>>>> >>>>>> =A0 if (INTEGRAL_TYPE_P (TREE_TYPE (type)) >>>>>> =A0 =A0 =A0 && parts_per_word >=3D 4 >>>>>> =A0 =A0 =A0 && TYPE_VECTOR_SUBPARTS (type) >=3D 4) >>>>>> - =A0 =A0return expand_vector_parallel (gsi, f_parallel, >>>>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0type, a, b, code); >>>>>> + =A0 =A0return expand_vector_parallel (gsi, f_parallel, type, a, b,= code); >>>>>> =A0 else >>>>>> - =A0 =A0return expand_vector_piecewise (gsi, f, >>>>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 type, TREE_TYPE (type), >>>>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 a, b, code); >>>>>> + =A0 =A0return expand_vector_piecewise (gsi, f, type, >>>>>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 TREE_TYPE (type), a, b, code); >>>>>> =A0} >>>>>> >>>>>> =A0/* Check if vector VEC consists of all the equal elements and >>>>>> >>>>>> unless i miss something loc is unused here. =A0Please avoid random >>>>>> whitespace changes (just review your patch yourself before posting >>>>>> and revert pieces that do nothing). >>>>> >>>>> Yes you are right, sorry. >>>>> >>>>>> +@item -Wvector-operation-expanded >>>>>> +@opindex Wvector-operation-expanded >>>>>> +@opindex Wno-vector-operation-expanded >>>>>> +Warn if vector operation is not implemented via SIMD capabilities o= f the >>>>>> +architecture. Mainly useful for the performance tuning. >>>>>> >>>>>> I'd mention that this is for vector operations as of the C extension >>>>>> documented in "Vector Extensions". >>>>>> >>>>>> The vectorizer can produce some operations that will need further >>>>>> lowering - we probably should make sure to _not_ warn about those. >>>>>> Try running the vect.exp testsuite with the new warning turned on >>>>>> (eventually disabling SSE), like with >>>>>> >>>>>> obj/gcc> make check-gcc >>>>>> RUNTESTFLAGS=3D"--target_board=3Dunix/-Wvector-extensions/-mno-sse >>>>>> vect.exp" >>>>> >>>>> Again, see the comment above. I think, if the warning can be triggered >>>>> only manually, then we are fine. But I'll check anyway how many >>>>> warnings I'll get from vect.exp. >>>>> >>>>>>> P.S. It is hard to write a reasonable testcase for the patch, becau= se >>>>>>> one needs to guess which architecture would expand a given vector >>>>>>> operation. But the patch is trivial. >>>>>> >>>>>> You can create an aritificial large vector type for example, or put a >>>>>> testcase under gcc.target/i386 and disable SSE. =A0We should have >>>>>> a testcase for this. >>>>> >>>>> Yeah, disabling SSE should help. >>>>> >>>>> >>>>> Thanks, >>>>> Artem. >>>>>> Thanks, >>>>>> Richard. >>>>>> >>>>> >>>> >>> >>> New version of the patch in the attachment with the test-cases. >>> Bootstrapped on =A0x86_64-apple-darwin10.8.0. >>> Currently is being tested. >>> >>> >>> Richard, I've checked the vect.exp case, as you suggested. =A0It caused >>> a lot of failures, but not because of the new warning. =A0The main >>> reason is -mno-sse. =A0The target is capable to vectorize, so the dg >>> option expects tests to pass, but the artificial option makes them >>> fail. =A0Checking the new warning on vect.exp without -mno-sse, it >>> didn't cause any new failures. =A0Anyway, we should be pretty much safe, >>> cause the warning is not a part of -O3. >>> >>> Thanks, >>> Artem. >>> >> >> Successfully regression-tested on x86_64-apple-darwin10.8.0. >> >> ChangeLog: >> =A0 =A0 =A0 =A0gcc/ >> =A0 =A0 =A0 =A0* doc/invoke.texi: Document new warning. >> =A0 =A0 =A0 =A0* common.opt (Wvector-operation-performance): Define new = warning. >> =A0 =A0 =A0 =A0* tree-vect-generic.c (expand_vector_piecewise): Warn abo= ut expanded >> =A0 =A0 =A0 =A0vector operation. >> =A0 =A0 =A0 =A0(exapnd_vector_parallel): Warn about expanded vector oper= ation. >> =A0 =A0 =A0 =A0(lower_vec_shuffle): Warn about expanded vector operation. >> =A0 =A0 =A0 =A0* c-parser.c (c_parser_postfix_expression): Assign correc= t location >> =A0 =A0 =A0 =A0when creating VEC_SHUFFLE_EXPR. >> >> =A0 =A0 =A0 =A0gcc/testsuite/ >> =A0 =A0 =A0 =A0* gcc.target/i386/warn-vect-op-3.c: New test. >> =A0 =A0 =A0 =A0* gcc.target/i386/warn-vect-op-1.c: New test. >> =A0 =A0 =A0 =A0* gcc.target/i386/warn-vect-op-2.c: New test. >> >> Ok for trunk? > > + =A0if (gimple_expr_type (gsi_stmt (*gsi)) =3D=3D type) > + =A0 =A0warning_at (loc, OPT_Wvector_operation_performance, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded piecewis= e"); > + =A0else > + =A0 =A0warning_at (loc, OPT_Wvector_operation_performance, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded in paral= lel"); > > we should not check for exact type equivalence here. =A0Please > use types_compatible_p (gimple_expr_type (gsi_stmt (*gsi)), type) > instead. =A0We could also consider to pass down the kind of lowering > from the caller (or warn in the callers). Ok, Fixed. > > @@ -284,6 +293,9 @@ expand_vector_parallel (gimple_stmt_iter > =A0 =A0 =A0 mode =3D mode_for_size (tree_low_cst (TYPE_SIZE (type), 1), M= ODE_INT, 0); > =A0 =A0 =A0 compute_type =3D lang_hooks.types.type_for_mode (mode, 1); > =A0 =A0 =A0 result =3D f (gsi, compute_type, a, b, NULL_TREE, NULL_TREE, = code); > + =A0 =A0 =A0warning_at (loc, OPT_Wvector_operation_performance, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "vector operation will be expanded with= a " > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "single scalar operation"); > > That means it will be fast, no? =A0Why warn for it at all? Most likely it means sower. Eventually it is a different kind of the expansion. This situation could happen when you work with MMX vectors, and by some reason instead of a single MMX operation, you will have register operation + masking. > > @@ -308,7 +320,7 @@ expand_vector_addition (gimple_stmt_iter > =A0 =A0 return expand_vector_parallel (gsi, f_parallel, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 type,= a, b, code); > =A0 else > - =A0 =A0return expand_vector_piecewise (gsi, f, > + =A0 =A0return expand_vector_piecewise (gsi, f, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ty= pe, TREE_TYPE (type), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0a,= b, code); > =A0} > > You add trailing space here ... (please review your patches yourself > for this kind of errors) > > + =A0 =A0 =A0 =A0 =A0 =A0 { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 expr.value =3D > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 c_build_vec_shuffle_expr > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (loc, VEC_index (c_expr_t, cexpr_li= st, 0)->value, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0NULL_TREE, VEC_index (c_expr_t, = cexpr_list, 1)->value); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 SET_EXPR_LOCATION (expr.value, loc); > > That looks odd - see the 'loc' argument passed to c_build_vec_shuffle_exp= r. > If then that routine needs fixing. Ok, moved to c-typeck.c. The new version is in the attachment. Boostrapped on x86_64-apple-darwin10= .8.0. Ok? Thanks, Artem. > Thanks, > Richard. > >> >> Thanks, >> Artem. >> > --bcaec54ee5f0aa58f404aef1ac48 Content-Type: application/octet-stream; name="vector-op-warning-2.diff" Content-Disposition: attachment; filename="vector-op-warning-2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gtli1dl30 Content-length: 11525 SW5kZXg6IGdjYy9kb2MvaW52b2tlLnRleGkKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gZ2NjL2RvYy9pbnZva2UudGV4aQkocmV2aXNpb24gMTc5NzQ0 KQorKysgZ2NjL2RvYy9pbnZva2UudGV4aQkod29ya2luZyBjb3B5KQpAQCAt MjcxLDcgKzI3MSw4IEBAIE9iamVjdGl2ZS1DIGFuZCBPYmplY3RpdmUtQysr IERpYWxlY3RzfS4KIC1XdW51c2VkLWxhYmVsICAtV3VudXNlZC1sb2NhbC10 eXBlZGVmcyAtV3VudXNlZC1wYXJhbWV0ZXIgQGdvbAogLVduby11bnVzZWQt cmVzdWx0IC1XdW51c2VkLXZhbHVlIEBnb2wgLVd1bnVzZWQtdmFyaWFibGUg QGdvbAogLVd1bnVzZWQtYnV0LXNldC1wYXJhbWV0ZXIgLVd1bnVzZWQtYnV0 LXNldC12YXJpYWJsZSBAZ29sCi0tV3ZhcmlhZGljLW1hY3JvcyAtV3ZsYSAt V3ZvbGF0aWxlLXJlZ2lzdGVyLXZhciAgLVd3cml0ZS1zdHJpbmdzfQorLVd2 YXJpYWRpYy1tYWNyb3MgLVd2ZWN0b3Itb3BlcmF0aW9uLXBlcmZvcm1hbmNl IC1XdmxhIAorLVd2b2xhdGlsZS1yZWdpc3Rlci12YXIgIC1Xd3JpdGUtc3Ry aW5nc30KIAogQGl0ZW0gQyBhbmQgT2JqZWN0aXZlLUMtb25seSBXYXJuaW5n IE9wdGlvbnMKIEBnY2NvcHRsaXN0ey1XYmFkLWZ1bmN0aW9uLWNhc3QgIC1X bWlzc2luZy1kZWNsYXJhdGlvbnMgQGdvbApAQCAtNDUzNSw2ICs0NTM2LDE4 IEBAIFdhcm4gaWYgdmFyaWFkaWMgbWFjcm9zIGFyZSB1c2VkIGluIHBlZGEK IGFsdGVybmF0ZSBzeW50YXggd2hlbiBpbiBwZWRhbnRpYyBJU08gQzk5IG1v ZGUuICBUaGlzIGlzIGRlZmF1bHQuCiBUbyBpbmhpYml0IHRoZSB3YXJuaW5n IG1lc3NhZ2VzLCB1c2UgQG9wdGlvbnstV25vLXZhcmlhZGljLW1hY3Jvc30u CiAKK0BpdGVtIC1XdmVjdG9yLW9wZXJhdGlvbi1wZXJmb3JtYW5jZQorQG9w aW5kZXggV3ZlY3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UKK0BvcGluZGV4 IFduby12ZWN0b3Itb3BlcmF0aW9uLXBlcmZvcm1hbmNlCitXYXJuIGlmIHZl Y3RvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkIHZpYSBTSU1EIGNh cGFiaWxpdGllcyBvZiB0aGUKK2FyY2hpdGVjdHVyZS4gIE1haW5seSB1c2Vm dWwgZm9yIHRoZSBwZXJmb3JtYW5jZSB0dW5pbmcuCitWZWN0b3Igb3BlcmF0 aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCBAY29kZXtwaWVjZXdpc2V9IHdoaWNo IG1lYW5zIHRoYXQgdGhlCitzY2FsYXIgb3BlcmF0aW9uIGlzIHBlcmZvcm1l ZCBvbiBldmVyeSB2ZWN0b3IgZWxlbWVudDsgCitAY29kZXtpbiBwYXJhbGxl bH0gd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmVjdG9yIG9wZXJhdGlvbiBpcyBp bXBsZW1lbnRlZAordXNpbmcgc2NhbGFycyBvZiB3aWRlciB0eXBlLCB3aGlj aCBub3JtYWxseSBpcyBtb3JlIHBlcmZvcm1hbmNlIGVmZmljaWVudDsKK2Fu ZCBAY29kZXthcyBhIHNpbmdsZSBzY2FsYXJ9IHdoaWNoIG1lYW5zIHRoYXQg dmVjdG9yIGZpdHMgaW50byBhCitzY2FsYXIgdHlwZS4KKwogQGl0ZW0gLVd2 bGEKIEBvcGluZGV4IFd2bGEKIEBvcGluZGV4IFduby12bGEKSW5kZXg6IGdj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVjdC1vcC0zLmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTMuYwkocmV2aXNpb24gMCkKKysr IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVjdC1vcC0z LmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICAqLworLyogeyBkZy1vcHRpb25zICItbW5vLXNzZSAtV3Zl Y3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UiIH0gICovCisjZGVmaW5lIHZl Y3RvcihlbGNvdW50LCB0eXBlKSAgXAorX19hdHRyaWJ1dGVfXygodmVjdG9y X3NpemUoKGVsY291bnQpKnNpemVvZih0eXBlKSkpKSB0eXBlCisKK2ludCBt YWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB2ZWN0b3IgKDgs IHNob3J0KSB2MCA9IHthcmdjLCAxLCAxNSwgMzgsIDEyLCAtMSwgYXJnYywg Mn07CisgIHZlY3RvciAoOCwgc2hvcnQpIHYxID0gey00LCBhcmdjLCAyLCAx MSwgMSwgMTcsIC04LCBhcmdjfTsKKyAgdmVjdG9yICg4LCBzaG9ydCkgcmVz W10gPSAKKyAgeworICAgIHYwICsgdjEsCSAgICAgIC8qIHsgZGctd2Fybmlu ZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgdjAgLSB2MSwg ICAgICAgICAgLyogeyBkZy13YXJuaW5nICJleHBhbmRlZCBpbiBwYXJhbGxl bCIgfSAgKi8KKyAgICB2MCA+IHYxLCAgICAgICAgICAvKiB7IGRnLXdhcm5p bmcgImV4cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8KKyAgICB2MCAmIHYxLCAg ICAgICAgICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIGluIHBhcmFsbGVs IiB9ICAqLworICAgIF9fYnVpbHRpbl9zaHVmZmxlICh2MCwgdjEpLAkgICAg ICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8K KyAgICBfX2J1aWx0aW5fc2h1ZmZsZSAodjAsIHYxLCB2MSkgICAgLyogeyBk Zy13YXJuaW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgIH07Cisg IAorICByZXR1cm4gcmVzW2FyZ2NdW2FyZ2NdOworfQpJbmRleDogZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTEuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni93YXJuLXZlY3Qtb3AtMS5jCShyZXZpc2lvbiAwKQorKysgZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTEuYwko cmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMSBAQAorLyogeyBkZy1kbyBjb21w aWxlIH0gICovCisvKiB7IGRnLW9wdGlvbnMgIi1tbm8tc3NlIC1XdmVjdG9y LW9wZXJhdGlvbi1wZXJmb3JtYW5jZSIgfSAgKi8KKyNkZWZpbmUgdmVjdG9y KGVsY291bnQsIHR5cGUpICBcCitfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6 ZSgoZWxjb3VudCkqc2l6ZW9mKHR5cGUpKSkpIHR5cGUKKworaW50IG1haW4g KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHZlY3RvciAoNCwgaW50 KSB2MCA9IHthcmdjLCAxLCAxNSwgMzh9OworICB2ZWN0b3IgKDQsIGludCkg djEgPSB7LTQsIGFyZ2MsIDIsIDExfTsKKyAgdmVjdG9yICg0LCBpbnQpIHJl c1tdID0gCisgIHsKKyAgICB2MCArIHYxLAkgIC8qIHsgZGctd2FybmluZyAi ZXhwYW5kZWQgcGllY2V3aXNlIiB9ICAqLworICAgIHYwIC0gdjEsCSAgLyog eyBkZy13YXJuaW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgICAg djAgPiB2MSwJICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBpZWNld2lz ZSIgfSAgKi8KKyAgICB2MCAmIHYxLAkgIC8qIHsgZGctd2FybmluZyAiZXhw YW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgX19idWlsdGluX3NodWZm bGUgKHYwLCB2MSksCSAgICAvKiB7IGRnLXdhcm5pbmcgImV4cGFuZGVkIHBp ZWNld2lzZSIgfSAgKi8KKyAgICBfX2J1aWx0aW5fc2h1ZmZsZSAodjAsIHYx LCB2MSkgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgcGllY2V3aXNlIiB9 ICAqLyAgCisgIH07CisKKyAgcmV0dXJuIHJlc1thcmdjXVthcmdjXTsKK30K SW5kZXg6IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4tdmVj dC1vcC0yLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2kzODYvd2Fybi12ZWN0LW9wLTIuYwkocmV2aXNp b24gMCkKKysrIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3dhcm4t dmVjdC1vcC0yLmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjMgQEAKKy8q IHsgZGctZG8gY29tcGlsZSB9ICAqLworLyogeyBkZy1vcHRpb25zICItbW5v LXNzZSAtV3ZlY3Rvci1vcGVyYXRpb24tcGVyZm9ybWFuY2UiIH0gICovCisj ZGVmaW5lIHZlY3RvcihlbGNvdW50LCB0eXBlKSAgXAorX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoKGVsY291bnQpKnNpemVvZih0eXBlKSkpKSB0eXBl CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB2 ZWN0b3IgKDE2LCBzaWduZWQgY2hhcikgdjAgPSB7YXJnYywgMSwgMTUsIDM4 LCAxMiwgLTEsIGFyZ2MsIDIsIAorCQkJCSBhcmdjLCAxLCAxNSwgMzgsIDEy LCAtMSwgYXJnYywgMn07CisgIHZlY3RvciAoMTYsIHNpZ25lZCBjaGFyKSB2 MSA9IHstNCwgYXJnYywgMiwgMTEsIDEsIDE3LCAtOCwgYXJnYywKKwkJCQkg YXJnYywgMSwgMTUsIDM4LCAxMiwgLTEsIGFyZ2MsIDJ9OworICB2ZWN0b3Ig KDE2LCBzaWduZWQgY2hhcikgcmVzW10gPSAKKyAgeworICAgIHYwICsgdjEs CQkgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0g ICovCisgICAgdjAgLSB2MSwgICAgICAgICAgICAgIC8qIHsgZGctd2Fybmlu ZyAiZXhwYW5kZWQgaW4gcGFyYWxsZWwiIH0gICovCisgICAgdjAgPiB2MSwg ICAgICAgICAgICAgIC8qIHsgZGctd2FybmluZyAiZXhwYW5kZWQgcGllY2V3 aXNlIiB9ICAqLworICAgIHYwICYgdjEsICAgICAgICAgICAgICAvKiB7IGRn LXdhcm5pbmcgImV4cGFuZGVkIGluIHBhcmFsbGVsIiB9ICAqLworICAgIF9f YnVpbHRpbl9zaHVmZmxlICh2MCwgdjEpLCAgICAgICAgLyogeyBkZy13YXJu aW5nICJleHBhbmRlZCBwaWVjZXdpc2UiIH0gICovCisgICAgX19idWlsdGlu X3NodWZmbGUgKHYwLCB2MSwgdjEpICAgICAvKiB7IGRnLXdhcm5pbmcgImV4 cGFuZGVkIHBpZWNld2lzZSIgfSAgKi8KKyAgfTsKKyAKKyAgcmV0dXJuIHJl c1thcmdjXVthcmdjXTsKK30KSW5kZXg6IGdjYy9jLXR5cGVjay5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jLXR5cGVjay5jCShyZXZpc2lv biAxNzk3NDQpCisrKyBnY2MvYy10eXBlY2suYwkod29ya2luZyBjb3B5KQpA QCAtMjkzNCw3ICsyOTM0LDggQEAgY19idWlsZF92ZWNfcGVybV9leHByIChs b2NhdGlvbl90IGxvYywgdAogCiAgIGlmICghd3JhcCkKICAgICByZXQgPSBj X3dyYXBfbWF5YmVfY29uc3QgKHJldCwgdHJ1ZSk7Ci0KKyAgCisgIFNFVF9F WFBSX0xPQ0FUSU9OIChyZXQsIGxvYyk7CiAgIHJldHVybiByZXQ7CiB9CiAM CkluZGV4OiBnY2MvY29tbW9uLm9wdAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBnY2MvY29tbW9uLm9wdAkocmV2aXNpb24gMTc5NzQ0KQorKysgZ2Nj L2NvbW1vbi5vcHQJKHdvcmtpbmcgY29weSkKQEAgLTY5NCw2ICs2OTQsMTAg QEAgV2NvdmVyYWdlLW1pc21hdGNoCiBDb21tb24gVmFyKHdhcm5fY292ZXJh Z2VfbWlzbWF0Y2gpIEluaXQoMSkgV2FybmluZwogV2FybiBpbiBjYXNlIHBy b2ZpbGVzIGluIC1mcHJvZmlsZS11c2UgZG8gbm90IG1hdGNoCiAKK1d2ZWN0 b3Itb3BlcmF0aW9uLXBlcmZvcm1hbmNlCitDb21tb24gVmFyKHdhcm5fdmVj dG9yX29wZXJhdGlvbl9wZXJmb3JtYW5jZSkgV2FybmluZworV2FybiB3aGVu IGEgdmVjdG9yIG9wZXJhdGlvbiBpcyBjb21waWxlZCBvdXRzaWRlIHRoZSBT SU1ECisKIFhhc3NlbWJsZXIKIERyaXZlciBTZXBhcmF0ZQogCkluZGV4OiBn Y2MvdHJlZS12ZWN0LWdlbmVyaWMuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBnY2MvdHJlZS12ZWN0LWdlbmVyaWMuYwkocmV2aXNpb24gMTc5NzQ0 KQorKysgZ2NjL3RyZWUtdmVjdC1nZW5lcmljLmMJKHdvcmtpbmcgY29weSkK QEAgLTIzNSw2ICsyMzUsMTQgQEAgZXhwYW5kX3ZlY3Rvcl9waWVjZXdpc2Ug KGdpbXBsZV9zdG10X2l0ZQogICBpbnQgZGVsdGEgPSB0cmVlX2xvd19jc3Qg KHBhcnRfd2lkdGgsIDEpCiAJICAgICAgLyB0cmVlX2xvd19jc3QgKFRZUEVf U0laRSAoVFJFRV9UWVBFICh0eXBlKSksIDEpOwogICBpbnQgaTsKKyAgbG9j YXRpb25fdCBsb2MgPSBnaW1wbGVfbG9jYXRpb24gKGdzaV9zdG10ICgqZ3Np KSk7CisKKyAgaWYgKHR5cGVzX2NvbXBhdGlibGVfcCAoZ2ltcGxlX2V4cHJf dHlwZSAoZ3NpX3N0bXQgKCpnc2kpKSwgdHlwZSkpCisgICAgd2FybmluZ19h dCAobG9jLCBPUFRfV3ZlY3Rvcl9vcGVyYXRpb25fcGVyZm9ybWFuY2UsCisJ CSJ2ZWN0b3Igb3BlcmF0aW9uIHdpbGwgYmUgZXhwYW5kZWQgcGllY2V3aXNl Iik7CisgIGVsc2UKKyAgICB3YXJuaW5nX2F0IChsb2MsIE9QVF9XdmVjdG9y X29wZXJhdGlvbl9wZXJmb3JtYW5jZSwKKwkJInZlY3RvciBvcGVyYXRpb24g d2lsbCBiZSBleHBhbmRlZCBpbiBwYXJhbGxlbCIpOwogCiAgIHYgPSBWRUNf YWxsb2MoY29uc3RydWN0b3JfZWx0LCBnYywgKG51bml0cyArIGRlbHRhIC0g MSkgLyBkZWx0YSk7CiAgIGZvciAoaSA9IDA7IGkgPCBudW5pdHM7CkBAIC0y NjAsNiArMjY4LDcgQEAgZXhwYW5kX3ZlY3Rvcl9wYXJhbGxlbCAoZ2ltcGxl X3N0bXRfaXRlcgogICB0cmVlIHJlc3VsdCwgY29tcHV0ZV90eXBlOwogICBl bnVtIG1hY2hpbmVfbW9kZSBtb2RlOwogICBpbnQgbl93b3JkcyA9IHRyZWVf bG93X2NzdCAoVFlQRV9TSVpFX1VOSVQgKHR5cGUpLCAxKSAvIFVOSVRTX1BF Ul9XT1JEOworICBsb2NhdGlvbl90IGxvYyA9IGdpbXBsZV9sb2NhdGlvbiAo Z3NpX3N0bXQgKCpnc2kpKTsKIAogICAvKiBXZSBoYXZlIHRocmVlIHN0cmF0 ZWdpZXMuICBJZiB0aGUgdHlwZSBpcyBhbHJlYWR5IGNvcnJlY3QsIGp1c3Qg ZG8KICAgICAgdGhlIG9wZXJhdGlvbiBhbiBlbGVtZW50IGF0IGEgdGltZS4g IEVsc2UsIGlmIHRoZSB2ZWN0b3IgaXMgd2lkZXIgdGhhbgpAQCAtMjg0LDYg KzI5Myw5IEBAIGV4cGFuZF92ZWN0b3JfcGFyYWxsZWwgKGdpbXBsZV9zdG10 X2l0ZXIKICAgICAgIG1vZGUgPSBtb2RlX2Zvcl9zaXplICh0cmVlX2xvd19j c3QgKFRZUEVfU0laRSAodHlwZSksIDEpLCBNT0RFX0lOVCwgMCk7CiAgICAg ICBjb21wdXRlX3R5cGUgPSBsYW5nX2hvb2tzLnR5cGVzLnR5cGVfZm9yX21v ZGUgKG1vZGUsIDEpOwogICAgICAgcmVzdWx0ID0gZiAoZ3NpLCBjb21wdXRl X3R5cGUsIGEsIGIsIE5VTExfVFJFRSwgTlVMTF9UUkVFLCBjb2RlKTsKKyAg ICAgIHdhcm5pbmdfYXQgKGxvYywgT1BUX1d2ZWN0b3Jfb3BlcmF0aW9uX3Bl cmZvcm1hbmNlLAorCSAgICAgICAgICAidmVjdG9yIG9wZXJhdGlvbiB3aWxs IGJlIGV4cGFuZGVkIHdpdGggYSAiCisJCSAgInNpbmdsZSBzY2FsYXIgb3Bl cmF0aW9uIik7CiAgICAgfQogCiAgIHJldHVybiByZXN1bHQ7CkBAIC00MDAs OCArNDEyLDggQEAgZXhwYW5kX3ZlY3Rvcl9vcGVyYXRpb24gKGdpbXBsZV9z dG10X2l0ZQogICAgICAgY2FzZSBQTFVTX0VYUFI6CiAgICAgICBjYXNlIE1J TlVTX0VYUFI6CiAgICAgICAgIGlmICghVFlQRV9PVkVSRkxPV19UUkFQUyAo dHlwZSkpCi0gICAgICAgICAgcmV0dXJuIGV4cGFuZF92ZWN0b3JfYWRkaXRp b24gKGdzaSwgZG9fYmlub3AsIGRvX3BsdXNfbWludXMsIHR5cGUsCi0JCSAg ICAgIAkJICAgICAgICAgZ2ltcGxlX2Fzc2lnbl9yaHMxIChhc3NpZ24pLAor CSAgcmV0dXJuIGV4cGFuZF92ZWN0b3JfYWRkaXRpb24gKGdzaSwgZG9fYmlu b3AsIGRvX3BsdXNfbWludXMsIHR5cGUsCisJCQkJCSBnaW1wbGVfYXNzaWdu X3JoczEgKGFzc2lnbiksCiAJCQkJCSBnaW1wbGVfYXNzaWduX3JoczIgKGFz c2lnbiksIGNvZGUpOwogCWJyZWFrOwogCkBAIC02MjYsMTAgKzYzOCwxNSBA QCBsb3dlcl92ZWNfcGVybSAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzCiAg IHRyZWUgY29uc3RyLCB0LCBzaSwgaV92YWw7CiAgIHRyZWUgdmVjMHRtcCA9 IE5VTExfVFJFRSwgdmVjMXRtcCA9IE5VTExfVFJFRSwgbWFza3RtcCA9IE5V TExfVFJFRTsKICAgYm9vbCB0d29fb3BlcmFuZF9wID0gIW9wZXJhbmRfZXF1 YWxfcCAodmVjMCwgdmVjMSwgMCk7CisgIGxvY2F0aW9uX3QgbG9jID0gZ2lt cGxlX2xvY2F0aW9uIChnc2lfc3RtdCAoKmdzaSkpOwogICB1bnNpZ25lZCBp OwogCiAgIGlmIChleHBhbmRfdmVjX3Blcm1fZXhwcl9wIChUWVBFX01PREUg KHZlY3RfdHlwZSksIHZlYzAsIHZlYzEsIG1hc2spKQogICAgIHJldHVybjsK KyAgCisgIHdhcm5pbmdfYXQgKGxvYywgT1BUX1d2ZWN0b3Jfb3BlcmF0aW9u X3BlcmZvcm1hbmNlLAorICAgICAgICAgICAgICAidmVjdG9yIHNodWZmbGlu ZyBvcGVyYXRpb24gd2lsbCBiZSBleHBhbmRlZCBwaWVjZXdpc2UiKTsKKwog CiAgIHYgPSBWRUNfYWxsb2MgKGNvbnN0cnVjdG9yX2VsdCwgZ2MsIGVsZW1l bnRzKTsKICAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzOyBpKyspCg== --bcaec54ee5f0aa58f404aef1ac48--