<div dir="ltr">Patch Series Reviewed-By: Ryan Houdek <<a href="mailto:Sonicadvance1@gmail.com">Sonicadvance1@gmail.com</a>></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, May 25, 2019 at 7:39 PM Alyssa Rosenzweig <<a href="mailto:alyssa@rosenzweig.io">alyssa@rosenzweig.io</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This fairly-lengthy series is focused on improving the register<br>
allocator and by extension the performance of the generated code.<br>
Meanwhile, we cleanup the compiler, refactoring as we go, driven by the<br>
overall arc of the RA improvements. I was particularly motivated by the<br>
concerns raised by compiling code like:<br>
<br>
        vec3 A = B * C;<br>
        float d = A.x * A.y;<br>
<br>
to something like<br>
<br>
        vmul.fmul <a href="http://r0.xyz" rel="noreferrer" target="_blank">r0.xyz</a>, [B], [C]<br>
        smul.fmul r1.x, r0.x, r0.y<br>
<br>
There are two clear problems here. One is that the r0.w component is<br>
never used, but r1.x is -- doubling the register pressure from what it<br>
needs to be, given register pressure is measured in vec4 for Midgard. On<br>
many shaders, this affects the need to spill or number of threads<br>
created. So the first half of the series, culminating in "Extend RA..."<br>
would rewrite this code to use r0.w vs r1.x.<br>
<br>
The other is a bit more minor, but there's no need to use r0.x at all!<br>
It turns out that within a VLIW bundle, we can push values directly<br>
across, bypassing the register file, represented by the pseudo- pipeline<br>
registers r24/r25. So by the improvements in the latter half of the<br>
series, culminating in "Implement...", we instead get something like:<br>
<br>
        vmul.fmul <a href="http://r24.xyz" rel="noreferrer" target="_blank">r24.xyz</a>, [B], [C]<br>
        smul.fmul r0.x, r24.x, r24.y<br>
<br>
In addition to various stylistic cleanups, a major consequence of this<br>
series is a unification of pre-schedule and post-schedule MIR. The<br>
immediate effect is that our main work RA can now run post-schedule,<br>
rather than just pre-schedule, without duplicating a whole bunch of<br>
code. This will become particularly important as we want to balance<br>
pipeline register creation with having to implement spilling eventually.<br>
<br>
Alyssa Rosenzweig (13):<br>
  panfrost/midgard: Remove pinning<br>
  panfrost/midgard: Share some utility functions<br>
  panfrost/midgard: Set int outmod for "pasted" code<br>
  panfrost/midgard: Fix liveness analysis bugs<br>
  panfrost/midgard: Set masks on ld_vary<br>
  panfrost/midgard: Extend RA to non-vec4 sources<br>
  panfrost/midgard: Misc. cleanup for readibility<br>
  panfrost/midgard: Refactor schedule/emit pipeline<br>
  panfrost/midgard: Add MIR helpers<br>
  panfrost/midgard: Implement "pipeline register" prepass<br>
  panfrost/midgard: Cleanup copy propagation<br>
  panfrost/midgard: Remove r0 scheduling code<br>
  panfrost/midgard: .pos propagation<br>
<br>
 src/gallium/drivers/panfrost/meson.build      |   4 +<br>
 .../drivers/panfrost/midgard/compiler.h       | 117 ++-<br>
 .../drivers/panfrost/midgard/helpers.h        |  73 ++<br>
 .../panfrost/midgard/midgard_compile.c        | 937 ++----------------<br>
 .../drivers/panfrost/midgard/midgard_emit.c   | 229 +++++<br>
 .../panfrost/midgard/midgard_liveness.c       |  10 +-<br>
 .../drivers/panfrost/midgard/midgard_ops.h    |  21 +<br>
 .../drivers/panfrost/midgard/midgard_ra.c     | 387 ++++++--<br>
 .../panfrost/midgard/midgard_ra_pipeline.c    |  87 ++<br>
 .../panfrost/midgard/midgard_schedule.c       | 425 ++++++++<br>
 src/gallium/drivers/panfrost/midgard/mir.c    |  53 +<br>
 11 files changed, 1389 insertions(+), 954 deletions(-)<br>
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_emit.c<br>
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_ra_pipeline.c<br>
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_schedule.c<br>
 create mode 100644 src/gallium/drivers/panfrost/midgard/mir.c<br>
<br>
-- <br>
2.20.1<br>
<br>
</blockquote></div>