From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19926 invoked by alias); 16 Dec 2014 15:15:46 -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 19908 invoked by uid 89); 16 Dec 2014 15:15:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wi0-f172.google.com Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com) (209.85.212.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 16 Dec 2014 15:15:41 +0000 Received: by mail-wi0-f172.google.com with SMTP id n3so12579853wiv.11 for ; Tue, 16 Dec 2014 07:15:38 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.181.28.165 with SMTP id jp5mr5734308wid.76.1418742934252; Tue, 16 Dec 2014 07:15:34 -0800 (PST) Received: by 10.216.77.73 with HTTP; Tue, 16 Dec 2014 07:15:33 -0800 (PST) In-Reply-To: References: Date: Tue, 16 Dec 2014 15:16:00 -0000 Message-ID: Subject: Re: [PATCH 2/3] Extended if-conversion From: Yuri Rumyantsev To: Richard Biener Cc: gcc-patches , Igor Zamyatin Content-Type: multipart/mixed; boundary=001a1137eac49ff3c8050a56d44a X-SW-Source: 2014-12/txt/msg01345.txt.bz2 --001a1137eac49ff3c8050a56d44a Content-Type: text/plain; charset=UTF-8 Content-length: 23341 Hi Richard, Here is updated patch which includes (1) split critical edges for aggressive if conversion. (2) delete all stuff related to support of critical edge predication. (3) only one function - predicate_scalar_phi performs predication. (4) function find_phi_replacement_condition was deleted since it was included in predicate_scalar_phi for phi with two arguments. I checked that patch works in stress testing mode, i.e. with aggressive if conversion by default. What is your opinion? Thanks. Yuri. 2014-12-11 11:59 GMT+03:00 Richard Biener : > On Wed, Dec 10, 2014 at 4:22 PM, Yuri Rumyantsev wrote: >> Richard, >> >> Thanks for your reply! >> >> I didn't understand your point: >> >> Well, I don't mind splitting all critical edges unconditionally >> >> but you do it unconditionally in proposed patch. > > I don't mind means I am fine with it. > >> Also I assume that >> call of split_critical_edges() can break ssa. For example, we can >> split headers of loops, loop exit blocks etc. > > How does that "break SSA"? You mean loop-closed SSA? I'd > be surprised if so but that may be possible. > >> I prefer to do something >> more loop-specialized, e.g. call edge_split() for critical edges >> outgoing from bb ending with GIMPLE_COND stmt (assuming that edge >> destination bb belongs to loop). > > That works for me as well but it is more complicated to implement. > Ideally you'd only split one edge if you find a block with only critical > predecessors (where we'd currently give up). But note that this > requires re-computation of ifc_bbs in if_convertible_loop_p_1 and it > will change loop->num_nodes so we have to be more careful in > constructing the loop calling if_convertible_bb_p. > > Richard. > >> >> 2014-12-10 17:31 GMT+03:00 Richard Biener : >>> On Wed, Dec 10, 2014 at 11:54 AM, Yuri Rumyantsev wrote: >>>> Richard, >>>> >>>> Sorry that I forgot to delete debug dump from my fix. >>>> I have few questions about your comments. >>>> >>>> 1. You wrote : >>>>> You also still have two functions for PHI predication. And the >>>>> new extended variant doesn't commonize the 2-args and general >>>>> path >>>> Did you mean that I must combine predicate_scalar_phi and >>>> predicate_extended scalar phi to one function? >>>> Please note that if additional flag was not set up (i.e. >>>> aggressive_if_conv is false) extended predication is required more >>>> compile time since it builds hash_map. >>> >>> It's compile-time complexity is reasonable enough even for >>> non-aggressive if-conversion. >>> >>>> 2. About critical edge splitting. >>>> >>>> Did you mean that we should perform it (1) under aggressive_if_conv >>>> option only; (2) should we split all critical edges. >>>> Note that this leads to recomputing of topological order. >>> >>> Well, I don't mind splitting all critical edges unconditionally, thus >>> do something like >>> >>> Index: gcc/tree-if-conv.c >>> =================================================================== >>> --- gcc/tree-if-conv.c (revision 218515) >>> +++ gcc/tree-if-conv.c (working copy) >>> @@ -2235,12 +2235,21 @@ pass_if_conversion::execute (function *f >>> if (number_of_loops (fun) <= 1) >>> return 0; >>> >>> + bool critical_edges_split_p = false; >>> FOR_EACH_LOOP (loop, 0) >>> if (flag_tree_loop_if_convert == 1 >>> || flag_tree_loop_if_convert_stores == 1 >>> || ((flag_tree_loop_vectorize || loop->force_vectorize) >>> && !loop->dont_vectorize)) >>> - todo |= tree_if_conversion (loop); >>> + { >>> + if (!critical_edges_split_p) >>> + { >>> + split_critical_edges (); >>> + critical_edges_split_p = true; >>> + todo |= TODO_cleanup_cfg; >>> + } >>> + todo |= tree_if_conversion (loop); >>> + } >>> >>> #ifdef ENABLE_CHECKING >>> { >>> >>>> It is worth noting that in current implementation bb's with 2 >>>> predecessors and both are on critical edges are accepted without >>>> additional option. >>> >>> Yes, I know. >>> >>> tree-if-conv.c is a mess right now and if we can avoid adding more >>> to it and even fix the critical edge missed optimization with splitting >>> critical edges then I am all for that solution. >>> >>> Richard. >>> >>>> Thanks ahead. >>>> Yuri. >>>> 2014-12-09 18:20 GMT+03:00 Richard Biener : >>>>> On Tue, Dec 9, 2014 at 2:11 PM, Yuri Rumyantsev wrote: >>>>>> Richard, >>>>>> >>>>>> Here is updated patch2 with the following changes: >>>>>> 1. Delete functions phi_has_two_different_args and find_insertion_point. >>>>>> 2. Use only one function for extended predication - >>>>>> predicate_extended_scalar_phi. >>>>>> 3. Save gsi before insertion of predicate computations for basic >>>>>> blocks if it has 2 predecessors and >>>>>> both incoming edges are critical or it gas more than 2 predecessors >>>>>> and at least one incoming edge >>>>>> is critical. This saved iterator can be used by extended phi predication. >>>>>> >>>>>> Here is motivated test-case which explains this point. >>>>>> Test-case is attached (t5.c) and it must be compiled with -O2 >>>>>> -ftree-loop-vectorize -fopenmp options. >>>>>> The problem phi is in bb-7: >>>>>> >>>>>> bb_5 (preds = {bb_4 }, succs = {bb_7 bb_9 }) >>>>>> { >>>>>> : >>>>>> xmax_edge_18 = xmax_edge_36 + 1; >>>>>> if (xmax_17 == xmax_27) >>>>>> goto ; >>>>>> else >>>>>> goto ; >>>>>> >>>>>> } >>>>>> bb_6 (preds = {bb_4 }, succs = {bb_7 bb_8 }) >>>>>> { >>>>>> : >>>>>> if (xmax_17 == xmax_27) >>>>>> goto ; >>>>>> else >>>>>> goto ; >>>>>> >>>>>> } >>>>>> bb_7 (preds = {bb_6 bb_5 }, succs = {bb_11 }) >>>>>> { >>>>>> : >>>>>> # xmax_edge_30 = PHI >>>>>> xmax_edge_19 = xmax_edge_39 + 1; >>>>>> goto ; >>>>>> >>>>>> } >>>>>> >>>>>> Note that both incoming edges to bb_7 are critical. If we comment out >>>>>> restoring gsi in predicate_all_scalar_phi: >>>>>> #if 0 >>>>>> if ((EDGE_COUNT (bb->preds) == 2 && all_preds_critical_p (bb)) >>>>>> || (EDGE_COUNT (bb->preds) > 2 && has_pred_critical_p (bb))) >>>>>> gsi = bb_insert_point (bb); >>>>>> else >>>>>> #endif >>>>>> gsi = gsi_after_labels (bb); >>>>>> >>>>>> we will get ICE: >>>>>> t5.c: In function 'foo': >>>>>> t5.c:9:6: error: definition in block 4 follows the use >>>>>> void foo (int n) >>>>>> ^ >>>>>> for SSA_NAME: _1 in statement: >>>>>> _52 = _1 & _3; >>>>>> t5.c:9:6: internal compiler error: verify_ssa failed >>>>>> >>>>>> smce predicate computations were inserted in bb_7. >>>>> >>>>> The issue is obviously that the predicates have already been emitted >>>>> in the target BB - that's of course the wrong place. This is done >>>>> by insert_gimplified_predicates. >>>>> >>>>> This just shows how edge predicate handling is broken - we don't >>>>> seem to have a sequence of gimplified stmts for edge predicates >>>>> but push those to e->dest which makes this really messy. >>>>> >>>>> Rather than having a separate phase where we insert all >>>>> gimplified bb predicates we should do that on-demand when >>>>> predicating a PHI. >>>>> >>>>> Your patch writes to stderr - that's bad - use dump_file and guard >>>>> the printfs properly. >>>>> >>>>> You also still have two functions for PHI predication. And the >>>>> new extended variant doesn't commonize the 2-args and general >>>>> paths. >>>>> >>>>> I'm not at all happy with this code. It may be existing if-conv codes >>>>> fault but making it even worse is not an option. >>>>> >>>>> Again - what's wrong with simply splitting critical edges if >>>>> aggressive_if_conv? I think that would very much simplify >>>>> things here. Or alternatively use gsi_insert_on_edge and >>>>> commit edge insertions before merging the blocks. >>>>> >>>>> Thanks, >>>>> Richard. >>>>> >>>>>> ChangeLog is >>>>>> >>>>>> 2014-12-09 Yuri Rumyantsev >>>>>> >>>>>> * tree-if-conv.c : Include hash-map.h. >>>>>> (struct bb_predicate_s): Add new field to save copy of gimple >>>>>> statement iterator. >>>>>> (bb_insert_point): New function. >>>>>> (set_bb_insert_point): New function. >>>>>> (has_pred_critical_p): New function. >>>>>> (if_convertible_bb_p): Allow bb has more than 2 predecessors if >>>>>> AGGRESSIVE_IF_CONV is true. >>>>>> (if_convertible_bb_p): Delete check that bb has at least one >>>>>> non-critical incoming edge. >>>>>> (is_cond_scalar_reduction): Add arguments ARG_0, ARG_1 and EXTENDED. >>>>>> Allow interchange PHI arguments if EXTENDED is false. >>>>>> Change check that block containing reduction statement candidate >>>>>> is predecessor of phi-block since phi may have more than two arguments. >>>>>> (predicate_scalar_phi): Add new arguments for call of >>>>>> is_cond_scalar_reduction. >>>>>> (get_predicate_for_edge): New function. >>>>>> (struct phi_args_hash_traits): New type. >>>>>> (phi_args_hash_traits::hash): New function. >>>>>> (phi_args_hash_traits::equal_keys): New function. >>>>>> (gen_phi_arg_condition): New function. >>>>>> (predicate_extended_scalar_phi): New function. >>>>>> (predicate_all_scalar_phis): Add boolean variable EXTENDED and set it >>>>>> to true if BB containing phi has more than 2 predecessors or both >>>>>> incoming edges are critical. Invoke find_phi_replacement_condition and >>>>>> predicate_scalar_phi if EXTENDED is false. Use saved gsi if BB >>>>>> has 2 predecessors and both incoming edges are critical or it has more >>>>>> than 2 predecessors and atleast one incoming edge is critical. >>>>>> Use standard gsi_after_labels otherwise. >>>>>> Invoke predicate_extended_scalar_phi if EXTENDED is true. >>>>>> (insert_gimplified_predicates): Add bool variable EXTENDED_PREDICATION >>>>>> to save gsi before insertion of predicate computations. SEt-up it to >>>>>> true for BB with 2 predecessors and critical incoming edges either >>>>>> number of predecessors is geater 2 and at least one incoming edge is >>>>>> critical. >>>>>> Add check that non-predicated block may have statements to insert. >>>>>> Insert predicate computation of BB just after label if >>>>>> EXTENDED_PREDICATION is true. >>>>>> (tree_if_conversion): Add initialization of AGGRESSIVE_IF_CONV which >>>>>> is copy of inner or outer loop force_vectorize field. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> 2014-12-04 16:37 GMT+03:00 Richard Biener : >>>>>>> On Thu, Dec 4, 2014 at 2:15 PM, Yuri Rumyantsev wrote: >>>>>>>> Richard, >>>>>>>> >>>>>>>> I did simple change by saving gsi iterator for each bb that has >>>>>>>> critical edges by adding additional field to bb_predicate_s: >>>>>>>> >>>>>>>> typedef struct bb_predicate_s { >>>>>>>> >>>>>>>> /* The condition under which this basic block is executed. */ >>>>>>>> tree predicate; >>>>>>>> >>>>>>>> /* PREDICATE is gimplified, and the sequence of statements is >>>>>>>> recorded here, in order to avoid the duplication of computations >>>>>>>> that occur in previous conditions. See PR44483. */ >>>>>>>> gimple_seq predicate_gimplified_stmts; >>>>>>>> >>>>>>>> /* Insertion point for blocks having incoming critical edges. */ >>>>>>>> gimple_stmt_iterator gsi; >>>>>>>> } *bb_predicate_p; >>>>>>>> >>>>>>>> and this iterator is saved in insert_gimplified_predicates before >>>>>>>> insertion code for predicate computation. I checked that this fix >>>>>>>> works. >>>>>>> >>>>>>> Huh? I still wonder what the issue is with inserting everything >>>>>>> after the PHI we predicate. >>>>>>> >>>>>>> Well, your updated patch will come with testcases for the testsuite >>>>>>> that will hopefully fail if doing that. >>>>>>> >>>>>>> Richard. >>>>>>> >>>>>>>> >>>>>>>> Now I am implementing merging of predicate_extended.. and >>>>>>>> predicate_arbitrary.. functions as you proposed. >>>>>>>> >>>>>>>> Best regards. >>>>>>>> Yuri. >>>>>>>> >>>>>>>> 2014-12-04 15:41 GMT+03:00 Richard Biener : >>>>>>>>> On Tue, Dec 2, 2014 at 4:28 PM, Yuri Rumyantsev wrote: >>>>>>>>>> Thanks Richard for your quick reply! >>>>>>>>>> >>>>>>>>>> 1. I agree that we can combine predicate_extended_ and >>>>>>>>>> predicate_arbitrary_ to one function as you proposed. >>>>>>>>>> 2. What is your opinion about using more simple decision about >>>>>>>>>> insertion point - if bb has use of phi result insert phi predication >>>>>>>>>> before it and at the bb end otherwise. I assume that critical edge >>>>>>>>>> splitting is not a good decision. >>>>>>>>> >>>>>>>>> Why not always insert before the use? Which would be after labels, >>>>>>>>> what we do for two-arg PHIs. That is, how can it be that you predicate >>>>>>>>> a PHI in BB1 and then for an edge predicate on one of its incoming >>>>>>>>> edges you get SSA uses with defs that are in BB1 itself? That >>>>>>>>> can only happen for backedges but those you can't remove in any case. >>>>>>>>> >>>>>>>>> Richard. >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Best regards. >>>>>>>>>> Yuri. >>>>>>>>>> >>>>>>>>>> 2014-12-02 16:28 GMT+03:00 Richard Biener : >>>>>>>>>>> On Mon, Dec 1, 2014 at 4:53 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>> Hi Richard, >>>>>>>>>>>> >>>>>>>>>>>> I resend you patch1 and patch2 with minor changes: >>>>>>>>>>>> 1. I renamed flag_force_vectorize to aggressive_if_conv. >>>>>>>>>>>> 2. Use static cast for the first argument of gimple_phi_arg_edge. >>>>>>>>>>>> I also very sorry that I sent you bad patch. >>>>>>>>>>>> >>>>>>>>>>>> Now let me answer on your questions related to second patch. >>>>>>>>>>>> 1. Why we need both predicate_extended_scalar_phi and >>>>>>>>>>>> predicate_arbitrary_scalar_phi? >>>>>>>>>>>> >>>>>>>>>>>> Let's consider the following simple test-case: >>>>>>>>>>>> >>>>>>>>>>>> #pragma omp simd safelen(8) >>>>>>>>>>>> for (i=0; i<512; i++) >>>>>>>>>>>> { >>>>>>>>>>>> float t = a[i]; >>>>>>>>>>>> if (t > 0.0f & t < 1.0e+17f) >>>>>>>>>>>> if (c[i] != 0) /* c is integer array. */ >>>>>>>>>>>> res += 1; >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> we can see the following phi node correspondent to res: >>>>>>>>>>>> >>>>>>>>>>>> # res_1 = PHI >>>>>>>>>>>> >>>>>>>>>>>> It is clear that we can optimize it to phi node with 2 arguments only >>>>>>>>>>>> and only one check can be used for phi predication (for reduction in >>>>>>>>>>>> our case), namely predicate of bb_5. In general case we can't do it >>>>>>>>>>>> even if we sort all phi argument values since we still have to produce >>>>>>>>>>>> a chain of cond expressions to perform phi predication (see comments >>>>>>>>>>>> for predicate_arbitrary_scalar_phi). >>>>>>>>>>> >>>>>>>>>>> How so? We can always use !(condition) for the "last" value, thus >>>>>>>>>>> treat it as an 'else' case. That even works for >>>>>>>>>>> >>>>>>>>>>> # res_1 = PHI >>>>>>>>>>> >>>>>>>>>>> where the condition for edges 5 and 7 can be computed as >>>>>>>>>>> ! (condition for 3 || condition for 4). >>>>>>>>>>> >>>>>>>>>>> Of course it is worthwhile to also sort single-occurances first >>>>>>>>>>> so your case gets just the condiiton for edge 5 and its inversion >>>>>>>>>>> used for edges 3 and 4 combined. >>>>>>>>>>> >>>>>>>>>>>> 2. Why we need to introduce find_insertion_point? >>>>>>>>>>>> Let's consider another test-case extracted from 175.vpr ( t5.c is >>>>>>>>>>>> attached) and we can see that bb_7 and bb_9 containig phi nodes has >>>>>>>>>>>> only critical incoming edges and both contain code computing edge >>>>>>>>>>>> predicates, e.g. >>>>>>>>>>>> >>>>>>>>>>>> : >>>>>>>>>>>> # xmax_edge_30 = PHI >>>>>>>>>>>> _46 = xmax_17 == xmax_37; >>>>>>>>>>>> _47 = xmax_17 == xmax_27; >>>>>>>>>>>> _48 = _46 & _47; >>>>>>>>>>>> _53 = xmax_17 == xmax_37; >>>>>>>>>>>> _54 = ~_53; >>>>>>>>>>>> _55 = xmax_17 == xmax_27; >>>>>>>>>>>> _56 = _54 & _55; >>>>>>>>>>>> _57 = _48 | _56; >>>>>>>>>>>> xmax_edge_19 = xmax_edge_39 + 1; >>>>>>>>>>>> goto ; >>>>>>>>>>>> >>>>>>>>>>>> It is evident that we can not put phi predication at the block >>>>>>>>>>>> beginning but need to put it after predicate computations. >>>>>>>>>>>> Note also that if there are no critical edges for phi arguments >>>>>>>>>>>> insertion point will be "after labels" Note also that phi result can >>>>>>>>>>>> have use in this block too, so we can't put predication code to the >>>>>>>>>>>> block end. >>>>>>>>>>> >>>>>>>>>>> So the issue is that predicate insertion for edge predicates does >>>>>>>>>>> not happen on the edge but somewhere else (generally impossible >>>>>>>>>>> for critical edges unless you split them). >>>>>>>>>>> >>>>>>>>>>> I think I've told you before that I prefer simple solutions to such issues, >>>>>>>>>>> like splitting the edge! Certainly not involving a function walking >>>>>>>>>>> GENERIC expressions. >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Richard. >>>>>>>>>>> >>>>>>>>>>>> Let me know if you still have any questions. >>>>>>>>>>>> >>>>>>>>>>>> Best regards. >>>>>>>>>>>> Yuri. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 2014-11-28 15:43 GMT+03:00 Richard Biener : >>>>>>>>>>>>> On Wed, Nov 12, 2014 at 2:35 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Here is the second patch related to extended predication. >>>>>>>>>>>>>> Few comments which explain a main goal of design. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 1. I don't want to insert any critical edge splitting since it may >>>>>>>>>>>>>> lead to less efficient binaries. >>>>>>>>>>>>>> 2. One special case of extended PHI node predication was introduced >>>>>>>>>>>>>> when #arguments is more than 2 but only two arguments are different >>>>>>>>>>>>>> and one argument has the only occurrence. For such PHI conditional >>>>>>>>>>>>>> scalar reduction is applied. >>>>>>>>>>>>>> This is correspondent to the following statement: >>>>>>>>>>>>>> if (q1 && q2 && q3) var++ >>>>>>>>>>>>>> New function phi_has_two_different_args was introduced to detect such phi. >>>>>>>>>>>>>> 3. Original algorithm for PHI predication used assumption that at >>>>>>>>>>>>>> least one incoming edge for blocks containing PHI is not critical - it >>>>>>>>>>>>>> guarantees that all computations related to predicate of normal edge >>>>>>>>>>>>>> are already inserted above this block and >>>>>>>>>>>>>> code related to PHI predication can be inserted at the beginning of >>>>>>>>>>>>>> block. But this is not true for critical edges for which predicate >>>>>>>>>>>>>> computations are in the block where code for phi predication must be >>>>>>>>>>>>>> inserted. So new function find_insertion_point is introduced which is >>>>>>>>>>>>>> simply found out the last statement in block defining predicates >>>>>>>>>>>>>> correspondent to all incoming edges and insert phi predication code >>>>>>>>>>>>>> after it (with some minor exceptions). >>>>>>>>>>>>> >>>>>>>>>>>>> Unfortunately the patch doesn't apply for me - I get >>>>>>>>>>>>> >>>>>>>>>>>>> patch: **** malformed patch at line 505: @@ -1720,6 +2075,8 @@ >>>>>>>>>>>>> predicate_all_scalar_phis (struct loop *loop) >>>>>>>>>>>>> >>>>>>>>>>>>> a few remarks nevertheless. I don't see how we need both >>>>>>>>>>>>> predicate_extended_scalar_phi and predicate_arbitrary_scalar_phi. >>>>>>>>>>>>> Couldn't we simply sort an array of (edge, value) pairs after value >>>>>>>>>>>>> and handle equal values specially in predicate_extended_scalar_phi? >>>>>>>>>>>>> That would even make PHI more optimal. >>>>>>>>>>>>> >>>>>>>>>>>>> I don't understand the need for find_insertion_point. All SSA names >>>>>>>>>>>>> required for the predicates are defined upward - and the complex CFG >>>>>>>>>>>>> is squashed to a single basic-block, thus the defs will dominate the >>>>>>>>>>>>> inserted code if you insert after labels just like for the other case. >>>>>>>>>>>>> Or what am I missing? ("flattening" of the basic-blocks of course needs >>>>>>>>>>>>> to happen in dominator order - but I guess that happens already?) >>>>>>>>>>>>> >>>>>>>>>>>>> I'd like the extended PHI handling to be enablable by a flag even >>>>>>>>>>>>> for !force-vectorization - I've seen cases with 3 PHI args multiple >>>>>>>>>>>>> times that would have been nice to vectorize. I suggest to >>>>>>>>>>>>> add -ftree-loop-if-convert-aggressive for this. We can do this as >>>>>>>>>>>>> followup, but please rename the local flag_force_vectorize flag >>>>>>>>>>>>> to something less looking like a flag, like simply 'aggressive'. >>>>>>>>>>>>> >>>>>>>>>>>>> Otherwise patch 2 looks ok to me. >>>>>>>>>>>>> >>>>>>>>>>>>> Richard. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> ChangeLog: >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2014-10-24 Yuri Rumyantsev >>>>>>>>>>>>>> >>>>>>>>>>>>>> * tree-if-conv.c (ifcvt_can_use_mask_load_store): Use >>>>>>>>>>>>>> FLAG_FORCE_VECTORIZE instead of loop flag. >>>>>>>>>>>>>> (if_convertible_bb_p): Allow bb has more than 2 predecessors if >>>>>>>>>>>>>> FLAG_FORCE_VECTORIZE is true. >>>>>>>>>>>>>> (if_convertible_bb_p): Delete check that bb has at least one >>>>>>>>>>>>>> non-critical incoming edge. >>>>>>>>>>>>>> (phi_has_two_different_args): New function. >>>>>>>>>>>>>> (is_cond_scalar_reduction): Add argument EXTENDED to choose access >>>>>>>>>>>>>> to phi arguments. Invoke phi_has_two_different_args to get phi >>>>>>>>>>>>>> arguments if EXTENDED is true. Change check that block >>>>>>>>>>>>>> containing reduction statement candidate is predecessor >>>>>>>>>>>>>> of phi-block since phi may have more than two arguments. >>>>>>>>>>>>>> (convert_scalar_cond_reduction): Add argument BEFORE to insert >>>>>>>>>>>>>> statement before/after gsi point. >>>>>>>>>>>>>> (predicate_scalar_phi): Add argument false (which means non-extended >>>>>>>>>>>>>> predication) to call of is_cond_scalar_reduction. Add argument >>>>>>>>>>>>>> true (which correspondent to argument BEFORE) to call of >>>>>>>>>>>>>> convert_scalar_cond_reduction. >>>>>>>>>>>>>> (get_predicate_for_edge): New function. >>>>>>>>>>>>>> (predicate_arbitrary_scalar_phi): New function. >>>>>>>>>>>>>> (predicate_extended_scalar_phi): New function. >>>>>>>>>>>>>> (find_insertion_point): New function. >>>>>>>>>>>>>> (predicate_all_scalar_phis): Add two boolean variables EXTENDED and >>>>>>>>>>>>>> BEFORE. Initialize EXTENDED to true if BB containing phi has more >>>>>>>>>>>>>> than 2 predecessors or both incoming edges are critical. Invoke >>>>>>>>>>>>>> find_phi_replacement_condition and predicate_scalar_phi or >>>>>>>>>>>>>> find_insertion_point and predicate_extended_scalar_phi depending on >>>>>>>>>>>>>> EXTENDED value. >>>>>>>>>>>>>> (insert_gimplified_predicates): Add check that non-predicated block >>>>>>>>>>>>>> may have statements to insert. Insert predicate of BB just after label >>>>>>>>>>>>>> if FLAG_FORCE_VECTORIZE is true. >>>>>>>>>>>>>> (tree_if_conversion): Add initialization of FLAG_FORCE_VECTORIZE which >>>>>>>>>>>>>> is copy of inner or outer loop field force_vectorize. --001a1137eac49ff3c8050a56d44a Content-Type: application/octet-stream; name="if-conv.patch2.3" Content-Disposition: attachment; filename="if-conv.patch2.3" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i3rewoaw0 Content-length: 29004 ZGlmZiAtLWdpdCBhL2djYy90cmVlLWlmLWNvbnYuYyBiL2djYy90cmVlLWlm LWNvbnYuYwppbmRleCA2YzlhZDMyLi5iNmU1ODViIDEwMDY0NAotLS0gYS9n Y2MvdHJlZS1pZi1jb252LmMKKysrIGIvZ2NjL3RyZWUtaWYtY29udi5jCkBA IC0xMjcsNiArMTI3LDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmls ZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJleHByLmgiCiAj aW5jbHVkZSAiaW5zbi1jb2Rlcy5oIgogI2luY2x1ZGUgIm9wdGFicy5oIgor I2luY2x1ZGUgImhhc2gtbWFwLmgiCiAKIC8qIExpc3Qgb2YgYmFzaWMgYmxv Y2tzIGluIGlmLWNvbnZlcnNpb24tc3VpdGFibGUgb3JkZXIuICAqLwogc3Rh dGljIGJhc2ljX2Jsb2NrICppZmNfYmJzOwpAQCAtMTYzLDE3ICsxNjQsNiBA QCBiYl9wcmVkaWNhdGUgKGJhc2ljX2Jsb2NrIGJiKQogICByZXR1cm4gKChi Yl9wcmVkaWNhdGVfcCkgYmItPmF1eCktPnByZWRpY2F0ZTsKIH0KIAotLyog UmV0dXJucyBwcmVkaWNhdGUgZm9yIGNyaXRpY2FsIGVkZ2UgRS4gICovCi0K LXN0YXRpYyBpbmxpbmUgdHJlZQotZWRnZV9wcmVkaWNhdGUgKGVkZ2UgZSkK LXsKLSAgZ2NjX2Fzc2VydCAoRURHRV9DT1VOVCAoZS0+c3JjLT5zdWNjcykg Pj0gMik7Ci0gIGdjY19hc3NlcnQgKEVER0VfQ09VTlQgKGUtPmRlc3QtPnBy ZWRzKSA+PSAyKTsKLSAgZ2NjX2Fzc2VydCAoZS0+YXV4ICE9IE5VTEwpOwot ICByZXR1cm4gKHRyZWUpIGUtPmF1eDsKLX0KLQogLyogU2V0cyB0aGUgZ2lt cGxpZmllZCBwcmVkaWNhdGUgQ09ORCBmb3IgYmFzaWMgYmxvY2sgQkIuICAq LwogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTE4NSwxNiArMTc1LDYgQEAg c2V0X2JiX3ByZWRpY2F0ZSAoYmFzaWNfYmxvY2sgYmIsIHRyZWUgY29uZCkK ICAgKChiYl9wcmVkaWNhdGVfcCkgYmItPmF1eCktPnByZWRpY2F0ZSA9IGNv bmQ7CiB9CiAKLS8qIFNldHMgcHJlZGljYXRlIENPTkQgZm9yIGNyaXRpY2Fs IGVkZ2UgRS4KLSAgIEFzc3VtZXMgdGhhdCAjKEUtPnNyYy0+c3VjY3MpID49 MiAmICMoRS0+ZGVzdC0+cHJlZHMpID49IDIuICAqLwotCi1zdGF0aWMgaW5s aW5lIHZvaWQKLXNldF9lZGdlX3ByZWRpY2F0ZSAoZWRnZSBlLCB0cmVlIGNv bmQpCi17Ci0gIGdjY19hc3NlcnQgKGNvbmQgIT0gTlVMTF9UUkVFKTsKLSAg ZS0+YXV4ID0gY29uZDsKLX0KLQogLyogUmV0dXJucyB0aGUgc2VxdWVuY2Ug b2Ygc3RhdGVtZW50cyBvZiB0aGUgZ2ltcGxpZmljYXRpb24gb2YgdGhlCiAg ICBwcmVkaWNhdGUgZm9yIGJhc2ljIGJsb2NrIEJCLiAgKi8KIApAQCAtNTEx LDExICs0OTEsNiBAQCBhZGRfdG9fZHN0X3ByZWRpY2F0ZV9saXN0IChzdHJ1 Y3QgbG9vcCAqbG9vcCwgZWRnZSBlLAogCiAgIGlmICghZG9taW5hdGVkX2J5 X3AgKENESV9ET01JTkFUT1JTLCBsb29wLT5sYXRjaCwgZS0+ZGVzdCkpCiAg ICAgYWRkX3RvX3ByZWRpY2F0ZV9saXN0IChsb29wLCBlLT5kZXN0LCBjb25k KTsKLQotICAvKiBJZiBlZGdlIEUgaXMgY3JpdGljYWwgc2F2ZSBwcmVkaWNh dGUgb24gaXQuCi0gICAgIEFzc3VtZSB0aGF0ICMoZS0+c3JjLT5zdWNjcykg Pj0gMi4gICovCi0gIGlmIChFREdFX0NPVU5UIChlLT5kZXN0LT5wcmVkcykg Pj0gMikKLSAgICBzZXRfZWRnZV9wcmVkaWNhdGUgKGUsIGNvbmQpOwogfQog CiAvKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBzdWNjZXNzb3IgZWRn ZXMgb2YgQkIgZXhpdHMgTE9PUC4gICovCkBAIC05OTcsNiArOTcyLDE5IEBA IGFsbF9wcmVkc19jcml0aWNhbF9wIChiYXNpY19ibG9jayBiYikKICAgcmV0 dXJuIHRydWU7CiB9CiAKKy8qIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBv bmUgc3VjY2Vzc29yIGluIG9uIGNyaXRpY2FsIGVkZ2UuICAqLworc3RhdGlj IGlubGluZSBib29sCitoYXNfcHJlZF9jcml0aWNhbF9wIChiYXNpY19ibG9j ayBiYikKK3sKKyAgZWRnZSBlOworICBlZGdlX2l0ZXJhdG9yIGVpOworCisg IEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+cHJlZHMpCisgICAgaWYgKEVE R0VfQ09VTlQgKGUtPnNyYy0+c3VjY3MpID4gMSkKKyAgICAgIHJldHVybiB0 cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKIC8qIFJldHVybiB0cnVlIHdo ZW4gQkIgaXMgaWYtY29udmVydGlibGUuICBUaGlzIHJvdXRpbmUgZG9lcyBu b3QgY2hlY2sKICAgIGJhc2ljIGJsb2NrJ3Mgc3RhdGVtZW50cyBhbmQgcGhp cy4KIApAQCAtMTAyMCwxMCArMTAwOCwxNSBAQCBpZl9jb252ZXJ0aWJsZV9i Yl9wIChzdHJ1Y3QgbG9vcCAqbG9vcCwgYmFzaWNfYmxvY2sgYmIsIGJhc2lj X2Jsb2NrIGV4aXRfYmIpCiAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxh Z3MgJiBUREZfREVUQUlMUykpCiAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAi LS0tLS0tLS0tLVslZF0tLS0tLS0tLS0tLS0tXG4iLCBiYi0+aW5kZXgpOwog Ci0gIGlmIChFREdFX0NPVU5UIChiYi0+cHJlZHMpID4gMgotICAgICAgfHwg RURHRV9DT1VOVCAoYmItPnN1Y2NzKSA+IDIpCisgIGlmIChFREdFX0NPVU5U IChiYi0+c3VjY3MpID4gMikKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgaWYg KEVER0VfQ09VTlQgKGJiLT5wcmVkcykgPiAyKQorICAgIHsKKyAgICAgIGlm ICghYWdncmVzc2l2ZV9pZl9jb252KQorCXJldHVybiBmYWxzZTsKKyAgICB9 CisKICAgaWYgKGV4aXRfYmIpCiAgICAgewogICAgICAgaWYgKGJiICE9IGxv b3AtPmxhdGNoKQpAQCAtMTA1OSwxOSArMTA1MiwxNSBAQCBpZl9jb252ZXJ0 aWJsZV9iYl9wIChzdHJ1Y3QgbG9vcCAqbG9vcCwgYmFzaWNfYmxvY2sgYmIs IGJhc2ljX2Jsb2NrIGV4aXRfYmIpCiAKICAgLyogQXQgbGVhc3Qgb25lIGlu Y29taW5nIGVkZ2UgaGFzIHRvIGJlIG5vbi1jcml0aWNhbCBhcyBvdGhlcndp c2UgZWRnZQogICAgICBwcmVkaWNhdGVzIGFyZSBub3QgZXF1YWwgdG8gYmFz aWMtYmxvY2sgcHJlZGljYXRlcyBvZiB0aGUgZWRnZQotICAgICBzb3VyY2Uu IFRoaXMgcmVzdHJpY3Rpb24gd2lsbCBiZSByZW1vdmVkIGFmdGVyIGFkZGlu ZyBzdXBwb3J0IGZvcgotICAgICBleHRlbmRlZCBwcmVkaWNhdGlvbi4gICov Ci0gIGlmIChFREdFX0NPVU5UIChiYi0+cHJlZHMpID4gMQotICAgICAgJiYg YmIgIT0gbG9vcC0+aGVhZGVyKQorICAgICBzb3VyY2UuIFRoaXMgY2hlY2sg aXMgc2tpcHBlZCBpZiBhZ2dyZXNzaXZlX2lmX2NvbnYgaXMgdHJ1ZS4gICov CisgIGlmICghYWdncmVzc2l2ZV9pZl9jb252CisgICAgICAmJiBFREdFX0NP VU5UIChiYi0+cHJlZHMpID4gMQorICAgICAgJiYgYmIgIT0gbG9vcC0+aGVh ZGVyCisgICAgICAmJiBhbGxfcHJlZHNfY3JpdGljYWxfcCAoYmIpKQogICAg IHsKLSAgICAgIGlmICghYWdncmVzc2l2ZV9pZl9jb252ICYmIGFsbF9wcmVk c19jcml0aWNhbF9wIChiYikpCi0JewotCSAgaWYgKGR1bXBfZmlsZSAmJiAo ZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQkgICAgZnByaW50ZiAoZHVt cF9maWxlLCAib25seSBjcml0aWNhbCBwcmVkZWNlc3NvcnMgaW4gYmIjJWRc biIsCi0JCSAgICAgIGJiLT5pbmRleCk7Ci0KLQkgIHJldHVybiBmYWxzZTsK LQl9CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERG X0RFVEFJTFMpKQorCWZwcmludGYgKGR1bXBfZmlsZSwgIm9ubHkgY3JpdGlj YWwgcHJlZGVjZXNzb3JzXG4iKTsKKwlyZXR1cm4gZmFsc2U7CiAgICAgfQog CiAgIHJldHVybiB0cnVlOwpAQCAtMTIwOCw4ICsxMTk3LDYgQEAgcHJlZGlj YXRlX2JicyAobG9vcF9wIGxvb3ApCiAJICBleHRyYWN0X3RydWVfZmFsc2Vf ZWRnZXNfZnJvbV9ibG9jayAoZ2ltcGxlX2JiIChzdG10KSwKIAkJCQkJICAg ICAgICZ0cnVlX2VkZ2UsICZmYWxzZV9lZGdlKTsKIAotICAgICAgICAgIHRy dWVfZWRnZS0+YXV4ID0gZmFsc2VfZWRnZS0+YXV4ID0gTlVMTDsKLQogCSAg LyogSWYgQyBpcyB0cnVlLCB0aGVuIFRSVUVfRURHRSBpcyB0YWtlbi4gICov CiAJICBhZGRfdG9fZHN0X3ByZWRpY2F0ZV9saXN0IChsb29wLCB0cnVlX2Vk Z2UsIHVuc2hhcmVfZXhwciAoY29uZCksCiAJCQkJICAgICB1bnNoYXJlX2V4 cHIgKGMpKTsKQEAgLTEzNTEsNyArMTMzOCw3IEBAIGlmX2NvbnZlcnRpYmxl X2xvb3BfcF8xIChzdHJ1Y3QgbG9vcCAqbG9vcCwKICAgICB9CiAKICAgaWYg KGR1bXBfZmlsZSkKLSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJBcHBseWlu ZyBpZi1jb252ZXJzaW9uXG4iKTsKKyAgICBmcHJpbnRmIChkdW1wX2ZpbGUs ICJBcHBseWluZyBpZi1jb252ZXJzaW9uIGZvciBsb29wLT5oZWFkZXIjJWQg aW4gJXNcbiIsIGxvb3AtPmhlYWRlci0+aW5kZXgsIGN1cnJlbnRfZnVuY3Rp b25fbmFtZSgpKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTE0MjMsNjAg KzE0MTAsNiBAQCBpZl9jb252ZXJ0aWJsZV9sb29wX3AgKHN0cnVjdCBsb29w ICpsb29wLCBib29sICphbnlfbWFza19sb2FkX3N0b3JlKQogICByZXR1cm4g cmVzOwogfQogCi0vKiBCYXNpYyBibG9jayBCQiBoYXMgdHdvIHByZWRlY2Vz c29ycy4gIFVzaW5nIHByZWRlY2Vzc29yJ3MgYmIKLSAgIHByZWRpY2F0ZSwg c2V0IGFuIGFwcHJvcHJpYXRlIGNvbmRpdGlvbiBDT05EIGZvciB0aGUgUEhJ IG5vZGUKLSAgIHJlcGxhY2VtZW50LiAgUmV0dXJuIHRoZSB0cnVlIGJsb2Nr IHdob3NlIHBoaSBhcmd1bWVudHMgYXJlCi0gICBzZWxlY3RlZCB3aGVuIGNv bmQgaXMgdHJ1ZS4gIExPT1AgaXMgdGhlIGxvb3AgY29udGFpbmluZyB0aGUK LSAgIGlmLWNvbnZlcnRlZCByZWdpb24sIEdTSSBpcyB0aGUgcGxhY2UgdG8g aW5zZXJ0IHRoZSBjb2RlIGZvciB0aGUKLSAgIGlmLWNvbnZlcnNpb24uICAq LwotCi1zdGF0aWMgYmFzaWNfYmxvY2sKLWZpbmRfcGhpX3JlcGxhY2VtZW50 X2NvbmRpdGlvbiAoYmFzaWNfYmxvY2sgYmIsIHRyZWUgKmNvbmQsCi0JCQkJ Z2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkKLXsKLSAgZWRnZSBmaXJzdF9l ZGdlLCBzZWNvbmRfZWRnZTsKLSAgdHJlZSB0bXBfY29uZDsKLQotICBnY2Nf YXNzZXJ0IChFREdFX0NPVU5UIChiYi0+cHJlZHMpID09IDIpOwotICBmaXJz dF9lZGdlID0gRURHRV9QUkVEIChiYiwgMCk7Ci0gIHNlY29uZF9lZGdlID0g RURHRV9QUkVEIChiYiwgMSk7Ci0KLSAgLyogUHJlZmVyIGFuIGVkZ2Ugd2l0 aCBhIG5vdCBuZWdhdGVkIHByZWRpY2F0ZS4KLSAgICAgPz8/ICBUaGF0J3Mg YSB2ZXJ5IHdlYWsgY29zdCBtb2RlbC4gICovCi0gIHRtcF9jb25kID0gYmJf cHJlZGljYXRlIChmaXJzdF9lZGdlLT5zcmMpOwotICBnY2NfYXNzZXJ0ICh0 bXBfY29uZCk7Ci0gIGlmIChUUkVFX0NPREUgKHRtcF9jb25kKSA9PSBUUlVU SF9OT1RfRVhQUikKLSAgICB7Ci0gICAgICBlZGdlIHRtcF9lZGdlOwotCi0g ICAgICB0bXBfZWRnZSA9IGZpcnN0X2VkZ2U7Ci0gICAgICBmaXJzdF9lZGdl ID0gc2Vjb25kX2VkZ2U7Ci0gICAgICBzZWNvbmRfZWRnZSA9IHRtcF9lZGdl OwotICAgIH0KLQotICAvKiBDaGVjayBpZiB0aGUgZWRnZSB3ZSB0YWtlIHRo ZSBjb25kaXRpb24gZnJvbSBpcyBub3QgY3JpdGljYWwuCi0gICAgIFdlIGtu b3cgdGhhdCBhdCBsZWFzdCBvbmUgbm9uLWNyaXRpY2FsIGVkZ2UgZXhpc3Rz LiAgKi8KLSAgaWYgKEVER0VfQ09VTlQgKGZpcnN0X2VkZ2UtPnNyYy0+c3Vj Y3MpID4gMSkKLSAgICB7Ci0gICAgICAqY29uZCA9IGJiX3ByZWRpY2F0ZSAo c2Vjb25kX2VkZ2UtPnNyYyk7Ci0KLSAgICAgIGlmIChUUkVFX0NPREUgKCpj b25kKSA9PSBUUlVUSF9OT1RfRVhQUikKLQkqY29uZCA9IFRSRUVfT1BFUkFO RCAoKmNvbmQsIDApOwotICAgICAgZWxzZQotCS8qIFNlbGVjdCBub24gbG9v cCBoZWFkZXIgYmIuICAqLwotCWZpcnN0X2VkZ2UgPSBzZWNvbmRfZWRnZTsK LSAgICB9Ci0gIGVsc2UKLSAgICAqY29uZCA9IGJiX3ByZWRpY2F0ZSAoZmly c3RfZWRnZS0+c3JjKTsKLQotICAvKiBHaW1wbGlmeSB0aGUgY29uZGl0aW9u IHRvIGEgdmFsaWQgY29uZC1leHByIGNvbmRpdG9uYWwgb3BlcmFuZC4gICov Ci0gICpjb25kID0gZm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpXzEgKGdzaSwg dW5zaGFyZV9leHByICgqY29uZCksCi0JCQkJICAgICAgaXNfZ2ltcGxlX2Nv bmRleHByLCBOVUxMX1RSRUUsCi0JCQkJICAgICAgdHJ1ZSwgR1NJX1NBTUVf U1RNVCk7Ci0KLSAgcmV0dXJuIGZpcnN0X2VkZ2UtPnNyYzsKLX0KLQogLyog UmV0dXJucyB0cnVlIGlmIGRlZi1zdG10IGZvciBwaGkgYXJndW1lbnQgQVJH IGlzIHNpbXBsZSBpbmNyZW1lbnQvZGVjcmVtZW50CiAgICB3aGljaCBpcyBp biBwcmVkaWNhdGVkIGJhc2ljIGJsb2NrLgogICAgSW4gZmFjdCwgdGhlIGZv bGxvd2luZyBQSEkgcGF0dGVybiBpcyBzZWFyY2hpbmc6CkBAIC0xNDg3LDE0 ICsxNDIwLDE1IEBAIGZpbmRfcGhpX3JlcGxhY2VtZW50X2NvbmRpdGlvbiAo YmFzaWNfYmxvY2sgYmIsIHRyZWUgKmNvbmQsCiAJICByZWR1Y18zID0gLi4u CiAJcmVkdWNfMiA9IFBISSA8cmVkdWNfMSwgcmVkdWNfMz4KIAotICAgUkVE VUMsIE9QMCBhbmQgT1AxIGNvbnRhaW4gcmVkdWN0aW9uIHN0bXQgYW5kIGl0 cyBvcGVyYW5kcy4gICovCisgICBBUkdfMCBhbmQgQVJHXzEgYXJlIGNvcnJl c3BvbmRlbnQgUEhJIGFyZ3VtZW50cy4KKyAgIFJFRFVDLCBPUDAgYW5kIE9Q MSBjb250YWluIHJlZHVjdGlvbiBzdG10IGFuZCBpdHMgb3BlcmFuZHMuCisg ICBFWFRFTkRFRCBpcyB0cnVlIGlmIFBISSBoYXMgPiAyIGFyZ3VtZW50cy4g ICovCiAKIHN0YXRpYyBib29sCi1pc19jb25kX3NjYWxhcl9yZWR1Y3Rpb24g KGdpbXBsZSBwaGksIGdpbXBsZSAqcmVkdWMsCi0JCQkgIHRyZWUgKm9wMCwg dHJlZSAqb3AxKQoraXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChnaW1wbGUg cGhpLCBnaW1wbGUgKnJlZHVjLCB0cmVlIGFyZ18wLCB0cmVlIGFyZ18xLAor CQkJICB0cmVlICpvcDAsIHRyZWUgKm9wMSwgYm9vbCBleHRlbmRlZCkKIHsK ICAgdHJlZSBsaHMsIHJfb3AxLCByX29wMjsKLSAgdHJlZSBhcmdfMCwgYXJn XzE7CiAgIGdpbXBsZSBzdG10OwogICBnaW1wbGUgaGVhZGVyX3BoaSA9IE5V TEw7CiAgIGVudW0gdHJlZV9jb2RlIHJlZHVjdGlvbl9vcDsKQEAgLTE1MDMs MTMgKzE0MzcsMTMgQEAgaXNfY29uZF9zY2FsYXJfcmVkdWN0aW9uIChnaW1w bGUgcGhpLCBnaW1wbGUgKnJlZHVjLAogICBlZGdlIGxhdGNoX2UgPSBsb29w X2xhdGNoX2VkZ2UgKGxvb3ApOwogICBpbW1fdXNlX2l0ZXJhdG9yIGltbV9p dGVyOwogICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwotCi0gIGFyZ18wID0gUEhJ X0FSR19ERUYgKHBoaSwgMCk7Ci0gIGFyZ18xID0gUEhJX0FSR19ERUYgKHBo aSwgMSk7CisgIGVkZ2UgZTsKKyAgZWRnZV9pdGVyYXRvciBlaTsKKyAgYm9v bCByZXN1bHQgPSBmYWxzZTsKICAgaWYgKFRSRUVfQ09ERSAoYXJnXzApICE9 IFNTQV9OQU1FIHx8IFRSRUVfQ09ERSAoYXJnXzEpICE9IFNTQV9OQU1FKQog ICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAoZ2ltcGxlX2NvZGUgKFNTQV9O QU1FX0RFRl9TVE1UIChhcmdfMCkpID09IEdJTVBMRV9QSEkpCisgIGlmICgh ZXh0ZW5kZWQgJiYgZ2ltcGxlX2NvZGUgKFNTQV9OQU1FX0RFRl9TVE1UIChh cmdfMCkpID09IEdJTVBMRV9QSEkpCiAgICAgewogICAgICAgbGhzID0gYXJn XzE7CiAgICAgICBoZWFkZXJfcGhpID0gU1NBX05BTUVfREVGX1NUTVQgKGFy Z18wKTsKQEAgLTE1NDAsOCArMTQ3NCwxMyBAQCBpc19jb25kX3NjYWxhcl9y ZWR1Y3Rpb24gKGdpbXBsZSBwaGksIGdpbXBsZSAqcmVkdWMsCiAgICAgcmV0 dXJuIGZhbHNlOwogCiAgIC8qIENoZWNrIHRoYXQgc3RtdC1ibG9jayBpcyBw cmVkZWNlc3NvciBvZiBwaGktYmxvY2suICAqLwotICBpZiAoRURHRV9QUkVE IChiYiwgMCktPnNyYyAhPSBnaW1wbGVfYmIgKHN0bXQpCi0gICAgICAmJiBF REdFX1BSRUQgKGJiLCAxKS0+c3JjICE9IGdpbXBsZV9iYiAoc3RtdCkpCisg IEZPUl9FQUNIX0VER0UgKGUsIGVpLCBnaW1wbGVfYmIgKHN0bXQpLT5zdWNj cykKKyAgICBpZiAoZS0+ZGVzdCA9PSBiYikKKyAgICAgIHsKKwlyZXN1bHQg PSB0cnVlOworCWJyZWFrOworICAgICAgfQorICBpZiAoIXJlc3VsdCkKICAg ICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKCFoYXNfc2luZ2xlX3VzZSAobGhz KSkKQEAgLTE2MzgsOSArMTU3Nyw2NiBAQCBjb252ZXJ0X3NjYWxhcl9jb25k X3JlZHVjdGlvbiAoZ2ltcGxlIHJlZHVjLCBnaW1wbGVfc3RtdF9pdGVyYXRv ciAqZ3NpLAogICByZXR1cm4gcmhzOwogfQogCisvKiBIZWxwZXJzIGZvciBQ SEkgYXJndW1lbnRzIGhhc2h0YWJsZSBtYXAuICAqLworCitzdHJ1Y3QgcGhp X2FyZ3NfaGFzaF90cmFpdHMgOiBkZWZhdWx0X2hhc2htYXBfdHJhaXRzCit7 CisgIHN0YXRpYyBpbmxpbmUgaGFzaHZhbF90IGhhc2ggKHRyZWUpOworICBz dGF0aWMgaW5saW5lIGJvb2wgZXF1YWxfa2V5cyAodHJlZSwgdHJlZSk7Cit9 OworCitpbmxpbmUgaGFzaHZhbF90CitwaGlfYXJnc19oYXNoX3RyYWl0czo6 aGFzaCAodHJlZSB2YWx1ZSkKK3sKKyAgcmV0dXJuIGl0ZXJhdGl2ZV9oYXNo X2V4cHIgKHZhbHVlLCAwKTsKK30KKworaW5saW5lIGJvb2wKK3BoaV9hcmdz X2hhc2hfdHJhaXRzOjplcXVhbF9rZXlzICh0cmVlIHZhbHVlMSwgdHJlZSB2 YWx1ZTIpCit7CisgIHJldHVybiBvcGVyYW5kX2VxdWFsX3AgKHZhbHVlMSwg dmFsdWUyLCAwKTsKK30KKworICAvKiBQcm9kdWNlIGNvbmRpdGlvbiBmb3Ig YWxsIG9jY3VycmVuY2VzIG9mIEFSRyBpbiBQSEkgbm9kZS4gICovCisKK3N0 YXRpYyB0cmVlCitnZW5fcGhpX2FyZ19jb25kaXRpb24gKGdwaGkgKnBoaSwg dmVjPGludD4gKm9jY3VyLAorCQkgICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgKmdzaSkKK3sKKyAgaW50IGxlbjsKKyAgaW50IGk7CisgIHRyZWUgY29u ZCA9IE5VTExfVFJFRTsKKyAgdHJlZSBjOworICBlZGdlIGU7CisKKyAgbGVu ID0gb2NjdXItPmxlbmd0aCAoKTsKKyAgZ2NjX2Fzc2VydCAobGVuID4gMCk7 CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBl ID0gZ2ltcGxlX3BoaV9hcmdfZWRnZSAocGhpLCAoKm9jY3VyKVtpXSk7Cisg ICAgICBjID0gYmJfcHJlZGljYXRlIChlLT5zcmMpOworICAgICAgaWYgKGlz X3RydWVfcHJlZGljYXRlIChjKSkKKwljb250aW51ZTsKKyAgICAgIGMgPSBm b3JjZV9naW1wbGVfb3BlcmFuZF9nc2lfMSAoZ3NpLCB1bnNoYXJlX2V4cHIg KGMpLAorCQkJCSAgICAgIGlzX2dpbXBsZV9jb25kZXhwciwgTlVMTF9UUkVF LAorCQkJCSAgICAgIHRydWUsIEdTSV9TQU1FX1NUTVQpOworICAgICAgaWYg KGNvbmQgIT0gTlVMTF9UUkVFKQorCXsKKwkgIC8qIE11c3QgYnVpbGQgT1Ig ZXhwcmVzc2lvbi4gICovCisJICBjb25kID0gZm9sZF9vcl9wcmVkaWNhdGVz IChFWFBSX0xPQ0FUSU9OIChjKSwgYywgY29uZCk7CisJICBjb25kID0gZm9y Y2VfZ2ltcGxlX29wZXJhbmRfZ3NpXzEgKGdzaSwgdW5zaGFyZV9leHByIChj b25kKSwKKwkJCQkJICAgICBpc19naW1wbGVfY29uZGV4cHIsIE5VTExfVFJF RSwKKwkJCQkJICAgICB0cnVlLCBHU0lfU0FNRV9TVE1UKTsKKwl9CisgICAg ICBlbHNlCisJY29uZCA9IGM7CisgICAgfQorICBnY2NfYXNzZXJ0IChjb25k ICE9IE5VTExfVFJFRSk7CisgIHJldHVybiBjb25kOworfQorCiAvKiBSZXBs YWNlIGEgc2NhbGFyIFBISSBub2RlIHdpdGggYSBDT05EX0VYUFIgdXNpbmcg Q09ORCBhcyBjb25kaXRpb24uCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBub3Qg aGFuZGxlIFBISSBub2RlcyB3aXRoIG1vcmUgdGhhbiB0d28KLSAgIGFyZ3Vt ZW50cy4KKyAgIFRoaXMgcm91dGluZSBjYW4gaGFuZGxlIFBISSBub2RlcyB3 aXRoIG1vcmUgdGhhbiB0d28gYXJndW1lbnRzLgogCiAgICBGb3IgZXhhbXBs ZSwKICAgICAgUzE6IEEgPSBQSEkgPHgxKDEpLCB4Mig1KT4KQEAgLTE2NDgs NjkgKzE2NDQsMjA4IEBAIGNvbnZlcnRfc2NhbGFyX2NvbmRfcmVkdWN0aW9u IChnaW1wbGUgcmVkdWMsIGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2ksCiAg ICAgIFMyOiBBID0gY29uZCA/IHgxIDogeDI7CiAKICAgIFRoZSBnZW5lcmF0 ZWQgY29kZSBpcyBpbnNlcnRlZCBhdCBHU0kgdGhhdCBwb2ludHMgdG8gdGhl IHRvcCBvZgotICAgYmFzaWMgYmxvY2sncyBzdGF0ZW1lbnQgbGlzdC4gIFdo ZW4gQ09ORCBpcyB0cnVlLCBwaGkgYXJnIGZyb20KLSAgIFRSVUVfQkIgaXMg c2VsZWN0ZWQuICAqLworICAgYmFzaWMgYmxvY2sncyBzdGF0ZW1lbnQgbGlz dC4KKyAgIElmIFBISSBub2RlIGhhcyBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50 cyBhIGNoYWluIG9mIGNvbmRpdGlvbmFsCisgICBleHByZXNzaW9uIGlzIHBy b2R1Y2VkLiAgKi8KKwogCiBzdGF0aWMgdm9pZAotcHJlZGljYXRlX3NjYWxh cl9waGkgKGdwaGkgKnBoaSwgdHJlZSBjb25kLAotCQkgICAgICBiYXNpY19i bG9jayB0cnVlX2JiLAotCQkgICAgICBnaW1wbGVfc3RtdF9pdGVyYXRvciAq Z3NpKQorcHJlZGljYXRlX3NjYWxhcl9waGkgKGdwaGkgKnBoaSwgZ2ltcGxl X3N0bXRfaXRlcmF0b3IgKmdzaSkKIHsKLSAgZ2ltcGxlIG5ld19zdG10Owor ICBnaW1wbGUgbmV3X3N0bXQgPSBOVUxMLCByZWR1YzsKKyAgdHJlZSByaHMs IHJlcywgYXJnMCwgYXJnMSwgb3AwLCBvcDEsIHNjZXY7CisgIHRyZWUgY29u ZDsKKyAgdW5zaWduZWQgaW50IGluZGV4MDsKKyAgdW5zaWduZWQgaW50IG1h eF9pbmQsIG1heCwgYXJnc19sZW47CisgIGVkZ2UgZTsKICAgYmFzaWNfYmxv Y2sgYmI7Ci0gIHRyZWUgcmhzLCByZXMsIGFyZywgc2NldjsKLQotICBnY2Nf YXNzZXJ0IChnaW1wbGVfY29kZSAocGhpKSA9PSBHSU1QTEVfUEhJCi0JICAg ICAgJiYgZ2ltcGxlX3BoaV9udW1fYXJncyAocGhpKSA9PSAyKTsKKyAgdW5z aWduZWQgaW50IGk7CiAKICAgcmVzID0gZ2ltcGxlX3BoaV9yZXN1bHQgKHBo aSk7Ci0gIC8qIERvIG5vdCBoYW5kbGUgdmlydHVhbCBwaGkgbm9kZXMuICAq LwogICBpZiAodmlydHVhbF9vcGVyYW5kX3AgKHJlcykpCiAgICAgcmV0dXJu OwogCi0gIGJiID0gZ2ltcGxlX2JiIChwaGkpOwotCi0gIGlmICgoYXJnID0g ZGVnZW5lcmF0ZV9waGlfcmVzdWx0IChwaGkpKQorICBpZiAoKHJocyA9IGRl Z2VuZXJhdGVfcGhpX3Jlc3VsdCAocGhpKSkKICAgICAgIHx8ICgoc2NldiA9 IGFuYWx5emVfc2NhbGFyX2V2b2x1dGlvbiAoZ2ltcGxlX2JiIChwaGkpLT5s b29wX2ZhdGhlciwKIAkJCQkJICAgIHJlcykpCiAJICAmJiAhY2hyZWNfY29u dGFpbnNfdW5kZXRlcm1pbmVkIChzY2V2KQogCSAgJiYgc2NldiAhPSByZXMK LQkgICYmIChhcmcgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMCkpKSkK LSAgICByaHMgPSBhcmc7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0cmVlIGFy Z18wLCBhcmdfMTsKLSAgICAgIHRyZWUgb3AwLCBvcDE7Ci0gICAgICBnaW1w bGUgcmVkdWM7CisJICAmJiAocmhzID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChw aGksIDApKSkpIHsKKyAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQorICAgICAgeworCWZwcmludGYgKGR1bXBfZmls ZSwgIkRlZ2VuZXJhdGUgcGhpIVxuIik7CisJcHJpbnRfZ2ltcGxlX3N0bXQg KGR1bXBfZmlsZSwgcGhpLCAwLCBUREZfU0xJTSk7CisgICAgICB9CisgICAg bmV3X3N0bXQgPSBnaW1wbGVfYnVpbGRfYXNzaWduIChyZXMsIHJocyk7Cisg ICAgZ3NpX2luc2VydF9iZWZvcmUgKGdzaSwgbmV3X3N0bXQsIEdTSV9TQU1F X1NUTVQpOworICAgIHVwZGF0ZV9zdG10IChuZXdfc3RtdCk7CisgICAgcmV0 dXJuOworICB9CiAKLSAgICAgIC8qIFVzZSBjb25kaXRpb24gdGhhdCBpcyBu b3QgVFJVVEhfTk9UX0VYUFIgaW4gY29uZGl0aW9uYWwgbW9kaWZ5IGV4cHIu ICAqLworICBiYiA9IGdpbXBsZV9iYiAocGhpKTsKKyAgaWYgKEVER0VfQ09V TlQgKGJiLT5wcmVkcykgPT0gMikKKyAgICB7CisgICAgICAvKiBQcmVkaWNh dGUgb3JkaW5hcnkgUEhJIG5vZGUgd2l0aCAyIGFyZ3VtZW50cy4gICovCisg ICAgICBlZGdlIGZpcnN0X2VkZ2UsIHNlY29uZF9lZGdlOworICAgICAgYmFz aWNfYmxvY2sgdHJ1ZV9iYjsKKyAgICAgIGZpcnN0X2VkZ2UgPSBFREdFX1BS RUQgKGJiLCAwKTsKKyAgICAgIHNlY29uZF9lZGdlID0gRURHRV9QUkVEIChi YiwgMSk7CisgICAgICBjb25kID0gYmJfcHJlZGljYXRlIChmaXJzdF9lZGdl LT5zcmMpOworICAgICAgaWYgKFRSRUVfQ09ERSAoY29uZCkgPT0gVFJVVEhf Tk9UX0VYUFIpCisJeworCSAgZWRnZSB0bXBfZWRnZSA9IGZpcnN0X2VkZ2U7 CisJICBmaXJzdF9lZGdlID0gc2Vjb25kX2VkZ2U7CisJICBzZWNvbmRfZWRn ZSA9IHRtcF9lZGdlOworCX0KKyAgICAgIGlmIChFREdFX0NPVU5UIChmaXJz dF9lZGdlLT5zcmMtPnN1Y2NzKSA+IDEpCisJeworCSAgY29uZCA9IGJiX3By ZWRpY2F0ZSAoc2Vjb25kX2VkZ2UtPnNyYyk7CisJICBpZiAoVFJFRV9DT0RF IChjb25kKSA9PSBUUlVUSF9OT1RfRVhQUikKKwkgICAgY29uZCA9IFRSRUVf T1BFUkFORCAoY29uZCwgMCk7CisJICBlbHNlCisJICAgIGZpcnN0X2VkZ2Ug PSBzZWNvbmRfZWRnZTsKKwl9CisgICAgICBlbHNlCisJY29uZCA9IGJiX3By ZWRpY2F0ZSAoZmlyc3RfZWRnZS0+c3JjKTsKKyAgICAgIC8qIEdpbXBsaWZ5 IHRoZSBjb25kaXRpb24gdG8gYSB2YWxpZCBjb25kLWV4cHIgY29uZGl0b25h bCBvcGVyYW5kLiAgKi8KKyAgICAgIGNvbmQgPSBmb3JjZV9naW1wbGVfb3Bl cmFuZF9nc2lfMSAoZ3NpLCB1bnNoYXJlX2V4cHIgKGNvbmQpLAorCQkJCQkg aXNfZ2ltcGxlX2NvbmRleHByLCBOVUxMX1RSRUUsCisJCQkJCSB0cnVlLCBH U0lfU0FNRV9TVE1UKTsKKyAgICAgIHRydWVfYmIgPSBmaXJzdF9lZGdlLT5z cmM7CiAgICAgICBpZiAoRURHRV9QUkVEIChiYiwgMSktPnNyYyA9PSB0cnVl X2JiKQogCXsKLQkgIGFyZ18wID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGks IDEpOwotCSAgYXJnXzEgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMCk7 CisJICBhcmcwID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIDEpOworCSAg YXJnMSA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhpLCAwKTsKIAl9CiAgICAg ICBlbHNlCiAJewotCSAgYXJnXzAgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBo aSwgMCk7Ci0JICBhcmdfMSA9IGdpbXBsZV9waGlfYXJnX2RlZiAocGhpLCAx KTsKKwkgIGFyZzAgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHBoaSwgMCk7CisJ ICBhcmcxID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIDEpOwogCX0KLSAg ICAgIGlmIChpc19jb25kX3NjYWxhcl9yZWR1Y3Rpb24gKHBoaSwgJnJlZHVj LCAmb3AwLCAmb3AxKSkKKyAgICAgIGlmIChpc19jb25kX3NjYWxhcl9yZWR1 Y3Rpb24gKHBoaSwgJnJlZHVjLCBhcmcwLCBhcmcxLAorCQkJCSAgICAmb3Aw LCAmb3AxLCBmYWxzZSkpCiAJLyogQ29udmVydCByZWR1Y3Rpb24gc3RtdCBp bnRvIHZlY3Rvcml6YWJsZSBmb3JtLiAgKi8KIAlyaHMgPSBjb252ZXJ0X3Nj YWxhcl9jb25kX3JlZHVjdGlvbiAocmVkdWMsIGdzaSwgY29uZCwgb3AwLCBv cDEsCiAJCQkJCSAgICAgdHJ1ZV9iYiAhPSBnaW1wbGVfYmIgKHJlZHVjKSk7 CiAgICAgICBlbHNlCiAJLyogQnVpbGQgbmV3IFJIUyB1c2luZyBzZWxlY3Rl ZCBjb25kaXRpb24gYW5kIGFyZ3VtZW50cy4gICovCiAJcmhzID0gZm9sZF9i dWlsZF9jb25kX2V4cHIgKFRSRUVfVFlQRSAocmVzKSwgdW5zaGFyZV9leHBy IChjb25kKSwKLQkJCQkgICAgYXJnXzAsIGFyZ18xKTsKKwkJCQkgICAgYXJn MCwgYXJnMSk7CisgICAgICBuZXdfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3Np Z24gKHJlcywgcmhzKTsKKyAgICAgIGdzaV9pbnNlcnRfYmVmb3JlIChnc2ks IG5ld19zdG10LCBHU0lfU0FNRV9TVE1UKTsKKyAgICAgIHVwZGF0ZV9zdG10 IChuZXdfc3RtdCk7CisKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCisJeworCSAgZnByaW50ZiAoZHVtcF9m aWxlLCAibmV3IHBoaSByZXBsYWNlbWVudCBzdG10XG4iKTsKKwkgIHByaW50 X2dpbXBsZV9zdG10IChkdW1wX2ZpbGUsIG5ld19zdG10LCAwLCBUREZfU0xJ TSk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBDcmVhdGUg aGFzaG1hcCBmb3IgUEhJIG5vZGUgd2hpY2ggY29udGFpbiB2ZWN0b3Igb2Yg YXJndW1lbnQgaW5kZXhlcworICAgICBoYXZpbmcgdGhlIHNhbWUgdmFsdWUu ICAqLworICBib29sIHN3YXAgPSBmYWxzZTsKKyAgaGFzaF9tYXA8dHJlZSwg YXV0b192ZWM8aW50PiwgcGhpX2FyZ3NfaGFzaF90cmFpdHM+IHBoaV9hcmdf bWFwOworICB1bnNpZ25lZCBpbnQgbnVtX2FyZ3MgPSBnaW1wbGVfcGhpX251 bV9hcmdzIChwaGkpOworICAvKiBWZWN0b3Igb2YgZGlmZmVyZW50IFBISSBh cmd1bWVudCB2YWx1ZXMuICAqLworICBhdXRvX3ZlYzx0cmVlPiBhcmdzIChu dW1fYXJncyk7CisKKyAgLyogQ29tcHV0ZSBwaGlfYXJnX21hcC4gICovCisg IGZvciAoaSA9IDA7IGkgPCBudW1fYXJnczsgaSsrKQorICAgIHsKKyAgICAg IHRyZWUgYXJnOworCisgICAgICBhcmcgPSBnaW1wbGVfcGhpX2FyZ19kZWYg KHBoaSwgaSk7CisgICAgICBpZiAoIXBoaV9hcmdfbWFwLmdldCAoYXJnKSkK KwlhcmdzLnF1aWNrX3B1c2ggKGFyZyk7CisgICAgICBwaGlfYXJnX21hcC5n ZXRfb3JfaW5zZXJ0IChhcmcpLnNhZmVfcHVzaCAoaSk7CisgICAgfQorCisg IC8qIERldGVybWluZSBlbGVtZW50IHdpdGggbWF4IG51bWJlciBvZiBvY2N1 cnJlbmNlcy4gICovCisgIG1heF9pbmQgPSAwOworICBtYXggPSBwaGlfYXJn X21hcC5nZXQgKGFyZ3NbMF0pLT5sZW5ndGggKCk7CisgIGFyZ3NfbGVuID0g YXJncy5sZW5ndGggKCk7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdzX2xlbjsg aSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgICBp ZiAoKGxlbiA9IHBoaV9hcmdfbWFwLmdldCAoYXJnc1tpXSktPmxlbmd0aCAo KSkgPiBtYXgpCisJeworCSAgbWF4X2luZCA9IGk7CisJICBtYXggPSBsZW47 CisJfQorICAgIH0KKworICAvKiBQdXQgZWxlbWVudCB3aXRoIG1heCBudW1i ZXIgb2Ygb2NjdXJlbmNlcyB0byB0aGUgZW5kIG9mIEFSR1MuICAqLworICBp ZiAobWF4X2luZCAhPSAwICYmIG1heF9pbmQgKzEgIT0gYXJnc19sZW4pCisg ICAgeworICAgICAgdHJlZSB0bXAgPSBhcmdzW2FyZ3NfbGVuIC0gMV07Cisg ICAgICBhcmdzW2FyZ3NfbGVuIC0gMV0gPSBhcmdzW21heF9pbmRdOworICAg ICAgYXJnc1ttYXhfaW5kXSA9IHRtcDsKICAgICB9CiAKLSAgbmV3X3N0bXQg PSBnaW1wbGVfYnVpbGRfYXNzaWduIChyZXMsIHJocyk7Ci0gIGdzaV9pbnNl cnRfYmVmb3JlIChnc2ksIG5ld19zdG10LCBHU0lfU0FNRV9TVE1UKTsKLSAg dXBkYXRlX3N0bXQgKG5ld19zdG10KTsKKyAgLyogSGFuZGxlIG9uZSBzcGVj aWFsIGNhc2Ugd2hlbiBudW1iZXIgb2YgYXJndW1lbnRzIHdpdGggZGlmZmVy ZW50IHZhbHVlcworICAgICBpcyBlcXVhbCAyIGFuZCBvbmUgYXJndW1lbnQg aGFzIHRoZSBvbmx5IG9jY3VycmVuY2UuIFN1Y2ggUEhJIGNhbiBiZQorICAg ICBoYW5kbGVkIGFzIGlmIHdvdWxkIGhhdmUgb25seSAyIGFyZ3VtZW50cy4g ICovCisgIGlmIChhcmdzX2xlbiA9PSAyICYmIHBoaV9hcmdfbWFwLmdldCAo YXJnc1swXSktPmxlbmd0aCAoKSA9PSAxKQorICAgIHsKKyAgICAgIHZlYzxp bnQ+ICppbmRleGVzOworICAgICAgaW5kZXhlcyA9IHBoaV9hcmdfbWFwLmdl dCAoYXJnc1swXSk7CisgICAgICBpbmRleDAgPSAoKmluZGV4ZXMpWzBdOwor ICAgICAgYXJnMCA9IGFyZ3NbMF07CisgICAgICBhcmcxID0gYXJnc1sxXTsK KyAgICAgIGUgPSBnaW1wbGVfcGhpX2FyZ19lZGdlIChwaGksIGluZGV4MCk7 CisgICAgICBjb25kID0gYmJfcHJlZGljYXRlIChlLT5zcmMpOworICAgICAg aWYgKFRSRUVfQ09ERSAoY29uZCkgPT0gVFJVVEhfTk9UX0VYUFIpCisJewor CSAgc3dhcCA9IHRydWU7CisJICBjb25kID0gVFJFRV9PUEVSQU5EIChjb25k LCAwKTsKKwl9CisgICAgICAvKiBHaW1wbGlmeSB0aGUgY29uZGl0aW9uIHRv IGEgdmFsaWQgY29uZC1leHByIGNvbmRpdG9uYWwgb3BlcmFuZC4gICovCisg ICAgICBjb25kID0gZm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpXzEgKGdzaSwg dW5zaGFyZV9leHByIChjb25kKSwKKwkJCQkJIGlzX2dpbXBsZV9jb25kZXhw ciwgTlVMTF9UUkVFLAorCQkJCQkgdHJ1ZSwgR1NJX1NBTUVfU1RNVCk7Cisg ICAgICBpZiAoIShpc19jb25kX3NjYWxhcl9yZWR1Y3Rpb24gKHBoaSwgJnJl ZHVjLCBhcmcwICwgYXJnMSwKKwkJCQkgICAgICAmb3AwLCAmb3AxLCB0cnVl KSkpCisJcmhzID0gZm9sZF9idWlsZF9jb25kX2V4cHIgKFRSRUVfVFlQRSAo cmVzKSwgdW5zaGFyZV9leHByIChjb25kKSwKKwkJCQkgICAgc3dhcD8gYXJn MSA6IGFyZzAsCisJCQkJICAgIHN3YXA/IGFyZzAgOiBhcmcxKTsKKyAgICAg IGVsc2UKKwkvKiBDb252ZXJ0IHJlZHVjdGlvbiBzdG10IGludG8gdmVjdG9y aXphYmxlIGZvcm0uICAqLworCXJocyA9IGNvbnZlcnRfc2NhbGFyX2NvbmRf cmVkdWN0aW9uIChyZWR1YywgZ3NpLCBjb25kLCBvcDAsIG9wMSwKKwkJCQkJ ICAgICBzd2FwKTsKKyAgICAgIG5ld19zdG10ID0gZ2ltcGxlX2J1aWxkX2Fz c2lnbiAocmVzLCByaHMpOworICAgICAgZ3NpX2luc2VydF9iZWZvcmUgKGdz aSwgbmV3X3N0bXQsIEdTSV9TQU1FX1NUTVQpOworICAgICAgdXBkYXRlX3N0 bXQgKG5ld19zdG10KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAv KiBDb21tb24gY2FzZS4gICovCisgICAgICB2ZWM8aW50PiAqaW5kZXhlczsK KyAgICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoZ2ltcGxlX3BoaV9yZXN1 bHQgKHBoaSkpOworICAgICAgdHJlZSBsaHM7CisgICAgICBhcmcxID0gYXJn c1sxXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzX2xlbjsgaSsrKQor CXsKKwkgIGFyZzAgPSBhcmdzW2ldOworCSAgaW5kZXhlcyA9IHBoaV9hcmdf bWFwLmdldCAoYXJnc1tpXSk7CisJICBpZiAoaSAhPSBhcmdzX2xlbiAtIDEp CisJICAgIGxocyA9IG1ha2VfdGVtcF9zc2FfbmFtZSAodHlwZSwgTlVMTCwg Il9pZmNfIik7CisJICBlbHNlCisJICAgIGxocyA9IHJlczsKKwkgIGNvbmQg PSBnZW5fcGhpX2FyZ19jb25kaXRpb24gKHBoaSwgaW5kZXhlcywgZ3NpKTsK KwkgIHJocyA9IGZvbGRfYnVpbGRfY29uZF9leHByICh0eXBlLCB1bnNoYXJl X2V4cHIgKGNvbmQpLAorCQkJCSAgICAgIGFyZzAsIGFyZzEpOworCSAgbmV3 X3N0bXQgPSBnaW1wbGVfYnVpbGRfYXNzaWduIChsaHMsIHJocyk7CisJICBn c2lfaW5zZXJ0X2JlZm9yZSAoZ3NpLCBuZXdfc3RtdCwgR1NJX1NBTUVfU1RN VCk7CisJICB1cGRhdGVfc3RtdCAobmV3X3N0bXQpOworCSAgYXJnMSA9IGxo czsKKwl9CisgICAgfQogCiAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxh Z3MgJiBUREZfREVUQUlMUykpCiAgICAgewotICAgICAgZnByaW50ZiAoZHVt cF9maWxlLCAibmV3IHBoaSByZXBsYWNlbWVudCBzdG10XG4iKTsKKyAgICAg IGZwcmludGYgKGR1bXBfZmlsZSwgIm5ldyBleHRlbmRlZCBwaGkgcmVwbGFj ZW1lbnQgc3RtdFxuIik7CiAgICAgICBwcmludF9naW1wbGVfc3RtdCAoZHVt cF9maWxlLCBuZXdfc3RtdCwgMCwgVERGX1NMSU0pOwogICAgIH0KIH0KQEAg LTE3MjgsMjggKzE4NjMsMjUgQEAgcHJlZGljYXRlX2FsbF9zY2FsYXJfcGhp cyAoc3RydWN0IGxvb3AgKmxvb3ApCiAgIGZvciAoaSA9IDE7IGkgPCBvcmln X2xvb3BfbnVtX25vZGVzOyBpKyspCiAgICAgewogICAgICAgZ3BoaSAqcGhp OwotICAgICAgdHJlZSBjb25kID0gTlVMTF9UUkVFOwogICAgICAgZ2ltcGxl X3N0bXRfaXRlcmF0b3IgZ3NpOwogICAgICAgZ3BoaV9pdGVyYXRvciBwaGlf Z3NpOwotICAgICAgYmFzaWNfYmxvY2sgdHJ1ZV9iYiA9IE5VTEw7CiAgICAg ICBiYiA9IGlmY19iYnNbaV07CiAKICAgICAgIGlmIChiYiA9PSBsb29wLT5o ZWFkZXIpCiAJY29udGludWU7CiAKKyAgICAgIGlmIChFREdFX0NPVU5UIChi Yi0+cHJlZHMpID09IDEpCisJY29udGludWU7CisKICAgICAgIHBoaV9nc2kg PSBnc2lfc3RhcnRfcGhpcyAoYmIpOwogICAgICAgaWYgKGdzaV9lbmRfcCAo cGhpX2dzaSkpCiAJY29udGludWU7CiAKLSAgICAgIC8qIEJCIGhhcyB0d28g cHJlZGVjZXNzb3JzLiAgVXNpbmcgcHJlZGVjZXNzb3IncyBhdXggZmllbGQs IHNldAotCSBhcHByb3ByaWF0ZSBjb25kaXRpb24gZm9yIHRoZSBQSEkgbm9k ZSByZXBsYWNlbWVudC4gICovCiAgICAgICBnc2kgPSBnc2lfYWZ0ZXJfbGFi ZWxzIChiYik7Ci0gICAgICB0cnVlX2JiID0gZmluZF9waGlfcmVwbGFjZW1l bnRfY29uZGl0aW9uIChiYiwgJmNvbmQsICZnc2kpOwotCiAgICAgICB3aGls ZSAoIWdzaV9lbmRfcCAocGhpX2dzaSkpCiAJewogCSAgcGhpID0gcGhpX2dz aS5waGkgKCk7Ci0JICBwcmVkaWNhdGVfc2NhbGFyX3BoaSAocGhpLCBjb25k LCB0cnVlX2JiLCAmZ3NpKTsKKwkgIHByZWRpY2F0ZV9zY2FsYXJfcGhpIChw aGksICZnc2kpOwogCSAgcmVsZWFzZV9waGlfbm9kZSAocGhpKTsKIAkgIGdz aV9uZXh0ICgmcGhpX2dzaSk7CiAJfQpAQCAtMTc3MCw3ICsxOTAyLDggQEAg aW5zZXJ0X2dpbXBsaWZpZWRfcHJlZGljYXRlcyAobG9vcF9wIGxvb3AsIGJv b2wgYW55X21hc2tfbG9hZF9zdG9yZSkKICAgICB7CiAgICAgICBiYXNpY19i bG9jayBiYiA9IGlmY19iYnNbaV07CiAgICAgICBnaW1wbGVfc2VxIHN0bXRz OwotCisgICAgICBpZiAoIWlzX3ByZWRpY2F0ZWQgKGJiKSkKKwlnY2NfYXNz ZXJ0IChiYl9wcmVkaWNhdGVfZ2ltcGxpZmllZF9zdG10cyAoYmIpID09IE5V TEwpOwogICAgICAgaWYgKCFpc19wcmVkaWNhdGVkIChiYikpCiAJewogCSAg LyogRG8gbm90IGluc2VydCBzdGF0ZW1lbnRzIGZvciBhIGJhc2ljIGJsb2Nr IHRoYXQgaXMgbm90CkBAIC0yMTk0LDYgKzIzMjcsNTQgQEAgdmVyc2lvbl9s b29wX2Zvcl9pZl9jb252ZXJzaW9uIChzdHJ1Y3QgbG9vcCAqbG9vcCkKICAg cmV0dXJuIHRydWU7CiB9CiAKKy8qIFBlcmZvcm1zIHNwbGl0dGluZyBvZiBj cml0aWNhbCBlZGdlcyBpZiBhZ2dyZXNzaXZlX2lmX2NvbnYgaXMgdHJ1ZS4K KyAgIFJldHVybnMgZmFsc2UgaWYgbG9vcCB3b24ndCBiZSBpZiBjb252ZXJ0 ZWQgYW5kIHRydWUgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2wKK2lm Y3Z0X3NwbGl0X2NyaXRpY2FsX2VkZ2VzIChzdHJ1Y3QgbG9vcCAqbG9vcCkK K3sKKyAgYmFzaWNfYmxvY2sgKmJvZHk7CisgIGJhc2ljX2Jsb2NrIGJiOwor ICB1bnNpZ25lZCBpbnQgbnVtID0gbG9vcC0+bnVtX25vZGVzOworICB1bnNp Z25lZCBpbnQgaTsKKyAgZ2ltcGxlIHN0bXQ7CisgIGVkZ2UgZTsKKworICBp ZiAobnVtIDw9IDIpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobG9vcC0+ aW5uZXIpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIXNpbmdsZV9leGl0 IChsb29wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9keSA9IGdldF9s b29wX2JvZHkgKGxvb3ApOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKysp CisgICAgeworICAgICAgYmIgPSBib2R5W2ldOworICAgICAgaWYgKGJiID09 IGxvb3AtPmxhdGNoCisJICB8fCBiYl93aXRoX2V4aXRfZWRnZV9wIChsb29w LCBiYikpCisJY29udGludWU7CisgICAgICBzdG10ID0gbGFzdF9zdG10IChi Yik7CisgICAgICAvKiBTa2lwIGJhc2ljIGJsb2NrcyBub3QgZW5kaW5nIHdp dGggY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgIGlmICghKHN0bXQg JiYgZ2ltcGxlX2NvZGUgKHN0bXQpID09IEdJTVBMRV9DT05EKSkKKwljb250 aW51ZTsKKyAgICAgIGlmIChFREdFX0NPVU5UIChFREdFX1NVQ0MgKGJiLCAw KS0+ZGVzdC0+cHJlZHMpID4gMSkKKwl7CisJICBlID0gRURHRV9TVUNDIChi YiwgMCk7CisJICBpZiAoZS0+ZGVzdC0+bG9vcF9mYXRoZXIgPT0gZS0+c3Jj LT5sb29wX2ZhdGhlcikKKwkgICAgc3BsaXRfZWRnZSAoZSk7CisJfQorICAg ICAgaWYgKEVER0VfQ09VTlQgKEVER0VfU1VDQyAoYmIsIDEpLT5kZXN0LT5w cmVkcykgPiAxKQorCXsKKwkgIGUgPSBFREdFX1NVQ0MgKGJiLCAxKTsKKwkg IGlmIChlLT5kZXN0LT5sb29wX2ZhdGhlciA9PSBlLT5zcmMtPmxvb3BfZmF0 aGVyKQorCSAgICBzcGxpdF9lZGdlIChlKTsKKwl9CisgICAgfQorICBmcmVl IChib2R5KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIC8qIElmLWNvbnZlcnQg TE9PUCB3aGVuIGl0IGlzIGxlZ2FsLiAgRm9yIHRoZSBtb21lbnQgdGhpcyBw YXNzIGhhcyBubwogICAgcHJvZml0YWJpbGl0eSBhbmFseXNpcy4gIFJldHVy bnMgbm9uLXplcm8gdG9kbyBmbGFncyB3aGVuIHNvbWV0aGluZwogICAgY2hh bmdlZC4gICovCkBAIC0yMjA1LDggKzIzODYsMTkgQEAgdHJlZV9pZl9jb252 ZXJzaW9uIChzdHJ1Y3QgbG9vcCAqbG9vcCkKICAgaWZjX2JicyA9IE5VTEw7 CiAgIGJvb2wgYW55X21hc2tfbG9hZF9zdG9yZSA9IGZhbHNlOwogCi0gIC8q IFRlbXBvcmFyeSBzZXQgdXAgdGhpcyBmbGFnIHRvIGZhbHNlLiAgKi8KLSAg YWdncmVzc2l2ZV9pZl9jb252ID0gZmFsc2U7CisgIC8qIFNldC11cCBhZ2dy ZXNzaXZlIGlmLWNvbnZlcnNpb24gZm9yIGxvb3BzIG1hcmtlZCB3aXRoIHNp bWQgcHJhZ21hLiAgKi8KKyAgYWdncmVzc2l2ZV9pZl9jb252ID0gbG9vcC0+ Zm9yY2VfdmVjdG9yaXplOworICAvKiBDaGVjayBlaXRoZXIgb3V0ZXIgbG9v cCB3YXMgbWFya2VkIHdpdGggc2ltZCBwcmFnbWEuICAqLworICBpZiAoIWFn Z3Jlc3NpdmVfaWZfY29udikKKyAgICB7CisgICAgICBzdHJ1Y3QgbG9vcCAq b3V0ZXJfbG9vcCA9IGxvb3Bfb3V0ZXIgKGxvb3ApOworICAgICAgaWYgKG91 dGVyX2xvb3AgJiYgb3V0ZXJfbG9vcC0+Zm9yY2VfdmVjdG9yaXplKQorCWFn Z3Jlc3NpdmVfaWZfY29udiA9IHRydWU7CisgICAgfQorCisgIGlmIChhZ2dy ZXNzaXZlX2lmX2NvbnYpCisgICAgaWYgKCFpZmN2dF9zcGxpdF9jcml0aWNh bF9lZGdlcyAobG9vcCkpCisgICAgICBnb3RvIGNsZWFudXA7CiAKICAgaWYg KCFpZl9jb252ZXJ0aWJsZV9sb29wX3AgKGxvb3AsICZhbnlfbWFza19sb2Fk X3N0b3JlKQogICAgICAgfHwgIWRiZ19jbnQgKGlmX2NvbnZlcnNpb25fdHJl ZSkpCkBAIC0yMjQzLDExICsyNDM1LDYgQEAgdHJlZV9pZl9jb252ZXJzaW9u IChzdHJ1Y3QgbG9vcCAqbG9vcCkKIAl7CiAJICBiYXNpY19ibG9jayBiYiA9 IGlmY19iYnNbaV07CiAJICBmcmVlX2JiX3ByZWRpY2F0ZSAoYmIpOwotCSAg aWYgKEVER0VfQ09VTlQgKGJiLT5zdWNjcykgPT0gMikKLQkgICAgewotCSAg ICAgIEVER0VfU1VDQyAoYmIsIDApLT5hdXggPSBOVUxMOwotCSAgICAgIEVE R0VfU1VDQyAoYmIsIDEpLT5hdXggPSBOVUxMOwotCSAgICB9CiAJfQogCiAg ICAgICBmcmVlIChpZmNfYmJzKTsK --001a1137eac49ff3c8050a56d44a--