nir: Fix lowering of bitfield_insert to shifts.
authorEric Anholt <eric@anholt.net>
Thu, 27 Jun 2019 21:29:37 +0000 (14:29 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 28 Jun 2019 23:38:23 +0000 (16:38 -0700)
The bfi/bfm behavior change replaced the bfi/bfm usage in
lower_bitfield_insert_to_shifts with actual shifts like the name says,
but it failed to handle the offset=0, bits==32 case in the new
lowering.

v2: Use 31 < bits instead of bits == 32, to get the 31 < (iand bits,
    31) -> false optimization.

Fixes regressions in dEQP-GLES31.*bitfield_insert* on freedreno.

Fixes: 165b7f3a4487 ("nir: define behavior of nir_op_bfm and nir_op_u/ibfe according to SM5 spec.")
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
src/compiler/nir/nir_opt_algebraic.py

index 8b78688705210e3d813441b4a06b3147e5f26dca..4fd9a93a22a31bd0ccb7b3a6d1c3acc137cc35d0 100644 (file)
@@ -795,9 +795,11 @@ optimizations.extend([
 
    # Alternative lowering that doesn't rely on bfi.
    (('bitfield_insert', 'base', 'insert', 'offset', 'bits'),
-    ('ior',
-    ('iand', 'base', ('inot', ('ishl', ('isub', ('ishl', 1, 'bits'), 1), 'offset'))),
-    ('iand', ('ishl', 'insert', 'offset'), ('ishl', ('isub', ('ishl', 1, 'bits'), 1), 'offset'))),
+    ('bcsel', ('ult', 31, 'bits'),
+     'insert',
+    (('ior',
+     ('iand', 'base', ('inot', ('ishl', ('isub', ('ishl', 1, 'bits'), 1), 'offset'))),
+     ('iand', ('ishl', 'insert', 'offset'), ('ishl', ('isub', ('ishl', 1, 'bits'), 1), 'offset'))))),
     'options->lower_bitfield_insert_to_shifts'),
 
    # Alternative lowering that uses bitfield_select.