From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 100519 invoked by alias); 7 Oct 2015 15:26:44 -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 100505 invoked by uid 89); 7 Oct 2015 15:26:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ob0-f169.google.com Received: from mail-ob0-f169.google.com (HELO mail-ob0-f169.google.com) (209.85.214.169) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 07 Oct 2015 15:26:37 +0000 Received: by obbbh8 with SMTP id bh8so16000389obb.0 for ; Wed, 07 Oct 2015 08:26:35 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.182.22.229 with SMTP id h5mr958896obf.26.1444231594934; Wed, 07 Oct 2015 08:26:34 -0700 (PDT) Received: by 10.202.191.6 with HTTP; Wed, 7 Oct 2015 08:26:34 -0700 (PDT) In-Reply-To: References: Date: Wed, 07 Oct 2015 15:26:00 -0000 Message-ID: Subject: Re: [PATCH] Unswitching outer loops. From: Yuri Rumyantsev To: Richard Biener Cc: gcc-patches , Igor Zamyatin Content-Type: multipart/mixed; boundary=001a11c2ef103174f40521855f01 X-SW-Source: 2015-10/txt/msg00720.txt.bz2 --001a11c2ef103174f40521855f01 Content-Type: text/plain; charset=UTF-8 Content-length: 22457 Richard, I noticed that 'gimple' type was changed and send you updated patch. Thanks. Yuri. 2015-10-07 12:53 GMT+03:00 Yuri Rumyantsev : > Richard, > > I've fixed adding virtual phi argument and add check on irreducible basic block. > New patch is attached. > > I checked it for bootstrap and regression testing, no new failures. > > ChangeLog: > 2015-10-07 Yuri Rumyantsev > > * tree-ssa-loop-unswitch.c: Include "gimple-iterator.h" and > "cfghooks.h", add prototypes for introduced new functions. > (tree_ssa_unswitch_loops): Use from innermost loop iterator, move all > checks on ability of loop unswitching to tree_unswitch_single_loop; > invoke tree_unswitch_single_loop or tree_unswitch_outer_loop depending > on innermost loop check. > (tree_unswitch_single_loop): Add all required checks on ability of > loop unswitching under zero recursive level guard. > (tree_unswitch_outer_loop): New function. > (find_loop_guard): Likewise. > (empty_bb_without_guard_p): Likewise. > (used_outside_loop_p): Likewise. > (get_vop_from_header): Likewise. > (hoist_guard): Likewise. > (check_exit_phi): Likewise. > > gcc/testsuite/ChangeLog: > * gcc.dg/loop-unswitch-2.c: New test. > * gcc.dg/loop-unswitch-3.c: Likewise. > * gcc.dg/loop-unswitch-4.c: Likewise. > > > 2015-10-06 15:21 GMT+03:00 Richard Biener : >> On Tue, Oct 6, 2015 at 1:41 PM, Yuri Rumyantsev wrote: >>> Richard, >>> >>> Here is updated patch which reflects almost all your remarks: >>> 1. Use ordinary get_loop_body. >>> 2. Delete useless asserts. >>> 3. Use check on iterated loop instead of finite_loop_p. >>> 4. Do not update CFG by adjusting the CONDs condition to always true/false. >>> 5. Add couple tests. >> >> + /* Add NEW_ADGE argument for all phi in post-header block. */ >> + bb = exit->dest; >> + for (gphi_iterator gsi = gsi_start_phis (bb); >> + !gsi_end_p (gsi); gsi_next (&gsi)) >> + { >> + gphi *phi = gsi.phi (); >> + /* edge_iterator ei; */ >> + tree arg; >> + if (virtual_operand_p (gimple_phi_result (phi))) >> + { >> + arg = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop)); >> + add_phi_arg (phi, arg, new_edge, UNKNOWN_LOCATION); >> >> now I know what confused me - here you are looking at a loop exit PHI >> but querying with the preheader edge index. I think you need to walk >> the loop header PHIs to find the PHI for the virtual operand and use that >> to get the PHI arg from? >> >> The side-effect / used-outside code is still the same. What matters >> is side-effects outside of the loop-header protected code region, not >> blocks excluding the inner loop. Say, >> >> for (;;) >> { >> if (invariant-guard) >> { >> printf ("Blah"); >> for (;;) >> ; >> } >> } >> >> would still ok to be unswitched. So instead of >> >> + if (body[i]->loop_father != loop) >> + continue; >> >> it would be >> >> if (dominated_by_p (CDI_DOMINATORS, body[i], header) >> && !dominated_by_p (CDI_DOMINATORS, body[i], fe->dest)) >> >> with the obvious improvement to the patch to not only consider header checks >> in the outer loop header but in the pre-header block of the inner loop. >> >> And I still think you should walk the exit PHIs args to see whether they >> are defined in the non-guarded region of the outer loop instead of walking >> all uses of all defs. >> >> Note that I think you miss endless loops as side-effects if that endless >> loop occurs through a irreducible region (thus not reflected in the >> loop tree). Thus you should reject BB_IRREDUCIBLE_LOOP blocks >> in the non-guarded region as well. >> >> It seems to me that protecting adjacent loops with a single guard is >> also eligible for hoisting thus the restriction on loop->inner->next >> should become a restriction on no loops (or irreducible regions) >> in the non-guarded region. >> >> Most things can be improved as followup, but at least the >> virtual PHI arg thing needs to be sorted out. >> >> Thanks, >> Richard. >> >> >>> ChangeLog: >>> 2015-10-06 Yuri Rumyantsev >>> >>> * tree-ssa-loop-unswitch.c: Include "gimple-iterator.h" and >>> "cfghooks.h", add prototypes for introduced new functions. >>> (tree_ssa_unswitch_loops): Use from innermost loop iterator, move all >>> checks on ability of loop unswitching to tree_unswitch_single_loop; >>> invoke tree_unswitch_single_loop or tree_unswitch_outer_loop depending >>> on innermost loop check. >>> (tree_unswitch_single_loop): Add all required checks on ability of >>> loop unswitching under zero recursive level guard. >>> (tree_unswitch_outer_loop): New function. >>> (find_loop_guard): Likewise. >>> (empty_bb_without_guard_p): Likewise. >>> (used_outside_loop_p): Likewise. >>> (hoist_guard): Likewise. >>> (check_exit_phi): Likewise. >>> >>> gcc/testsuite/ChangeLog: >>> * gcc.dg/loop-unswitch-2.c: New test. >>> * gcc.dg/loop-unswitch-3.c: Likewise. >>> * gcc.dg/loop-unswitch-4.c: Likewise. >>> >>> 2015-10-06 10:59 GMT+03:00 Richard Biener : >>>> On Mon, Oct 5, 2015 at 3:13 PM, Yuri Rumyantsev wrote: >>>>> Thanks Richard. >>>>> I'd like to answer on your last comment related to using of exit edge >>>>> argument for edge that skips loop. >>>>> Let's consider the following test-case: >>>>> >>>>> #include >>>>> #define N 32 >>>>> float *foo(int ustride, int size, float *src) >>>>> { >>>>> float *buffer, *p; >>>>> int i, k; >>>>> >>>>> if (!src) >>>>> return NULL; >>>>> >>>>> buffer = (float *) malloc(N * size * sizeof(float)); >>>>> >>>>> if(buffer) >>>>> for(i=0, p=buffer; i>>>> for(k=0; k>>>> *p++ = src[k]; >>>>> >>>>> return buffer; >>>>> } >>>>> >>>>> Before adding new edge we have in post-header bb: >>>>> : >>>>> # _6 = PHI <0B(8), buffer_20(16)> >>>>> return _6; >>>>> >>>>> It is clear that we must preserve function semantic and transform it to >>>>> _6 = PHI <0B(12), buffer_19(9), buffer_19(4)> >>>> >>>> Ah, yeah. I was confusing the loop exit of the inner vs. the outer loop. >>>> >>>> Richard. >>>> >>>>> >>>>> 2015-10-05 13:57 GMT+03:00 Richard Biener : >>>>>> On Wed, Sep 30, 2015 at 12:46 PM, Yuri Rumyantsev wrote: >>>>>>> Hi Richard, >>>>>>> >>>>>>> I re-designed outer loop unswitching using basic idea of 23855 patch - >>>>>>> hoist invariant guard if loop is empty without guard. Note that this >>>>>>> was added to loop unswitching pass with simple modifications - using >>>>>>> another loop iterator etc. >>>>>>> >>>>>>> Bootstrap and regression testing did not show any new failures. >>>>>>> What is your opinion? >>>>>> >>>>>> Overall it looks good. Some comments below - a few more testcases would >>>>>> be nice as well. >>>>>> >>>>>> + /* Loop must not be infinite. */ >>>>>> + if (!finite_loop_p (loop)) >>>>>> + return false; >>>>>> >>>>>> why's that? >>>>>> >>>>>> + body = get_loop_body_in_dom_order (loop); >>>>>> + for (i = 0; i < loop->num_nodes; i++) >>>>>> + { >>>>>> + if (body[i]->loop_father != loop) >>>>>> + continue; >>>>>> + if (!empty_bb_without_guard_p (loop, body[i])) >>>>>> >>>>>> I wonder if there is a better way to iterate over the interesting >>>>>> blocks and PHIs >>>>>> we need to check for side-effects (and thus we maybe can avoid gathering >>>>>> the loop in DOM order). >>>>>> >>>>>> + FOR_EACH_SSA_TREE_OPERAND (name, stmt, op_iter, SSA_OP_DEF) >>>>>> + { >>>>>> + if (may_be_used_outside >>>>>> >>>>>> may_be_used_outside can be hoisted above the loop. I wonder if we can take >>>>>> advantage of loop-closed SSA form here (and the fact we have a single exit >>>>>> from the loop). Iterating over exit dest PHIs and determining whether the >>>>>> exit edge DEF is inside the loop part it may not be should be enough. >>>>>> >>>>>> + gcc_assert (single_succ_p (pre_header)); >>>>>> >>>>>> that should be always true. >>>>>> >>>>>> + gsi_remove (&gsi, false); >>>>>> + bb = guard->dest; >>>>>> + remove_edge (guard); >>>>>> + /* Update dominance for destination of GUARD. */ >>>>>> + if (EDGE_COUNT (bb->preds) == 0) >>>>>> + { >>>>>> + basic_block s_bb; >>>>>> + gcc_assert (single_succ_p (bb)); >>>>>> + s_bb = single_succ (bb); >>>>>> + delete_basic_block (bb); >>>>>> + if (single_pred_p (s_bb)) >>>>>> + set_immediate_dominator (CDI_DOMINATORS, s_bb, single_pred (s_bb)); >>>>>> >>>>>> all this massaging should be simplified by leaving it to CFG cleanup by >>>>>> simply adjusting the CONDs condition to always true/false. There is >>>>>> gimple_cond_make_{true,false} () for this (would be nice to have a variant >>>>>> taking a bool). >>>>>> >>>>>> + new_edge = make_edge (pre_header, exit->dest, flags); >>>>>> + if (fix_dom_of_exit) >>>>>> + set_immediate_dominator (CDI_DOMINATORS, exit->dest, pre_header); >>>>>> + update_stmt (gsi_stmt (gsi)); >>>>>> >>>>>> the update_stmt should be not necessary, it's done by gsi_insert_after already. >>>>>> >>>>>> + /* Add NEW_ADGE argument for all phi in post-header block. */ >>>>>> + bb = exit->dest; >>>>>> + for (gphi_iterator gsi = gsi_start_phis (bb); >>>>>> + !gsi_end_p (gsi); gsi_next (&gsi)) >>>>>> + { >>>>>> + gphi *phi = gsi.phi (); >>>>>> + /* edge_iterator ei; */ >>>>>> + tree arg; >>>>>> + if (virtual_operand_p (gimple_phi_result (phi))) >>>>>> + { >>>>>> + arg = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop)); >>>>>> + add_phi_arg (phi, arg, new_edge, UNKNOWN_LOCATION); >>>>>> + } >>>>>> + else >>>>>> + { >>>>>> + /* Use exit edge argument. */ >>>>>> + arg = PHI_ARG_DEF_FROM_EDGE (phi, exit); >>>>>> + add_phi_arg (phi, arg, new_edge, UNKNOWN_LOCATION); >>>>>> >>>>>> Hum. How is it ok to use the exit edge argument for the edge that skips >>>>>> the loop? Why can't you always use the pre-header edge value? >>>>>> That is, if we have >>>>>> >>>>>> for(i=0;i>>>>> { >>>>>> if (n > 0) >>>>>> { >>>>>> for (;;) >>>>>> { >>>>>> } >>>>>> } >>>>>> } >>>>>> ... = i; >>>>>> >>>>>> then i is used after the loop and the correct value to use if >>>>>> n > 0 is false is '0'. Maybe this way we can also relax >>>>>> what check_exit_phi does? IMHO the only restriction is >>>>>> if sth defined inside the loop before the header check for >>>>>> the inner loop is used after the loop. >>>>>> >>>>>> Thanks, >>>>>> Richard. >>>>>> >>>>>>> Thanks. >>>>>>> >>>>>>> ChangeLog: >>>>>>> 2015-09-30 Yuri Rumyantsev >>>>>>> >>>>>>> * tree-ssa-loop-unswitch.c: Include "gimple-iterator.h" and >>>>>>> "cfghooks.h", add prototypes for introduced new functions. >>>>>>> (tree_ssa_unswitch_loops): Use from innermost loop iterator, move all >>>>>>> checks on ability of loop unswitching to tree_unswitch_single_loop; >>>>>>> invoke tree_unswitch_single_loop or tree_unswitch_outer_loop depending >>>>>>> on innermost loop check. >>>>>>> (tree_unswitch_single_loop): Add all required checks on ability of >>>>>>> loop unswitching under zero recursive level guard. >>>>>>> (tree_unswitch_outer_loop): New function. >>>>>>> (find_loop_guard): Likewise. >>>>>>> (empty_bb_without_guard_p): Likewise. >>>>>>> (used_outside_loop_p): Likewise. >>>>>>> (hoist_guard): Likewise. >>>>>>> (check_exit_phi): Likewise. >>>>>>> >>>>>>> gcc/testsuite/ChangeLog: >>>>>>> * gcc.dg/loop-unswitch-2.c: New test. >>>>>>> >>>>>>> 2015-09-16 11:26 GMT+03:00 Richard Biener : >>>>>>>> Yeah, as said, the patch wasn't fully ready and it also felt odd to do >>>>>>>> this hoisting in loop header copying. Integrating it >>>>>>>> with LIM would be a better fit eventually. >>>>>>>> >>>>>>>> Note that we did agree to go forward with your original patch just >>>>>>>> making it more "generically" perform outer loop >>>>>>>> unswitching. Did you explore that idea further? >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Tue, Sep 15, 2015 at 6:00 PM, Yuri Rumyantsev wrote: >>>>>>>>> Thanks Richard. >>>>>>>>> >>>>>>>>> I found one more issue that could not be fixed simply. In 23855 you >>>>>>>>> consider the following test-case: >>>>>>>>> void foo(int *ie, int *je, double *x) >>>>>>>>> { >>>>>>>>> int i, j; >>>>>>>>> for (j=0; j<*je; ++j) >>>>>>>>> for (i=0; i<*ie; ++i) >>>>>>>>> x[i+j] = 0.0; >>>>>>>>> } >>>>>>>>> and proposed to hoist up a check on *ie out of loop. It requires >>>>>>>>> memref alias analysis since in general x and ie can alias (if their >>>>>>>>> types are compatible - int *ie & int * x). Such analysis is performed >>>>>>>>> by pre or lim passes. Without such analysis we can not hoist a test on >>>>>>>>> non-zero for *ie out of loop using 238565 patch. >>>>>>>>> The second concern is that proposed copy header algorithm changes >>>>>>>>> loop structure significantly and it is not accepted by vectorizer >>>>>>>>> since latch is not empty (such transformation assumes loop peeling for >>>>>>>>> one iteration. So I can propose to implement simple guard hoisting >>>>>>>>> without copying header and tail blocks (if it is possible). >>>>>>>>> >>>>>>>>> I will appreciate you for any advice or help since without such >>>>>>>>> hoisting we are not able to perform outer loop vectorization for >>>>>>>>> important benchmark. >>>>>>>>> and >>>>>>>>> >>>>>>>>> 2015-09-15 14:22 GMT+03:00 Richard Biener : >>>>>>>>>> On Thu, Sep 3, 2015 at 6:32 PM, Yuri Rumyantsev wrote: >>>>>>>>>>> Hi Richard, >>>>>>>>>>> >>>>>>>>>>> I started learning, tuning and debugging patch proposed in 23855 and >>>>>>>>>>> discovered thta it does not work properly. >>>>>>>>>>> So I wonder is it tested patch and it should work? >>>>>>>>>> >>>>>>>>>> I don't remember, but as it wasn't committed it certainly wasn't ready. >>>>>>>>>> >>>>>>>>>>> Should it accept for hoisting the following loop nest >>>>>>>>>>> for (i=0; i>>>>>>>>>> s = 0; >>>>>>>>>>> for (j=0; j>>>>>>>>>> s += a[i] * b[j]; >>>>>>>>>>> c[i] = s; >>>>>>>>>>> } >>>>>>>>>>> Note that i-loop will nit be empty if m is equal to 0. >>>>>>>>>> >>>>>>>>>> if m is equal to 0 then we still have the c[i] = s store, no? Of course >>>>>>>>>> we could unswitch the outer loop on m == 0 but simple hoisting wouldn't work. >>>>>>>>>> >>>>>>>>>> Richard. >>>>>>>>>> >>>>>>>>>>> 2015-08-03 10:27 GMT+03:00 Richard Biener : >>>>>>>>>>>> On Fri, Jul 31, 2015 at 1:17 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>> Hi Richard, >>>>>>>>>>>>> >>>>>>>>>>>>> I learned your updated patch for 23825 and it is more general in >>>>>>>>>>>>> comparison with my. >>>>>>>>>>>>> I'd like to propose you a compromise - let's consider my patch only >>>>>>>>>>>>> for force-vectorize outer loop only to allow outer-loop >>>>>>>>>>>>> vecctorization. >>>>>>>>>>>> >>>>>>>>>>>> I don't see why we should special-case that if the approach in 23825 >>>>>>>>>>>> is sensible. >>>>>>>>>>>> >>>>>>>>>>>>> Note that your approach will not hoist invariant >>>>>>>>>>>>> guards if loops contains something else except for inner-loop, i.e. it >>>>>>>>>>>>> won't be empty for taken branch. >>>>>>>>>>>> >>>>>>>>>>>> Yes, it does not perform unswitching but guard hoisting. Note that this >>>>>>>>>>>> is originally Zdenek Dvoraks patch. >>>>>>>>>>>> >>>>>>>>>>>>> I also would like to answer on your last question - CFG cleanup is >>>>>>>>>>>>> invoked to perform deletion of single-argument phi nodes from tail >>>>>>>>>>>>> block through substitution - such phi's prevent outer-loop >>>>>>>>>>>>> vectorization. But it is clear that such transformation can be done >>>>>>>>>>>>> other pass. >>>>>>>>>>>> >>>>>>>>>>>> Hmm, I wonder why the copy_prop pass after unswitching does not >>>>>>>>>>>> get rid of them? >>>>>>>>>>>> >>>>>>>>>>>>> What is your opinion? >>>>>>>>>>>> >>>>>>>>>>>> My opinion is that if we want to enhance unswitching to catch this >>>>>>>>>>>> (or similar) cases then we should make it a lot more general than >>>>>>>>>>>> your pattern-matching approach. I see nothing that should prevent >>>>>>>>>>>> us from considering unswitching non-innermost loops in general. >>>>>>>>>>>> It should be only a cost consideration to not do non-innermost loop >>>>>>>>>>>> unswitching (in addition to maybe a --param specifying the maximum >>>>>>>>>>>> depth of a loop nest to unswitch). >>>>>>>>>>>> >>>>>>>>>>>> So my first thought when seeing your patch still holds - the patch >>>>>>>>>>>> looks very much too specific. >>>>>>>>>>>> >>>>>>>>>>>> Richard. >>>>>>>>>>>> >>>>>>>>>>>>> Yuri. >>>>>>>>>>>>> >>>>>>>>>>>>> 2015-07-28 13:50 GMT+03:00 Richard Biener : >>>>>>>>>>>>>> On Thu, Jul 23, 2015 at 4:45 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>>>> Hi Richard, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I checked that both test-cases from 23855 are sucessfully unswitched >>>>>>>>>>>>>>> by proposed patch. I understand that it does not catch deeper loop >>>>>>>>>>>>>>> nest as >>>>>>>>>>>>>>> for (i=0; i<10; i++) >>>>>>>>>>>>>>> for (j=0;j>>>>>>>>>>>>>> for (k=0;k<20;k++) >>>>>>>>>>>>>>> ... >>>>>>>>>>>>>>> but duplication of middle-loop does not look reasonable. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Here is dump for your second test-case: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> void foo(int *ie, int *je, double *x) >>>>>>>>>>>>>>> { >>>>>>>>>>>>>>> int i, j; >>>>>>>>>>>>>>> for (j=0; j<*je; ++j) >>>>>>>>>>>>>>> for (i=0; i<*ie; ++i) >>>>>>>>>>>>>>> x[i+j] = 0.0; >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> grep -i unswitch t6.c.119t.unswitch >>>>>>>>>>>>>>> ;; Unswitching outer loop >>>>>>>>>>>>>> >>>>>>>>>>>>>> I was saying that why go with a limited approach when a patch (in >>>>>>>>>>>>>> unknown state...) >>>>>>>>>>>>>> is available that does it more generally? Also unswitching is quite >>>>>>>>>>>>>> expensive compared >>>>>>>>>>>>>> to "moving" the invariant condition. >>>>>>>>>>>>>> >>>>>>>>>>>>>> In your patch: >>>>>>>>>>>>>> >>>>>>>>>>>>>> + if (!nloop->force_vectorize) >>>>>>>>>>>>>> + nloop->force_vectorize = true; >>>>>>>>>>>>>> + if (loop->safelen != 0) >>>>>>>>>>>>>> + nloop->safelen = loop->safelen; >>>>>>>>>>>>>> >>>>>>>>>>>>>> I see no guard on force_vectorize so = true looks bogus here. Please just use >>>>>>>>>>>>>> copy_loop_info. >>>>>>>>>>>>>> >>>>>>>>>>>>>> + if (integer_nonzerop (cond_new)) >>>>>>>>>>>>>> + gimple_cond_set_condition_from_tree (cond_stmt, boolean_true_node); >>>>>>>>>>>>>> + else if (integer_zerop (cond_new)) >>>>>>>>>>>>>> + gimple_cond_set_condition_from_tree (cond_stmt, boolean_false_node); >>>>>>>>>>>>>> >>>>>>>>>>>>>> gimple_cond_make_true/false (cond_stmt); >>>>>>>>>>>>>> >>>>>>>>>>>>>> btw, seems odd that we have to recompute which loop is the true / false variant >>>>>>>>>>>>>> when we just fed a guard condition to loop_version. Can't we statically >>>>>>>>>>>>>> determine whether loop or nloop has the in-loop condition true or false? >>>>>>>>>>>>>> >>>>>>>>>>>>>> + /* Clean-up cfg to remove useless one-argument phi in exit block of >>>>>>>>>>>>>> + outer-loop. */ >>>>>>>>>>>>>> + cleanup_tree_cfg (); >>>>>>>>>>>>>> >>>>>>>>>>>>>> I know unswitching is already O(number-of-unswitched-loops * size-of-function) >>>>>>>>>>>>>> because it updates SSA form after each individual unswitching (and it does that >>>>>>>>>>>>>> because it invokes itself recursively on unswitched loops). But do you really >>>>>>>>>>>>>> need to invoke CFG cleanup here? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Yuri. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2015-07-14 14:06 GMT+03:00 Richard Biener : >>>>>>>>>>>>>>>> On Fri, Jul 10, 2015 at 12:02 PM, Yuri Rumyantsev wrote: >>>>>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Here is presented simple transformation which tries to hoist out of >>>>>>>>>>>>>>>>> outer-loop a check on zero trip count for inner-loop. This is very >>>>>>>>>>>>>>>>> restricted transformation since it accepts outer-loops with very >>>>>>>>>>>>>>>>> simple cfg, as for example: >>>>>>>>>>>>>>>>> acc = 0; >>>>>>>>>>>>>>>>> for (i = 1; i <= m; i++) { >>>>>>>>>>>>>>>>> for (j = 0; j < n; j++) >>>>>>>>>>>>>>>>> if (l[j] == i) { v[j] = acc; acc++; }; >>>>>>>>>>>>>>>>> acc <<= 1; >>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Note that degenerative outer loop (without inner loop) will be >>>>>>>>>>>>>>>>> completely deleted as dead code. >>>>>>>>>>>>>>>>> The main goal of this transformation was to convert outer-loop to form >>>>>>>>>>>>>>>>> accepted by outer-loop vectorization (such test-case is also included >>>>>>>>>>>>>>>>> to patch). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Bootstrap and regression testing did not show any new failures. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Is it OK for trunk? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I think this is >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=23855 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> as well. It has a patch adding a invariant loop guard hoisting >>>>>>>>>>>>>>>> phase to loop-header copying. Yeah, it needs updating to >>>>>>>>>>>>>>>> trunk again I suppose. It's always non-stage1 when I come >>>>>>>>>>>>>>>> back to that patch. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Your patch seems to be very specific and only handles outer >>>>>>>>>>>>>>>> loops of innermost loops. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> ChangeLog: >>>>>>>>>>>>>>>>> 2015-07-10 Yuri Rumyantsev >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> * tree-ssa-loop-unswitch.c: Include "tree-cfgcleanup.h" and >>>>>>>>>>>>>>>>> "gimple-iterator.h", add prototype for tree_unswitch_outer_loop. >>>>>>>>>>>>>>>>> (tree_ssa_unswitch_loops): Add invoke of tree_unswitch_outer_loop. >>>>>>>>>>>>>>>>> (tree_unswitch_outer_loop): New function. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> gcc/testsuite/ChangeLog: >>>>>>>>>>>>>>>>> * gcc.dg/tree-ssa/unswitch-outer-loop-1.c: New test. >>>>>>>>>>>>>>>>> * gcc.dg/vect/vect-outer-simd-3.c: New test. --001a11c2ef103174f40521855f01 Content-Type: application/octet-stream; name="patch.fixed" Content-Disposition: attachment; filename="patch.fixed" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ifgy6z1j1 Content-length: 23555 ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0 Y2gtMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC0y LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViZjYw OAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xv b3AtdW5zd2l0Y2gtMi5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnVuc3dpdGNo LWxvb3BzIC1mZHVtcC10cmVlLXVuc3dpdGNoLWRldGFpbHMiIH0gKi8KKwor dm9pZCBmb28gKGZsb2F0ICoqYSwgZmxvYXQgKipiLCBmbG9hdCAqYywgaW50 IG4sIGludCBtLCBpbnQgbCkKK3sKKyAgaW50IGksaixrOworICBmbG9hdCBz OworICBmb3IgKGk9MDsgaTxsOyBpKyspCisgICAgZm9yIChqPTA7IGo8bjsg aisrKQorICAgICAgZm9yIChrPTA7IGs8bTsgaysrKQorCWNbaV0gKz0gYVtp XVtrXSAqIGJba11bal07Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRy ZWUtZHVtcC10aW1lcyAiZ3VhcmQgaG9pc3RlZCIgMiAidW5zd2l0Y2giIH0g fSAqLworCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29w LXVuc3dpdGNoLTMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5z d2l0Y2gtMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmUzNTUyODYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9sb29wLXVuc3dpdGNoLTMuYwpAQCAtMCwwICsxLDI2IEBACisvKiB7 IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZ1 bnN3aXRjaC1sb29wcyAtZmR1bXAtdHJlZS11bnN3aXRjaC1kZXRhaWxzIiB9 ICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgTiAzMgorZmxv YXQgKmZvbyhpbnQgdXN0cmlkZSwgaW50IHNpemUsIGZsb2F0ICpzcmMpCit7 CisgICBmbG9hdCAqYnVmZmVyLCAqcDsKKyAgIGludCBpLCBrOworCisgICBp ZiAoIXNyYykKKyAgICByZXR1cm4gTlVMTDsKKworICAgYnVmZmVyID0gKGZs b2F0ICopIG1hbGxvYyhOICogc2l6ZSAqIHNpemVvZihmbG9hdCkpOworCisg ICBpZihidWZmZXIpCisgICAgICBmb3IoaT0wLCBwPWJ1ZmZlcjsgaTxOOyBp KyssIHNyYys9dXN0cmlkZSkKKwlmb3Ioaz0wOyBrPHNpemU7IGsrKykKKwkg ICpwKysgPSBzcmNba107CisKKyAgIHJldHVybiBidWZmZXI7Cit9CisKKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiZ3VhcmQgaG9p c3RlZCIgMSAidW5zd2l0Y2giIH0gfSAqLworCisKZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtNC5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC00LmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwYTFjZAotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtNC5j CkBAIC0wLDAgKzEsNTIgQEAKKy8qIHsgZGctZG8gcnVuIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1mdW5zd2l0Y2gtbG9vcHMiIH0gKi8KKworI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkK K3ZvaWQgZm9vIChmbG9hdCAqKmEsIGZsb2F0ICoqYiwgZmxvYXQgKmMsIGlu dCBuLCBpbnQgbSwgaW50IGwpCit7CisgIGludCBpLGosazsKKyAgZmxvYXQg czsKKyAgZm9yIChpPTA7IGk8bDsgaSsrKQorICAgIGZvciAoaj0wOyBqPG47 IGorKykKKyAgICAgIGZvciAoaz0wOyBrPG07IGsrKykKKwljW2ldICs9IGFb aV1ba10gKiBiW2tdW2pdOworfQorCitpbnQgbWFpbigpCit7CisgIGNvbnN0 IGludCBOID0gMzI7CisgIGZsb2F0ICoqYXIxLCAqKmFyMjsKKyAgZmxvYXQg KnJlczsKKyAgaW50IGksIGo7CisgIGFyMSA9IChmbG9hdCAqKiltYWxsb2Mg KE4gKiBzaXplb2YgKGZsb2F0KikpOworICBhcjIgPSAoZmxvYXQgKiopbWFs bG9jIChOICogc2l6ZW9mIChmbG9hdCopKTsKKyAgcmVzID0gKGZsb2F0ICop bWFsbG9jKCBOICogc2l6ZW9mIChmbG9hdCkpOworICBmb3IgKGk9MDsgaTxO OyBpKyspCisgICAgeworICAgICAgYXIxW2ldID0gKGZsb2F0KiltYWxsb2Mg KE4gKiBzaXplb2YgKGZsb2F0KSk7CisgICAgICBhcjJbaV0gPSAoZmxvYXQq KW1hbGxvYyAoTiAqIHNpemVvZiAoZmxvYXQpKTsKKyAgICB9CisgIGZvciAo aT0wOyBpPE47IGkrKykKKyAgICB7CisgICAgICBmb3IgKGo9MDsgajxOOyBq KyspCisJeworCSAgYXIxW2ldW2pdID0gMi4wZjsKKwkgIGFyMltpXVtqXSA9 IDEuNWY7CisJfQorICAgICAgcmVzW2ldID0gMC4wZjsKKyAgICB9CisgIGZv byAoYXIxLCBhcjIsIHJlcywgTiwgTiwgTik7CisgIGZvciAoaT0wOyBpPE47 IGkrKykKKyAgICBpZiAocmVzW2ldICE9IDMwNzIuMGYpCisgICAgICBhYm9y dCgpOworICBmb3IgKGk9MDsgaTxOOyBpKyspCisgICAgcmVzW2ldID0gMC4w ZjsKKyAgZm9vIChhcjEsIGFyMiwgcmVzLCBOLCAwLCBOKTsKKyAgZm9yIChp PTA7IGk8TjsgaSsrKQorICAgIGlmIChyZXNbaV0gIT0gMC4wZikKKyAgICAg IGFib3J0KCk7CisgCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9n Y2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jIGIvZ2NjL3RyZWUtc3NhLWxv b3AtdW5zd2l0Y2guYwppbmRleCAwYjU0NjEyLi40MzI4ZDZhIDEwMDY0NAot LS0gYS9nY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jCisrKyBiL2djYy90 cmVlLXNzYS1sb29wLXVuc3dpdGNoLmMKQEAgLTM5LDYgKzM5LDggQEAgYWxv bmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBz ZWUKICNpbmNsdWRlICJwYXJhbXMuaCIKICNpbmNsdWRlICJ0cmVlLXBhc3Mu aCIKICNpbmNsdWRlICJ0cmVlLWlubGluZS5oIgorI2luY2x1ZGUgImdpbXBs ZS1pdGVyYXRvci5oIgorI2luY2x1ZGUgImNmZ2hvb2tzLmgiCiAKIC8qIFRo aXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsb29wIHVuc3dpdGNoaW5nLCBpLmUu IHRyYW5zZm9ybWF0aW9uIG9mIGxvb3BzIGxpa2UKIApAQCAtNzksNiArODEs MTMgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4g IElmIG5vdCBzZWUKIHN0YXRpYyBzdHJ1Y3QgbG9vcCAqdHJlZV91bnN3aXRj aF9sb29wIChzdHJ1Y3QgbG9vcCAqLCBiYXNpY19ibG9jaywgdHJlZSk7CiBz dGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChzdHJ1Y3Qg bG9vcCAqLCBpbnQpOwogc3RhdGljIHRyZWUgdHJlZV9tYXlfdW5zd2l0Y2hf b24gKGJhc2ljX2Jsb2NrLCBzdHJ1Y3QgbG9vcCAqKTsKK3N0YXRpYyBib29s IHRyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAoc3RydWN0IGxvb3AgKik7Citz dGF0aWMgZWRnZSBmaW5kX2xvb3BfZ3VhcmQgKHN0cnVjdCBsb29wICopOwor c3RhdGljIGJvb2wgZW1wdHlfYmJfd2l0aG91dF9ndWFyZF9wIChzdHJ1Y3Qg bG9vcCAqLCBiYXNpY19ibG9jayk7CitzdGF0aWMgYm9vbCB1c2VkX291dHNp ZGVfbG9vcF9wIChzdHJ1Y3QgbG9vcCAqLCB0cmVlKTsKK3N0YXRpYyB2b2lk IGhvaXN0X2d1YXJkIChzdHJ1Y3QgbG9vcCAqLCBlZGdlKTsKK3N0YXRpYyBi b29sIGNoZWNrX2V4aXRfcGhpIChzdHJ1Y3QgbG9vcCAqKTsKK3N0YXRpYyB0 cmVlIGdldF92b3BfZnJvbV9oZWFkZXIgKHN0cnVjdCBsb29wICopOwogCiAv KiBNYWluIGVudHJ5IHBvaW50LiAgUGVyZm9ybSBsb29wIHVuc3dpdGNoaW5n IG9uIGFsbCBzdWl0YWJsZSBsb29wcy4gICovCiAKQEAgLTg3LDQyICs5Niwx NSBAQCB0cmVlX3NzYV91bnN3aXRjaF9sb29wcyAodm9pZCkKIHsKICAgc3Ry dWN0IGxvb3AgKmxvb3A7CiAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwotICBI T1NUX1dJREVfSU5UIGl0ZXJhdGlvbnM7CiAKLSAgLyogR28gdGhyb3VnaCBp bm5lciBsb29wcyAob25seSBvcmlnaW5hbCBvbmVzKS4gICovCi0gIEZPUl9F QUNIX0xPT1AgKGxvb3AsIExJX09OTFlfSU5ORVJNT1NUKQorICAvKiBHbyB0 aHJvdWdoIGFsbCBsb29wcyBzdGFydGluZyBmcm9tIGlubmVybW9zdC4gICov CisgIEZPUl9FQUNIX0xPT1AgKGxvb3AsIExJX0ZST01fSU5ORVJNT1NUKQog ICAgIHsKLSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBU REZfREVUQUlMUykpCi0gICAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIjs7 IENvbnNpZGVyaW5nIGxvb3AgJWRcbiIsIGxvb3AtPm51bSk7Ci0KLSAgICAg IC8qIERvIG5vdCB1bnN3aXRjaCBpbiBjb2xkIHJlZ2lvbnMuICovCi0gICAg ICBpZiAob3B0aW1pemVfbG9vcF9mb3Jfc2l6ZV9wIChsb29wKSkKLSAgICAg ICAgewotICAgICAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCi0gICAgICAgICAgICBmcHJpbnRmIChkdW1wX2Zp bGUsICI7OyBOb3QgdW5zd2l0Y2hpbmcgY29sZCBsb29wc1xuIik7Ci0gICAg ICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgLyogVGhlIGxv b3Agc2hvdWxkIG5vdCBiZSB0b28gbGFyZ2UsIHRvIGxpbWl0IGNvZGUgZ3Jv d3RoLiAqLwotICAgICAgaWYgKHRyZWVfbnVtX2xvb3BfaW5zbnMgKGxvb3As ICZlbmlfc2l6ZV93ZWlnaHRzKQotICAgICAgICAgID4gKHVuc2lnbmVkKSBQ QVJBTV9WQUxVRSAoUEFSQU1fTUFYX1VOU1dJVENIX0lOU05TKSkKLSAgICAg ICAgewotICAgICAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCi0gICAgICAgICAgICBmcHJpbnRmIChkdW1wX2Zp bGUsICI7OyBOb3QgdW5zd2l0Y2hpbmcsIGxvb3AgdG9vIGJpZ1xuIik7Ci0g ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgLyogSWYg dGhlIGxvb3AgaXMgbm90IGV4cGVjdGVkIHRvIGl0ZXJhdGUsIHRoZXJlIGlz IG5vIG5lZWQKLQkgZm9yIHVuc3dpdGNoaW5nLiAgKi8KLSAgICAgIGl0ZXJh dGlvbnMgPSBlc3RpbWF0ZWRfbG9vcF9pdGVyYXRpb25zX2ludCAobG9vcCk7 Ci0gICAgICBpZiAoaXRlcmF0aW9ucyA+PSAwICYmIGl0ZXJhdGlvbnMgPD0g MSkKLQl7Ci0gICAgICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFn cyAmIFRERl9ERVRBSUxTKSkKLSAgICAgICAgICAgIGZwcmludGYgKGR1bXBf ZmlsZSwgIjs7IE5vdCB1bnN3aXRjaGluZywgbG9vcCBpcyBub3QgZXhwZWN0 ZWQgdG8gaXRlcmF0ZVxuIik7Ci0gICAgICAgICAgY29udGludWU7Ci0JfQot Ci0gICAgICBjaGFuZ2VkIHw9IHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3Ag KGxvb3AsIDApOworICAgICAgaWYgKCFsb29wLT5pbm5lcikKKwkvKiBVbnN3 aXRjaCBpbm5lcm1vc3QgbG9vcC4gICovCisJY2hhbmdlZCB8PSB0cmVlX3Vu c3dpdGNoX3NpbmdsZV9sb29wIChsb29wLCAwKTsKKyAgICAgIGVsc2UKKwlj aGFuZ2VkIHw9IHRyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAobG9vcCk7CiAg ICAgfQogCiAgIGlmIChjaGFuZ2VkKQpAQCAtMjE2LDYgKzE5OCwzOSBAQCB0 cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChzdHJ1Y3QgbG9vcCAqbG9vcCwg aW50IG51bSkKICAgdHJlZSBjb25kID0gTlVMTF9UUkVFOwogICBnaW1wbGUg KnN0bXQ7CiAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICBIT1NUX1dJREVf SU5UIGl0ZXJhdGlvbnM7CisKKyAgLyogUGVyZm9ybSBpbml0aWFsIHRlc3Rz IGlmIHVuc3dpdGNoIGlzIGVsaWdpYmxlLiAgKi8KKyAgaWYgKG51bSA9PSAw KQorICAgIHsKKyAgICAgIC8qIERvIG5vdCB1bnN3aXRjaCBpbiBjb2xkIHJl Z2lvbnMuICovCisgICAgICBpZiAob3B0aW1pemVfbG9vcF9mb3Jfc2l6ZV9w IChsb29wKSkKKwl7CisJICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQorCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7 OyBOb3QgdW5zd2l0Y2hpbmcgY29sZCBsb29wc1xuIik7CisJICByZXR1cm4g ZmFsc2U7CisJfQorCisgICAgICAvKiBUaGUgbG9vcCBzaG91bGQgbm90IGJl IHRvbyBsYXJnZSwgdG8gbGltaXQgY29kZSBncm93dGguICovCisgICAgICBp ZiAodHJlZV9udW1fbG9vcF9pbnNucyAobG9vcCwgJmVuaV9zaXplX3dlaWdo dHMpCisJICA+ICh1bnNpZ25lZCkgUEFSQU1fVkFMVUUgKFBBUkFNX01BWF9V TlNXSVRDSF9JTlNOUykpCisJeworCSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVt cF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAgZnByaW50ZiAoZHVtcF9m aWxlLCAiOzsgTm90IHVuc3dpdGNoaW5nLCBsb29wIHRvbyBiaWdcbiIpOwor CSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogSWYgdGhlIGxvb3Ag aXMgbm90IGV4cGVjdGVkIHRvIGl0ZXJhdGUsIHRoZXJlIGlzIG5vIG5lZWQK KwkgZm9yIHVuc3dpdGNoaW5nLiAgKi8KKyAgICAgIGl0ZXJhdGlvbnMgPSBl c3RpbWF0ZWRfbG9vcF9pdGVyYXRpb25zX2ludCAobG9vcCk7CisgICAgICBp ZiAoaXRlcmF0aW9ucyA+PSAwICYmIGl0ZXJhdGlvbnMgPD0gMSkKKwl7CisJ ICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMp KQorCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBOb3QgdW5zd2l0Y2hp bmcsIGxvb3AgaXMgbm90IGV4cGVjdGVkIgorCQkgICAgICIgdG8gaXRlcmF0 ZVxuIik7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KIAogICBpID0g MDsKICAgYmJzID0gZ2V0X2xvb3BfYm9keSAobG9vcCk7CkBAIC00MDMsNiAr NDE4LDM3NCBAQCB0cmVlX3Vuc3dpdGNoX2xvb3AgKHN0cnVjdCBsb29wICps b29wLAogCQkgICAgICAgUkVHX0JSX1BST0JfQkFTRSAtIHByb2JfdHJ1ZSwg ZmFsc2UpOwogfQogCisvKiBVbnN3aXRjaCBvdXRlciBsb29wcyBieSBob2lz dGluZyBpbnZhcmlhbnQgZ3VhcmQgb24KKyAgIGlubmVyIGxvb3Agd2l0aG91 dCBjb2RlIGR1cGxpY2F0aW9uLiAgKi8KK3N0YXRpYyBib29sCit0cmVlX3Vu c3dpdGNoX291dGVyX2xvb3AgKHN0cnVjdCBsb29wICpsb29wKQoreworICBl ZGdlIGV4aXQsIGd1YXJkOworICBIT1NUX1dJREVfSU5UIGl0ZXJhdGlvbnM7 CisKKyAgZ2NjX2Fzc2VydCAobG9vcC0+aW5uZXIpOworICBpZiAobG9vcC0+ aW5uZXItPm5leHQpCisgICAgcmV0dXJuIGZhbHNlOworICAvKiBBY2NlcHQg bG9vcHMgd2l0aCBzaW5nbGUgZXhpdCBvbmx5LiAgKi8KKyAgZXhpdCA9IHNp bmdsZV9leGl0IChsb29wKTsKKyAgaWYgKCFleGl0KQorICAgIHJldHVybiBm YWxzZTsKKyAgLyogQ2hlY2sgdGhhdCBwaGkgYXJndW1lbnQgb2YgZXhpdCBl ZGdlIGlzIG5vdCBkZWZpbmVkIGluc2lkZSBsb29wLiAgKi8KKyAgaWYgKCFj aGVja19leGl0X3BoaSAobG9vcCkpCisgICAgcmV0dXJuIGZhbHNlOworICAv KiBJZiB0aGUgbG9vcCBpcyBub3QgZXhwZWN0ZWQgdG8gaXRlcmF0ZSwgdGhl cmUgaXMgbm8gbmVlZAorICAgICAgZm9yIHVuc3dpdGNoaW5nLiAgKi8KKyAg aXRlcmF0aW9ucyA9IGVzdGltYXRlZF9sb29wX2l0ZXJhdGlvbnNfaW50IChs b29wKTsKKyAgaWYgKGl0ZXJhdGlvbnMgPj0gMCAmJiBpdGVyYXRpb25zIDw9 IDEpCisgICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFn cyAmIFRERl9ERVRBSUxTKSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBO b3QgdW5zd2l0Y2hpbmcsIGxvb3AgaXMgbm90IGV4cGVjdGVkIgorCQkgIiB0 byBpdGVyYXRlXG4iKTsKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGd1 YXJkID0gZmluZF9sb29wX2d1YXJkIChsb29wKTsKKyAgaWYgKGd1YXJkKQor ICAgIHsKKyAgICAgIGhvaXN0X2d1YXJkIChsb29wLCBndWFyZCk7CisgICAg ICB1cGRhdGVfc3NhIChUT0RPX3VwZGF0ZV9zc2EpOworICAgICAgcmV0dXJu IHRydWU7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIENoZWNr cyBpZiB0aGUgYm9keSBvZiB0aGUgTE9PUCBpcyB3aXRoaW4gYW4gaW52YXJp YW50IGd1YXJkLiAgSWYgdGhpcworICAgaXMgdGhlIGNhc2UsIHJldHVybnMg dGhlIGVkZ2UgdGhhdCBqdW1wcyBvdmVyIHRoZSByZWFsIGJvZHkgb2YgdGhl IGxvb3AsCisgICBvdGhlcndpc2UgcmV0dXJucyBOVUxMLiAgKi8KKworc3Rh dGljIGVkZ2UKK2ZpbmRfbG9vcF9ndWFyZCAoc3RydWN0IGxvb3AgKmxvb3Ap Cit7CisgIGJhc2ljX2Jsb2NrIGhlYWRlciA9IGxvb3AtPmhlYWRlcjsKKyAg ZWRnZSBndWFyZF9lZGdlLCB0ZSwgZmU7CisgIC8qIGJpdG1hcCBwcm9jZXNz ZWQsIGtub3duX2ludmFyaWFudHM7Ki8KKyAgYmFzaWNfYmxvY2sgKmJvZHkg PSBOVUxMOworICB1bnNpZ25lZCBpOworICB0cmVlIHVzZTsKKyAgc3NhX29w X2l0ZXIgaXRlcjsKKworICAvKiBXZSBjaGVjayBmb3IgdGhlIGZvbGxvd2lu ZyBzaXR1YXRpb246CisKKyAgICAgd2hpbGUgKDEpCisgICAgICAgeworCSBb aGVhZGVyXV0KKyAgICAgICAgIGxvb3BfcGhpX25vZGVzOworCSBzb21ldGhp bmcxOworCSBpZiAoY29uZDEpCisJICAgYm9keTsKKwkgbnZhciA9IHBoaShv cmlnLCBidmFyKSAuLi4gZm9yIGFsbCB2YXJpYWJsZXMgY2hhbmdlZCBpbiBi b2R5OworCSBbZ3VhcmRfZW5kXQorCSBzb21ldGhpbmcyOworCSBpZiAoY29u ZDIpCisJICAgYnJlYWs7CisJIHNvbWV0aGluZzM7CisgICAgICAgfQorCisg ICAgIHdoZXJlOgorCisgICAgIDEpIGNvbmQxIGlzIGxvb3AgaW52YXJpYW50 CisgICAgIDIpIElmIGNvbmQxIGlzIGZhbHNlLCB0aGVuIHRoZSBsb29wIGlz IGVzc2VudGlhbGx5IGVtcHR5OyBpLmUuLAorCWEpIG5vdGhpbmcgaW4gc29t ZXRoaW5nMSwgc29tZXRoaW5nMiBhbmQgc29tZXRoaW5nMyBoYXMgc2lkZQor CSAgIGVmZmVjdHMKKwliKSBhbnl0aGluZyBkZWZpbmVkIGluIHNvbWV0aGlu ZzEsIHNvbWV0aGluZzIgYW5kIHNvbWV0aGluZzMKKwkgICBpcyBub3QgdXNl ZCBvdXRzaWRlIG9mIHRoZSBsb29wLiAgKi8KKworICB3aGlsZSAoc2luZ2xl X3N1Y2NfcCAoaGVhZGVyKSkKKyAgICBoZWFkZXIgPSBzaW5nbGVfc3VjYyAo aGVhZGVyKTsKKyAgaWYgKCFsYXN0X3N0bXQgKGhlYWRlcikKKyAgICAgIHx8 IGdpbXBsZV9jb2RlIChsYXN0X3N0bXQgKGhlYWRlcikpICE9IEdJTVBMRV9D T05EKQorICAgIHJldHVybiBOVUxMOworCisgIGV4dHJhY3RfdHJ1ZV9mYWxz ZV9lZGdlc19mcm9tX2Jsb2NrIChoZWFkZXIsICZ0ZSwgJmZlKTsKKyAgaWYg KCFmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3AsIHRlLT5kZXN0KQorICAg ICAgfHwgIWZsb3dfYmJfaW5zaWRlX2xvb3BfcCAobG9vcCwgZmUtPmRlc3Qp KQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChqdXN0X29uY2VfZWFjaF9p dGVyYXRpb25fcCAobG9vcCwgdGUtPmRlc3QpCisgICAgICB8fCAoc2luZ2xl X3N1Y2NfcCAodGUtPmRlc3QpCisJICAmJiBqdXN0X29uY2VfZWFjaF9pdGVy YXRpb25fcCAobG9vcCwgc2luZ2xlX3N1Y2MgKHRlLT5kZXN0KSkpKQorICAg IHsKKyAgICAgIGlmIChqdXN0X29uY2VfZWFjaF9pdGVyYXRpb25fcCAobG9v cCwgZmUtPmRlc3QpKQorCXJldHVybiBOVUxMOworICAgICAgZ3VhcmRfZWRn ZSA9IHRlOworICAgIH0KKyAgZWxzZSBpZiAoanVzdF9vbmNlX2VhY2hfaXRl cmF0aW9uX3AgKGxvb3AsIGZlLT5kZXN0KQorCSAgIHx8IChzaW5nbGVfc3Vj Y19wIChmZS0+ZGVzdCkKKwkgICAgICAgJiYganVzdF9vbmNlX2VhY2hfaXRl cmF0aW9uX3AgKGxvb3AsIHNpbmdsZV9zdWNjIChmZS0+ZGVzdCkpKSkKKyAg ICBndWFyZF9lZGdlID0gZmU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsK KworICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJ TFMpKQorICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkgICAgICJDb25zaWRl cmluZyBndWFyZCAlZCAtPiAlZCBpbiBsb29wICVkXG4iLAorCSAgICAgZ3Vh cmRfZWRnZS0+c3JjLT5pbmRleCwgZ3VhcmRfZWRnZS0+ZGVzdC0+aW5kZXgs IGxvb3AtPm51bSk7CisgIC8qIENoZWNrIGlmIGNvbmRpdGlvbiBvcGVyYW5k cyBkbyBub3QgaGF2ZSBkZWZpbml0aW9ucyBpbnNpZGUgbG9vcCBzaW5jZQor ICAgICBhbnkgYmIgY29weWluZyBpcyBub3QgcGVyZm9ybWVkLiAgKi8KKyAg Rk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAodXNlLCBsYXN0X3N0bXQgKGhl YWRlciksIGl0ZXIsIFNTQV9PUF9VU0UpCisgICAgeworICAgICAgZ2ltcGxl ICpkZWYgPSBTU0FfTkFNRV9ERUZfU1RNVCAodXNlKTsKKyAgICAgIGJhc2lj X2Jsb2NrIGRlZl9iYiA9IGdpbXBsZV9iYiAoZGVmKTsKKyAgICAgIGlmIChk ZWZfYmIKKyAgICAgICAgICAmJiBmbG93X2JiX2luc2lkZV9sb29wX3AgKGxv b3AsIGRlZl9iYikpCisJeworCSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAgZnByaW50ZiAoZHVtcF9maWxl LCAiICBndWFyZCBvcGVyYW5kcyBoYXZlIGRlZmluaXRpb25zIgorCQkJCSIg aW5zaWRlIGxvb3BcbiIpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0K KworICBib2R5ID0gZ2V0X2xvb3BfYm9keSAobG9vcCk7CisgIGZvciAoaSA9 IDA7IGkgPCBsb29wLT5udW1fbm9kZXM7IGkrKykKKyAgICB7CisgICAgICBi YXNpY19ibG9jayBiYiA9IGJvZHlbaV07CisgICAgICBpZiAoYmItPmxvb3Bf ZmF0aGVyICE9IGxvb3ApCisJY29udGludWU7CisgICAgICBpZiAoYmItPmZs YWdzICYgQkJfSVJSRURVQ0lCTEVfTE9PUCkKKwl7CisJICBpZiAoZHVtcF9m aWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCSAgICBmcHJp bnRmIChkdW1wX2ZpbGUsICJCbG9jayAlZCBpcyBtYXJrZWQgYXMgaXJyZWR1 Y2libGUgaW4gbG9vcFxuIiwKKwkJICAgICAgYmItPmluZGV4KTsKKwkgIGd1 YXJkX2VkZ2UgPSBOVUxMOworCSAgZ290byBlbmQ7CisJfQorICAgICAgaWYg KCFlbXB0eV9iYl93aXRob3V0X2d1YXJkX3AgKGxvb3AsIGJiKSkKKwl7CisJ ICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMp KQorCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICIgIGJsb2NrICVkIGhhcyBz aWRlIGVmZmVjdHNcbiIsIGJiLT5pbmRleCk7CisJICBndWFyZF9lZGdlID0g TlVMTDsKKwkgIGdvdG8gZW5kOworCX0KKyAgICB9CisKKyAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICBmcHJp bnRmIChkdW1wX2ZpbGUsICIgIHN1aXRhYmxlIHRvIGhvaXN0XG4iKTsKK2Vu ZDoKKyAgaWYgKGJvZHkpCisgICAgZnJlZSAoYm9keSk7CisgIHJldHVybiBn dWFyZF9lZGdlOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYKKyAgIDEpIG5v IHN0YXRlbWVudCBpbiBCQiBoYXMgc2lkZSBlZmZlY3RzCisgICAyKSBhc3N1 bWluZyB0aGF0IGVkZ2UgR1VBUkQgaXMgYWx3YXlzIHRha2VuLCBhbGwgZGVm aW5pdGlvbnMgaW4gQkIKKyAgICAgIGFyZSBub3kgdXNlZCBvdXRzaWRlIG9m IHRoZSBsb29wLgorICAgS05PV05fSU5WQVJJQU5UUyBpcyBhIHNldCBvZiBz c2EgbmFtZXMgd2Uga25vdyB0byBiZSBpbnZhcmlhbnQsIGFuZAorICAgUFJP Q0VTU0VEIGlzIGEgc2V0IG9mIHNzYSBuYW1lcyBmb3IgdGhhdCB3ZSBhbHJl YWR5IHRlc3RlZCB3aGV0aGVyIHRoZXkKKyAgIGFyZSBpbnZhcmlhbnQgb3Ig bm90LiAgKi8KKworc3RhdGljIGJvb2wKK2VtcHR5X2JiX3dpdGhvdXRfZ3Vh cmRfcCAoc3RydWN0IGxvb3AgKmxvb3AsIGJhc2ljX2Jsb2NrIGJiKQorewor ICBiYXNpY19ibG9jayBleGl0X2JiID0gc2luZ2xlX2V4aXQgKGxvb3ApLT5z cmM7CisgIGJvb2wgbWF5X2JlX3VzZWRfb3V0c2lkZSA9IChiYiA9PSBleGl0 X2JiCisJCQkgICAgICB8fCAhZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFU T1JTLCBiYiwgZXhpdF9iYikpOworICB0cmVlIG5hbWU7CisgIHNzYV9vcF9p dGVyIG9wX2l0ZXI7CisKKyAgLyogUGhpIG5vZGVzIGRvIG5vdCBoYXZlIHNp ZGUgZWZmZWN0cywgYnV0IHRoZWlyIHJlc3VsdHMgbWlnaHQgYmUgdXNlZAor ICAgICBvdXRzaWRlIG9mIHRoZSBsb29wLiAgKi8KKyAgaWYgKG1heV9iZV91 c2VkX291dHNpZGUpCisgICAgeworICAgICAgZm9yIChncGhpX2l0ZXJhdG9y IGdzaSA9IGdzaV9zdGFydF9waGlzIChiYik7CisJICAgIWdzaV9lbmRfcCAo Z3NpKTsgZ3NpX25leHQgKCZnc2kpKQorCXsKKwkgIGdwaGkgKnBoaSA9IGdz aS5waGkgKCk7CisJICBuYW1lID0gUEhJX1JFU1VMVCAocGhpKTsKKwkgIGlm ICh2aXJ0dWFsX29wZXJhbmRfcCAobmFtZSkpCisJICAgIGNvbnRpbnVlOwor CisJICBpZiAodXNlZF9vdXRzaWRlX2xvb3BfcCAobG9vcCwgbmFtZSkpCisJ ICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGZvciAoZ2ltcGxl X3N0bXRfaXRlcmF0b3IgZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7CisgICAg ICAgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZnc2kpKQorICAgIHsK KyAgICAgIGdpbXBsZSAqc3RtdCA9IGdzaV9zdG10IChnc2kpOworICAgICAg aWYgKGdpbXBsZV9oYXNfc2lkZV9lZmZlY3RzIChzdG10KSkKKwlyZXR1cm4g ZmFsc2U7CisKKyAgICAgIGlmIChnaW1wbGVfdmRlZihzdG10KSkKKwlyZXR1 cm4gZmFsc2U7CisKKyAgICAgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQg KG5hbWUsIHN0bXQsIG9wX2l0ZXIsIFNTQV9PUF9ERUYpCisJeworCSAgaWYg KG1heV9iZV91c2VkX291dHNpZGUKKwkgICAgICAmJiB1c2VkX291dHNpZGVf bG9vcF9wIChsb29wLCBuYW1lKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0K KyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBp ZiBOQU1FIGlzIHVzZWQgb3V0c2lkZSBvZiBMT09QLiAgKi8KKworc3RhdGlj IGJvb2wKK3VzZWRfb3V0c2lkZV9sb29wX3AgKHN0cnVjdCBsb29wICpsb29w LCB0cmVlIG5hbWUpCit7CisgIGltbV91c2VfaXRlcmF0b3IgaXQ7CisgIHVz ZV9vcGVyYW5kX3AgdXNlOworCisgIEZPUl9FQUNIX0lNTV9VU0VfRkFTVCAo dXNlLCBpdCwgbmFtZSkKKyAgICB7CisgICAgICBnaW1wbGUgKnN0bXQgPSBV U0VfU1RNVCAodXNlKTsKKyAgICAgIGlmICghZmxvd19iYl9pbnNpZGVfbG9v cF9wIChsb29wLCBnaW1wbGVfYmIgKHN0bXQpKSkKKwlyZXR1cm4gdHJ1ZTsK KyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBSZXR1cm4gYXJn dW1lbnQgZm9yIGxvb3AgcHJlaGVhZGVyIGVkZ2UgaW4gaGVhZGVyIHZpcnR1 YWwgcGhpIGlmIGFueS4gICovCisKK3N0YXRpYyB0cmVlCitnZXRfdm9wX2Zy b21faGVhZGVyIChzdHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgZm9yIChncGhp X2l0ZXJhdG9yIGdzaSA9IGdzaV9zdGFydF9waGlzIChsb29wLT5oZWFkZXIp OworICAgICAgICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkK KyAgICB7CisgICAgICBncGhpICpwaGkgPSBnc2kucGhpICgpOworICAgICAg aWYgKCF2aXJ0dWFsX29wZXJhbmRfcCAoZ2ltcGxlX3BoaV9yZXN1bHQgKHBo aSkpKQorCWNvbnRpbnVlOworICAgICAgcmV0dXJuIFBISV9BUkdfREVGX0ZS T01fRURHRSAocGhpLCBsb29wX3ByZWhlYWRlcl9lZGdlIChsb29wKSk7Cisg ICAgfQorICByZXR1cm4gTlVMTF9UUkVFOworfQorCisvKiBNb3ZlIHRoZSBj aGVjayBvZiBHVUFSRCBvdXRzaWRlIG9mIExPT1AuICAqLworCitzdGF0aWMg dm9pZAoraG9pc3RfZ3VhcmQgKHN0cnVjdCBsb29wICpsb29wLCBlZGdlIGd1 YXJkKQoreworICBlZGdlIGV4aXQgPSBzaW5nbGVfZXhpdCAobG9vcCk7Cisg IGVkZ2UgcHJlaCA9IGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApOworICBi YXNpY19ibG9jayBwcmVfaGVhZGVyID0gcHJlaC0+c3JjOworICBiYXNpY19i bG9jayBiYjsKKyAgZWRnZSB0ZSwgZmUsIGUsIG5ld19lZGdlOworICBnaW1w bGUgKnN0bXQ7CisgIGJhc2ljX2Jsb2NrIGd1YXJkX2JiID0gZ3VhcmQtPnNy YzsKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOworICBpbnQgZmxhZ3Mg PSAwOworICBib29sIGZpeF9kb21fb2ZfZXhpdDsKKyAgZ2NvbmQgKmNvbmRf c3RtdCwgKm5ld19jb25kX3N0bXQ7CisKKyAgYmIgPSBnZXRfaW1tZWRpYXRl X2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIGV4aXQtPmRlc3QpOworICBm aXhfZG9tX29mX2V4aXQgPSBmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3As IGJiKTsKKyAgZ3NpID0gZ3NpX2xhc3RfYmIgKGd1YXJkX2JiKTsKKyAgc3Rt dCA9IGdzaV9zdG10IChnc2kpOworICBnY2NfYXNzZXJ0IChnaW1wbGVfY29k ZSAoc3RtdCkgPT0gR0lNUExFX0NPTkQpOworICBjb25kX3N0bXQgPSBhc19h IDxnY29uZCAqPiAoc3RtdCk7CisgIGV4dHJhY3RfdHJ1ZV9mYWxzZV9lZGdl c19mcm9tX2Jsb2NrIChndWFyZF9iYiwgJnRlLCAmZmUpOworICAvKiBJbnNl cnQgZ3VhcmQgdG8gUFJFX0hFQURFUi4gICovCisgIGlmICghZW1wdHlfYmxv Y2tfcCAocHJlX2hlYWRlcikpCisgICAgZ3NpID0gZ3NpX2xhc3RfYmIgKHBy ZV9oZWFkZXIpOworICBlbHNlCisgICAgZ3NpID0gZ3NpX3N0YXJ0X2JiIChw cmVfaGVhZGVyKTsKKyAgLyogQ3JlYXRlIGNvcHkgb2YgQ09ORF9TVE1ULiAg Ki8KKyAgbmV3X2NvbmRfc3RtdCA9IGdpbXBsZV9idWlsZF9jb25kIChnaW1w bGVfY29uZF9jb2RlIChjb25kX3N0bXQpLAorCQkJCSAgICAgZ2ltcGxlX2Nv bmRfbGhzIChjb25kX3N0bXQpLAorCQkJCSAgICAgZ2ltcGxlX2NvbmRfcmhz IChjb25kX3N0bXQpLAorCQkJCSAgICAgTlVMTF9UUkVFLCBOVUxMX1RSRUUp OworICBnc2lfaW5zZXJ0X2FmdGVyICgmZ3NpLCBuZXdfY29uZF9zdG10LCBH U0lfTkVXX1NUTVQpOworICAvKiBDb252ZXJ0IENPTkRfU1RNVCB0byB0cnVl L2ZhbHNlIGNvbmRpdGlvbmFsLiAgKi8KKyAgaWYgKGd1YXJkID09IHRlKQor ICAgIGdpbXBsZV9jb25kX21ha2VfZmFsc2UgKGNvbmRfc3RtdCk7CisgIGVs c2UKKyAgICBnaW1wbGVfY29uZF9tYWtlX3RydWUgKGNvbmRfc3RtdCk7Cisg IHVwZGF0ZV9zdG10IChjb25kX3N0bXQpOworICAvKiBDcmVhdGUgbmV3IGxv b3AgcHJlLWhlYWRlci4gICovCisgIGUgPSBzcGxpdF9ibG9jayAocHJlX2hl YWRlciwgbGFzdF9zdG10IChwcmVfaGVhZGVyKSk7CisgIGdjY19hc3NlcnQg KGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApLT5zcmMgPT0gZS0+ZGVzdCk7 CisgIGlmIChndWFyZCA9PSBmZSkKKyAgICB7CisgICAgICBlLT5mbGFncyA9 IEVER0VfVFJVRV9WQUxVRTsKKyAgICAgIGZsYWdzIHw9IEVER0VfRkFMU0Vf VkFMVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZS0+ZmxhZ3Mg PSBFREdFX0ZBTFNFX1ZBTFVFOworICAgICAgZmxhZ3MgfD0gRURHRV9UUlVF X1ZBTFVFOworICAgIH0KKyAgbmV3X2VkZ2UgPSBtYWtlX2VkZ2UgKHByZV9o ZWFkZXIsIGV4aXQtPmRlc3QsIGZsYWdzKTsKKyAgaWYgKGZpeF9kb21fb2Zf ZXhpdCkKKyAgICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAoQ0RJX0RPTUlO QVRPUlMsIGV4aXQtPmRlc3QsIHByZV9oZWFkZXIpOworICAvKiBBZGQgTkVX X0FER0UgYXJndW1lbnQgZm9yIGFsbCBwaGkgaW4gcG9zdC1oZWFkZXIgYmxv Y2suICAqLworICBiYiA9IGV4aXQtPmRlc3Q7CisgIGZvciAoZ3BoaV9pdGVy YXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAoYmIpOworICAgICAgICFnc2lf ZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKKyAgICB7CisgICAgICBn cGhpICpwaGkgPSBnc2kucGhpICgpOworICAgICAgdHJlZSBhcmc7CisgICAg ICBpZiAodmlydHVhbF9vcGVyYW5kX3AgKGdpbXBsZV9waGlfcmVzdWx0IChw aGkpKSkKKwl7CisJICBhcmcgPSBnZXRfdm9wX2Zyb21faGVhZGVyIChsb29w KTsKKwkgIGlmIChhcmcgPT0gTlVMTF9UUkVFKQorCSAgICAvKiBVc2UgZXhp dCBlZGdlIGFyZ3VtZW50LiAgKi8KKwkgICAgYXJnID0gIFBISV9BUkdfREVG X0ZST01fRURHRSAocGhpLCBleGl0KTsKKwkgIGFkZF9waGlfYXJnIChwaGks IGFyZywgbmV3X2VkZ2UsIFVOS05PV05fTE9DQVRJT04pOworCX0KKyAgICAg IGVsc2UKKwl7CisJICAvKiBVc2UgZXhpdCBlZGdlIGFyZ3VtZW50LiAgKi8K KwkgIGFyZyA9IFBISV9BUkdfREVGX0ZST01fRURHRSAocGhpLCBleGl0KTsK KwkgIGFkZF9waGlfYXJnIChwaGksIGFyZywgbmV3X2VkZ2UsIFVOS05PV05f TE9DQVRJT04pOworCX0KKyAgICB9CisKKyAgbWFya192aXJ0dWFsX29wZXJh bmRzX2Zvcl9yZW5hbWluZyAoY2Z1bik7CisgIHVwZGF0ZV9zc2EgKFRPRE9f dXBkYXRlX3NzYSk7CisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCisgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiICBn dWFyZCBob2lzdGVkLlxuIik7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHBo aSBhcmd1bWVudCBmb3IgZXhpdCBlZGdlIGNhbiBiZSB1c2VkCisgICBmb3Ig ZWRnZSBhcm91bmQgbG9vcC4gICovCisKK3N0YXRpYyBib29sCitjaGVja19l eGl0X3BoaSAoc3RydWN0IGxvb3AgKmxvb3ApCit7CisgIGVkZ2UgZXhpdCA9 IHNpbmdsZV9leGl0IChsb29wKTsKKyAgYmFzaWNfYmxvY2sgcHJlX2hlYWRl ciA9IGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApLT5zcmM7CisKKyAgZm9y IChncGhpX2l0ZXJhdG9yIGdzaSA9IGdzaV9zdGFydF9waGlzIChleGl0LT5k ZXN0KTsKKyAgICAgICAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdz aSkpCisgICAgeworICAgICAgZ3BoaSAqcGhpID0gZ3NpLnBoaSAoKTsKKyAg ICAgIHRyZWUgYXJnOworICAgICAgZ2ltcGxlICpkZWY7CisgICAgICBiYXNp Y19ibG9jayBkZWZfYmI7CisgICAgICBpZiAodmlydHVhbF9vcGVyYW5kX3Ag KGdpbXBsZV9waGlfcmVzdWx0IChwaGkpKSkKKwljb250aW51ZTsKKyAgICAg IGFyZyA9IFBISV9BUkdfREVGX0ZST01fRURHRSAocGhpLCBleGl0KTsKKyAg ICAgIGlmIChUUkVFX0NPREUgKGFyZykgIT0gU1NBX05BTUUpCisJY29udGlu dWU7CisgICAgICBkZWYgPSBTU0FfTkFNRV9ERUZfU1RNVCAoYXJnKTsKKyAg ICAgIGlmICghZGVmKQorCWNvbnRpbnVlOworICAgICAgZGVmX2JiID0gZ2lt cGxlX2JiIChkZWYpOworICAgICAgaWYgKCFkZWZfYmIpCisJY29udGludWU7 CisgICAgICBpZiAoIWRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywg cHJlX2hlYWRlciwgZGVmX2JiKSkKKwkvKiBEZWZpbml0aW9uIGluc2lkZSBs b29wISAgKi8KKwlyZXR1cm4gZmFsc2U7CisgICAgICAvKiBDaGVjayBsb29w IGNsb3NlZCBwaGkgaW52YXJpYW50LiAgKi8KKyAgICAgIGlmICghZmxvd19i Yl9pbnNpZGVfbG9vcF9wIChkZWZfYmItPmxvb3BfZmF0aGVyLCBwcmVfaGVh ZGVyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsK K30KKwogLyogTG9vcCB1bnN3aXRjaGluZyBwYXNzLiAgKi8KIAogbmFtZXNw YWNlIHsK --001a11c2ef103174f40521855f01--