freedreno/ir3: Leave bools as 1-bit, storing them in full regs.
authorEric Anholt <eric@anholt.net>
Thu, 9 Apr 2020 17:45:24 +0000 (10:45 -0700)
committerMarge Bot <eric+marge@anholt.net>
Thu, 30 Apr 2020 23:36:09 +0000 (23:36 +0000)
commit0e51082cfa733b3b8255bbd77fc4af46f4108c1d
treed42df2163d8802c985fed54eb0bc82ca8a501e86
parent769adc9546afcd72cbe7bb1caf14add5f6ac9f61
freedreno/ir3: Leave bools as 1-bit, storing them in full regs.

If use NIR's 1-bit bool representation , we get exactly the bool behavior
the hardware provides: CMPS produces true or false, AND/OR/XOR work as
intended without extra absnegs, and we can pass those half values directly
to other CMPS.  We emit an absneg for b2b1 ("turn a memory load into a
1-bit NIR boolean"), but we would have done so for the ir3_n2b() on the
use of that value anyway.  The most awkward bit is that inot(a@1) is now a
sub(1, a), but we can encode the 1 as an immediate so it's fine.

No significant changes to GL_TIME_ELAPSED on my set of traces (n=21).

instructions in affected programs: 1570638 -> 1548702 (-1.40%)
nops in affected programs: 624053 -> 611381 (-2.03%)
non-nops in affected programs: 959061 -> 949797 (-0.97%)
mov in affected programs: 5258 -> 5252 (-0.11%)
cov in affected programs: 15099 -> 15902 (5.32%)
dwords in affected programs: 469600 -> 452768 (-3.58%)
last-baryf in affected programs: 162211 -> 154726 (-4.61%)
full in affected programs: 4881 -> 4797 (-1.72%)
sstall in affected programs: 173953 -> 174545 (0.34%)
(ss) in affected programs: 10922 -> 10934 (0.11%)
(sy) in affected programs: 728 -> 745 (2.34%)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4518>
src/freedreno/ir3/ir3_compiler_nir.c
src/freedreno/ir3/ir3_context.c