[Mesa-dev] [PATCH 00/13] panfrost/midgard: RA improvements (esp. RA)

Alyssa Rosenzweig alyssa at rosenzweig.io
Sun May 26 02:39:11 UTC 2019


This fairly-lengthy series is focused on improving the register
allocator and by extension the performance of the generated code.
Meanwhile, we cleanup the compiler, refactoring as we go, driven by the
overall arc of the RA improvements. I was particularly motivated by the
concerns raised by compiling code like:

        vec3 A = B * C;
        float d = A.x * A.y;

to something like

        vmul.fmul r0.xyz, [B], [C]
        smul.fmul r1.x, r0.x, r0.y

There are two clear problems here. One is that the r0.w component is
never used, but r1.x is -- doubling the register pressure from what it
needs to be, given register pressure is measured in vec4 for Midgard. On
many shaders, this affects the need to spill or number of threads
created. So the first half of the series, culminating in "Extend RA..."
would rewrite this code to use r0.w vs r1.x.

The other is a bit more minor, but there's no need to use r0.x at all!
It turns out that within a VLIW bundle, we can push values directly
across, bypassing the register file, represented by the pseudo- pipeline
registers r24/r25. So by the improvements in the latter half of the
series, culminating in "Implement...", we instead get something like:

        vmul.fmul r24.xyz, [B], [C]
        smul.fmul r0.x, r24.x, r24.y

In addition to various stylistic cleanups, a major consequence of this
series is a unification of pre-schedule and post-schedule MIR. The
immediate effect is that our main work RA can now run post-schedule,
rather than just pre-schedule, without duplicating a whole bunch of
code. This will become particularly important as we want to balance
pipeline register creation with having to implement spilling eventually.

Alyssa Rosenzweig (13):
  panfrost/midgard: Remove pinning
  panfrost/midgard: Share some utility functions
  panfrost/midgard: Set int outmod for "pasted" code
  panfrost/midgard: Fix liveness analysis bugs
  panfrost/midgard: Set masks on ld_vary
  panfrost/midgard: Extend RA to non-vec4 sources
  panfrost/midgard: Misc. cleanup for readibility
  panfrost/midgard: Refactor schedule/emit pipeline
  panfrost/midgard: Add MIR helpers
  panfrost/midgard: Implement "pipeline register" prepass
  panfrost/midgard: Cleanup copy propagation
  panfrost/midgard: Remove r0 scheduling code
  panfrost/midgard: .pos propagation

 src/gallium/drivers/panfrost/meson.build      |   4 +
 .../drivers/panfrost/midgard/compiler.h       | 117 ++-
 .../drivers/panfrost/midgard/helpers.h        |  73 ++
 .../panfrost/midgard/midgard_compile.c        | 937 ++----------------
 .../drivers/panfrost/midgard/midgard_emit.c   | 229 +++++
 .../panfrost/midgard/midgard_liveness.c       |  10 +-
 .../drivers/panfrost/midgard/midgard_ops.h    |  21 +
 .../drivers/panfrost/midgard/midgard_ra.c     | 387 ++++++--
 .../panfrost/midgard/midgard_ra_pipeline.c    |  87 ++
 .../panfrost/midgard/midgard_schedule.c       | 425 ++++++++
 src/gallium/drivers/panfrost/midgard/mir.c    |  53 +
 11 files changed, 1389 insertions(+), 954 deletions(-)
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_emit.c
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_ra_pipeline.c
 create mode 100644 src/gallium/drivers/panfrost/midgard/midgard_schedule.c
 create mode 100644 src/gallium/drivers/panfrost/midgard/mir.c

-- 
2.20.1



More information about the mesa-dev mailing list