On Wed, 8 May 2019, Jeff Law wrote: > On 5/8/19 6:20 AM, Richard Biener wrote: > > On Wed, 8 May 2019, Jiufu Guo wrote: > > > >> Hi, > >> > >> Thanks Richard, Segher, Andrew and all. > >> > >> Segher Boessenkool <seg...@kernel.crashing.org> writes: > >> > >>> Let me try to answer some of this... > >>> > >>> On Tue, May 07, 2019 at 03:31:27PM +0200, Richard Biener wrote: > >>>> On Mon, 6 May 2019, Jiufu Guo wrote: > >>>>> This patch implements the optimization in PR77820. The optimization > >>>>> eliminates phi and phi's basic block, if the phi is used only by > >>>>> condition branch, and the phi's incoming value in the result of a > >>>>> CMP result. > >>> > >>>> I'm not sure I like a new pass here ;) The transform is basically > >>>> tail-duplicating the PHI block because the exit conditional can > >>>> be "simplfied" - that's something jump threading generally does > >>>> though it relies on "simplified" being a little bit more simplified > >>>> than above. > >>> > >> Adding a new pass is just because it may be relatively easy to extend > >> and maintain. > >> > >> Adding this micor-optimization into other passes is also a good > >> sugguestion. > >> > >> - Similar with jump threading, this new transform is replacing jump > >> old destination with new destination. While for this case, the new > >> destination can not be determined at compile time. > >> > >> - And as Andrew said: forwprop/backprop are similar, but this case is in > >> opposite: it is spread common code(phi+gcond) into different preds. > >> > >> - And there is phiopt pass which focus on making 'phi' stmt better. > >> it also do some similar thing: > >> bb0: > >> if (a != b) goto bb2; else goto bb1; > >> bb1: > >> bb2: > >> x = PHI <a (bb1), b (bb0), ...>; > >> > >> tranform to: > >> > >> bb0: > >> bb2: > >> x = PHI <b (bb0), ...>; > >> > >> If I avoid to add new pass, any suggustions about which exiting pass > >> (jumpthreading/forwprop/phiopt/...) would be more suitable to extend to > >> support this new transform? > > > > The main thing the transform does is tail-duplicate the PHI block, > > if we'd just do that followup transforms would do the rest. > One might even claim this is really a transformation for cfg cleanups. > If we ignore the PHI what we have is a unconditional jump to a > conditional jump. The obvious way to optimize that is to replace the > unconditional jump with a copy of the conditional jump.
I though about this too, but then quickly disregarded as too gross ;) > >> Currently this pass handles the case if there is only one PHI and the > >> phi is used by gcond. If there are other suitable cases, we can just > >> extend this tranform. > > > > I was just thinking of a small amount of unrelated stmts in those > > blocks or the case where just one PHI argument is fed by a conditional > > thus only one path would simplify (but maybe the hot one if you look > > at edge probabilities). > Perhaps, but do these happen enough in practice? With the code motions > we do I'd be a bit surprised. It probably depends on what kind of source this typically arises from. Richard.