On 05/15/2018 08:42 AM, Richard Biener wrote: > On Tue, 15 May 2018, Richard Biener wrote: > >> On Tue, 15 May 2018, Richard Biener wrote: >> >>> On Tue, 15 May 2018, Richard Biener wrote: >>> >>>> On Tue, 15 May 2018, Richard Biener wrote: >>>> >>>>> On Mon, 14 May 2018, Kugan Vivekanandarajah wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> Attached patch handles PR63185 when we reach PHI with temp != NULLL. >>>>>> We could see the PHI and if there isn't any uses for PHI that is >>>>>> interesting, we could ignore that ? >>>>>> >>>>>> Bootstrapped and regression tested on x86_64-linux-gnu. >>>>>> Is this OK? >>>>> >>>>> No, as Jeff said we can't do it this way. >>>>> >>>>> If we end up with multiple VDEFs in the walk of defvar immediate >>>>> uses we know we are dealing with a CFG fork. We can't really >>>>> ignore any of the paths but we have to >>>>> >>>>> a) find the merge point (and the associated VDEF) >>>>> b) verify for each each chain of VDEFs with associated VUSEs >>>>> up to that merge VDEF that we have no uses of the to classify >>>>> store and collect (partial) kills >>>>> c) intersect kill info and continue walking from the merge point >>>>> >>>>> in b) there's the optional possibility to find sinking opportunities >>>>> in case we have kills on some paths but uses on others. This is why >>>>> DSE should be really merged with (store) sinking. >>>>> >>>>> So if we want to enhance DSEs handling of branches then we need >>>>> to refactor the simple dse_classify_store function. Let me take >>>>> an attempt at this today. >>>> >>>> First (baby) step is the following - it arranges to collect the >>>> defs we need to continue walking from and implements trivial >>>> reduction by stopping at (full) kills. This allows us to handle >>>> the new testcase (which was already handled in the very late DSE >>>> pass with the help of sinking the store). >>>> >>>> I took the opportunity to kill the use_stmt parameter of >>>> dse_classify_store as the only user is only looking for whether >>>> the kills were all clobbers which I added a new parameter for. >>>> >>>> I didn't adjust the byte-tracking case fully (I'm not fully understanding >>>> the code in the case of a use and I'm not sure whether it's worth >>>> doing the def reduction with byte-tracking). >>>> >>>> Your testcase can be handled by reducing the PHI and the call def >>>> by seeing that the only use of a candidate def is another def >>>> we have already processed. Not sure if worth special-casing though, >>>> I'd rather have a go at "recursing". That will be the next >>>> patch. >>>> >>>> Bootstrap & regtest running on x86_64-unknown-linux-gnu. >>> >>> Applied. >>> >>> Another intermediate one below, fixing the byte-tracking for >>> stmt with uses. This also re-does the PHI handling by simply >>> avoiding recursion by means of a visited bitmap and stopping >>> at the DSE classify stmt when re-visiting it instead of failing. >>> This covers Pratamesh loop case for which I added ssa-dse-33.c. >>> For the do-while loop this still runs into the inability to >>> handle two defs to walk from. >>> >>> Bootstrap & regtest running on x86_64-unknown-linux-gnu. >> >> Ok, loop handling doesn't work in general since we run into the >> issue that SSA form across the backedge is not representing the >> same values. Consider >> >> <bb 3> >> # .MEM_22 = PHI <.MEM_12(D)(2), .MEM_13(4)> >> # n_20 = PHI <0(2), n_7(4)> >> # .MEM_13 = VDEF <.MEM_22> >> bytes[n_20] = _4; >> if (n_20 > 7) >> goto <bb 5>; >> >> <bb 4> >> n_7 = n_20 + 1; >> # .MEM_15 = VDEF <.MEM_13> >> bytes[n_20] = _5; >> goto <bb 3>; >> >> then when classifying the store in bb4, visiting the PHI node >> gets us to the store in bb3 which appears to be killing. >> >> if (gimple_code (temp) == GIMPLE_PHI) >> - defvar = PHI_RESULT (temp); >> + { >> + /* If we visit this PHI by following a backedge then reset >> + any info in ref that may refer to SSA names which we'd need >> + to PHI translate. */ >> + if (gimple_bb (temp) == gimple_bb (stmt) >> + || dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt), >> + gimple_bb (temp))) >> + /* ??? ref->ref may not refer to SSA names or it may only >> + refer to SSA names that are invariant with respect to the >> + loop represented by this PHI node. */ >> + ref->ref = NULL_TREE; >> + defvar = PHI_RESULT (temp); >> + bitmap_set_bit (visited, SSA_NAME_VERSION (defvar)); >> + } >> >> should be a workable solution for that. I'm checking that, but >> eventually you can think of other things that might prevent us from >> handling backedges. Note the current code tries to allow >> looking across loops but not handle backedges of loops the >> original stmt belongs to. > > Just to mention before I leave for the day I think I've identified > a latent issue where I just fail to produce a testcase right now > which is that non-return exits from a function are not reliably > visited given they do not all have virtual operands, like > for example resx. Thus consider > > void foo (int *p, int x) > { > *p = 0; > if (x) > resx; > *p = 1; > return; > } > > where we will never visit any stmts on the resx path and thus think > the *p = 0 store is dead (all with current trunk of course). > > Will continue to dig tomorrow. Yes. I stumbled over this at some point as well. I think there's a BZ which touches on this issue, though I don't have the # and I don't recall if handling a non-return exit would be sufficient to address the BZ.
Jeff