diff options
Diffstat (limited to 'src/compiler/nir/nir_opt_algebraic.py')
-rw-r--r-- | src/compiler/nir/nir_opt_algebraic.py | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 0a7369cd44d..e22e5bcb548 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -1597,6 +1597,19 @@ late_optimizations = [ (('fne', ('fneg', a), -1.0), ('fne', 1.0, a)), (('feq', -1.0, ('fneg', a)), ('feq', a, 1.0)), + # Replace signed range [0, constant b] checks with unsigned comparisons. + # This is limited to constant values because we have to ensure that "b" is + # not negative. + (('iand', ('ige', 'a@32', 0), ('ilt', a, '#b(is_ult_80000000)')), ('ult', a, b)), + (('iand', ('ige', 'a@32', 0), ('ige', '#b(is_ult_80000000)', a)), ('uge', b, a)), + (('iand', ('ilt', -1, 'a@32'), ('ilt', a, '#b(is_ult_80000000)')), ('ult', a, b)), + (('iand', ('ilt', -1, 'a@32'), ('ige', '#b(is_ult_80000000)', a)), ('uge', b, a)), + + (('ior', ('ilt', 'a@32', 0), ('ige', a, '#b(is_ult_80000000)')), ('uge', a, b)), + (('ior', ('ilt', 'a@32', 0), ('ilt', '#b(is_ult_80000000)', a)), ('ult', b, a)), + (('ior', ('ige', -1, 'a@32'), ('ige', a, '#b(is_ult_80000000)')), ('uge', a, b)), + (('ior', ('ige', -1, 'a@32'), ('ilt', '#b(is_ult_80000000)', a)), ('ult', b, a)), + (('ior', a, a), a), (('iand', a, a), a), |