nir/algebraic: Add some logical OR and AND patterns
authorJason Ekstrand <jason@jlekstrand.net>
Fri, 29 Mar 2019 22:12:47 +0000 (17:12 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Fri, 5 Apr 2019 23:39:06 +0000 (18:39 -0500)
The new OR pattern has been seen in the wild and can end up being
generated by GLSLang.  Not sure about the other two new patterns but we
may as well throw them in for completeness.  While we're here, we can
drop the '@bool' specifier from the one pattern because specifying True
already implies 1-bit which basically implies boolean.

Shader-db results on Kaby Lake:

    total instructions in shared programs: 15321227 -> 15321129 (<.01%)
    instructions in affected programs: 3594 -> 3496 (-2.73%)
    helped: 6
    HURT: 0

    total cycles in shared programs: 357481321 -> 357479725 (<.01%)
    cycles in affected programs: 44109 -> 42513 (-3.62%)
    helped: 6
    HURT: 0

VkPipeline-DB results on Kaby Lake:

    total instructions in shared programs: 3770504 -> 3769734 (-0.02%)
    instructions in affected programs: 19058 -> 18288 (-4.04%)
    helped: 163
    HURT: 0

    total cycles in shared programs: 1417583701 -> 1417569727 (<.01%)
    cycles in affected programs: 750958 -> 736984 (-1.86%)
    helped: 158
    HURT: 1

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_opt_algebraic.py

index 597d479bd636725f3f9cd983427473255be5899f..d67379958440f779166e0885519ff83d5d57467c 100644 (file)
@@ -313,6 +313,9 @@ optimizations = [
    (('bcsel', a, ('bcsel', b, c, d), ('bcsel(is_used_once)', b, 'e', d)), ('bcsel', b, ('bcsel', a, c, 'e'), d)),
    (('bcsel', a, ('bcsel(is_used_once)', b, c, d), ('bcsel', b, 'e', d)), ('bcsel', b, ('bcsel', a, c, 'e'), d)),
    (('bcsel', a, True, b), ('ior', a, b)),
+   (('bcsel', a, a, b), ('ior', a, b)),
+   (('bcsel', a, b, False), ('iand', a, b)),
+   (('bcsel', a, b, a), ('iand', a, b)),
    (('fmin', a, a), a),
    (('fmax', a, a), a),
    (('imin', a, a), a),