On Wed, May 15, 2019 at 11:03 PM Alexandre Oliva <aol...@redhat.com> wrote: > > On May 15, 2019, Richard Biener <richard.guent...@gmail.com> wrote: > > > On Wed, May 15, 2019 at 10:20 AM Alexandre Oliva <aol...@redhat.com> wrote: > >> > >> Gimple jump threading does not duplicate forwarder blocks that might > >> be present before or after the copied block. > > > Empty forwarder blocks I presume? > > Empty except for debug stmts and possibly a final conditional jump that, > in the threading path, becomes unconditional. > > > I wonder if not copying empty forwarders is premature optimization > > in that (hopefully) CFG cleanup is run after jump threading anyways? > > I don't think it's so much of an optimization as it is an extension. > The code as it is can only really handle copying the initial block and > another subsequent block. Threading through other "empty" blocks > didsn't require as significant changes as copying them would have. > > If we were to change that, then we'd be extending jump threading to > actually copy multiple blocks, empty or not. Not necessarily a bad > thing, but there are comments in the code suggesting that hasn't really > been tried.
Oh, I see - I thought we've extended the code to copy an arbitrary length path by now ... > > If we'd copy the blocks the patch would be moot? > > Yes, but with a caveat. > > It's true that cfgcleanup would pretty much end up having the same or > similar effect, consolidating debug stmts from empty blocks into > successor or predecessor if possible and dropping them otherwise. > > What it would not do is to consolidate binds from the now-split paths > into the confluence, like propagate_threaded_block_debug_into does. The > proposed patch does not change that, and it shouldn't: the confluence > binds stand on their own (*), very much like the binds we add after PHI > nodes when entering SSA. Ah, I missed that, so yes, it looks more powerful. > That reduces the loss when we don't have a place to hold the debug > stmts, and it helps bind resolution in var-tracking even when the > incoming paths seem to have diverged in where they hold a variable, at > least when the binds don't end up being reset for this very reason even > when var-tracking dataflow could have figured out a common location > among the incoming blocks. > > (*) though memory references in them might become wrong if they're > before the second block and the second block changes the memory > locations, it occurs to me now, without actually going back and checking > whether the consolidation pays any attention to that. > > We shouldn't assume that just because we're now copying all intermediate > blocks, debug info and all, the confluence binds cease to be useful. > Rather, we should probably consider introducing them in other passes > that split paths and introduce new confluences. Indeed. Richard. > -- > Alexandre Oliva, freedom fighter he/him https://FSFLA.org/blogs/lxo > Be the change, be Free! FSF Latin America board member > GNU Toolchain Engineer Free Software Evangelist > Hay que enGNUrecerse, pero sin perder la terGNUra jamás - Che GNUevara