On Fri, Apr 17, 2020 at 08:53:08AM +0200, Richard Biener wrote: > On Thu, Apr 16, 2020 at 7:46 PM Segher Boessenkool > <seg...@kernel.crashing.org> wrote: > > > > On Thu, Apr 16, 2020 at 10:33:45AM +0200, Richard Biener wrote: > > > On Wed, Apr 15, 2020 at 11:23 PM Segher Boessenkool > > > > On a general note, we shouldn't depend on some pass that may or may not > > > > clean up the mess we make, when we could just avoid making a mess in the > > > > first place. > > > > > > True - but the issue at hand is not trivial given you have to care for > > > partial defs, uses outside of the loop (or across the backedge), etc. > > > So there's plenty of things to go "wrong" here. > > > > Certainly. But *all* RTL passes before RA should leave things in "web > > form" (compare to SSA form). The code in web.c is probably just fine; > > but we shouldn't have one web pass, *all* passes should leave things in > > a useful form! > > Yeah well, but RTL is not in SSA form
"Webs" are not the *same* as SSA, in a few crucial ways; but they serve similar purposes: they both make code transformations easier to do. Both do this by having more different (independent) names. > and there's no RTL IL verification > in place to track degradation. Adding this isn't hard in principle. But currently it is violated all over the place, including in backend code. > And we even work in the opposite way > when expanding to RTL from SSA, coalescing as much as we can ... Which often is bad. A lot of what expand does is premature optimisation that a) is much too complicated, and b) results in worse code in the end. Expand should not try to do *anything* "interesting", it should "merely" translate to RTL. (And in a way that can be debugged sanely at all, if possible ;-) ) > > > > The web pass belongs immediately after expand; but ideally, even expand > > > > would not reuse pseudos anyway. > > > > > > But for example when lower-subreg decomposes things in a way turning > > > partial defs into full defs new opportunities to split the web arise. > > > > But that is only for the new registers it creates, or what am I missing? > > No idea, just made up the example that maintaing "SSA" RTL is > not automagic. Oh sure, but in most cases, it is. My point is that making web form only once (and messing it up after that) isn't great. > > > > Maybe it would be better as some utility routines, not a pass? > > > > > > Sure, but then when do we apply it? > > > > All of the time! Ideally every pass would leave things in a good shape. > > Usually it is cheapest as well as easiest to do things manually, but for > > some harder cases, such helper routines can be used. > > > > > Ideally scheduling would to > > > register renaming itself and thus not rely on the used pseudos > > > (I'm not sure if it tracks false dependences - I guess it must if it > > > isn't able to rename regs). That would be a much better place > > > for improvements? > > > > sched2 runs after RA, so it has nothing to do with webs? And sched1 > > doesn't do much relevant here (it doesn't move insns much). > > > > I don't see how this is directly related to register renaming either? > > If scheduling ignores "false" dependences (anti dependence with > full defs) then when it schedules across such defs needs to perform > renaming. Maybe I'm using bogus terms here. Your terminology is fine afaic, but I don't see what you mean, sorry. Maybe I don't know sched well enough... I thought it would just refuse to move something if that would result in broken code? Segher