From 7f2130c86e17f936be66fa6ad8eda85746b5fc6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 9 May 2026 15:51:21 -0400 Subject: [PATCH] nir/opt_algebraic: add more ffract/ffloor/ftrunc/f2u/f2i patterns Totals from 1390 (0.69% of 202429) affected shaders: MaxWaves: 33336 -> 33348 (+0.04%) Instrs: 4101809 -> 4095218 (-0.16%); split: -0.17%, +0.01% CodeSize: 22973700 -> 22944812 (-0.13%); split: -0.13%, +0.00% VGPRs: 95592 -> 95460 (-0.14%); split: -0.15%, +0.01% SpillSGPRs: 2910 -> 2913 (+0.10%) Latency: 27815305 -> 27807064 (-0.03%); split: -0.06%, +0.03% InvThroughput: 4563067 -> 4555622 (-0.16%); split: -0.18%, +0.02% VClause: 98544 -> 98570 (+0.03%); split: -0.04%, +0.06% SClause: 91148 -> 91149 (+0.00%); split: -0.00%, +0.01% Copies: 324008 -> 324028 (+0.01%); split: -0.10%, +0.10% Branches: 99085 -> 99084 (-0.00%); split: -0.00%, +0.00% PreSGPRs: 70920 -> 70734 (-0.26%); split: -0.27%, +0.00% PreVGPRs: 78288 -> 78190 (-0.13%); split: -0.15%, +0.03% VALU: 2123606 -> 2117766 (-0.28%); split: -0.28%, +0.00% SALU: 621757 -> 621671 (-0.01%); split: -0.02%, +0.00% VMEM: 163395 -> 163387 (-0.00%); split: -0.01%, +0.00% SMEM: 140374 -> 140376 (+0.00%) VOPD: 258332 -> 258264 (-0.03%); split: +0.04%, -0.07% Reviewed-by: Georg Lehmann Part-of: --- src/compiler/nir/nir_opt_algebraic.py | 9 ++++++ src/compiler/nir/nir_search_helpers.h | 1 + .../drivers/virgl/ci/virgl-gl-fails.txt | 30 +++++++++++++++++++ .../drivers/virgl/ci/virgl-gl-skips.txt | 4 +++ .../drivers/virgl/ci/virgl-gles-fails.txt | 30 +++++++++++++++++++ .../drivers/virgl/ci/virgl-gles-skips.txt | 4 +++ .../drivers/virgl/ci/virpipe-gl-fails.txt | 11 +++++++ .../drivers/virgl/ci/virpipe-gl-skips.txt | 3 ++ 8 files changed, 92 insertions(+) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 1d4abd0fe42..50f50029067 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -1916,6 +1916,10 @@ optimizations.extend([ (('f2u', ('ftrunc', 'a(is_not_negative)')), ('f2u', a)), (('f2i', ('ffloor', 'a(is_not_negative)')), ('f2i', a)), (('f2u', ('ffloor', a)), ('f2u', a)), + (('f2u(contract)', ('fadd', 'a(is_integral_not_negative)', 'b(is_a_number_gt_0_and_lt_1)')), ('f2u', a)), + (('f2i(contract)', ('fadd', 'a(is_integral_not_negative)', 'b(is_a_number_gt_0_and_lt_1)')), ('f2i', a)), + (('f2u32', ('u2f32', 'a@16')), ('u2u32', a)), + (('f2i32', ('u2f32', 'a@16')), ('u2u32', a)), # Section 3.3.11 (Conversion Instructions) of the SPIR-V 1.6 spec says: # @@ -1973,8 +1977,13 @@ optimizations.extend([ (('ftrunc', 'a(is_integral)'), a), (('fround_even', 'a(is_integral)'), a), + (('ffract(nnan,contract)', ('fadd', a, 'b(is_integral)')), ('ffract', a)), + (('ffloor(nsz,contract)', ('fadd', 'a(is_a_number_gt_0_and_lt_1)', 'b(is_integral)')), b), + (('ftrunc(nsz,contract)', ('fadd', 'a(is_a_number_gt_0_and_lt_1)', 'b(is_integral_not_negative)')), b), + # fract(x) = x - floor(x), so fract(NaN/Inf) = NaN (('ffract(nnan)', 'a(is_integral)'), 0.0), + (('ffract', 'a(is_a_number_gt_0_and_lt_1)'), a), (('ffract', ('ffract', a)), ('ffract', a)), (('fabs(nsz)', 'a(is_not_negative)'), ('fcanonicalize', a)), (('fabs', 'a(is_not_negative_or_negative_zero)'), ('fcanonicalize', a)), diff --git a/src/compiler/nir/nir_search_helpers.h b/src/compiler/nir/nir_search_helpers.h index 2b1cc9f6f41..010eb9900d9 100644 --- a/src/compiler/nir/nir_search_helpers.h +++ b/src/compiler/nir/nir_search_helpers.h @@ -921,6 +921,7 @@ RELATION(a_number, FP_CLASS_NAN) RELATION(finite, FP_CLASS_ANY_INF | FP_CLASS_NAN) RELATION(finite_not_zero, FP_CLASS_ANY_INF | FP_CLASS_NAN | FP_CLASS_ANY_ZERO) RELATION(integral, FP_CLASS_NON_INTEGRAL) +RELATION(integral_not_negative, FP_CLASS_ANY_NEG | FP_CLASS_NON_INTEGRAL) static inline bool compare_component(const nir_alu_instr *instr, unsigned src, unsigned component, diff --git a/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt b/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt index 27e2d8feb7a..77ac1cffca8 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt @@ -224,3 +224,33 @@ dEQP-GLES3.functional.transform_feedback.random.separate.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.4,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.1,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.struct.uniform.not_equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.basic_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.for_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.if_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.scope_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_2_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_if_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail diff --git a/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt b/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt index 5fc9f2d6e2c..f8993cfac95 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt @@ -14,3 +14,7 @@ dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays. dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.22 KHR-GL.*.texture_swizzle.smoke + +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment diff --git a/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt b/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt index 5826d97ca65..64d19d6721e 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt @@ -220,3 +220,33 @@ dEQP-GLES3.functional.transform_feedback.random.separate.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.4,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.1,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.struct.uniform.not_equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.basic_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.for_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.if_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.scope_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_2_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_if_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail diff --git a/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt b/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt index d0782cc02b1..bc146d61eeb 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt @@ -10,3 +10,7 @@ dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays. # Sometimes crashes, e.g. https://gitlab.freedesktop.org/kusma/mesa/-/jobs/4109419 dEQP-GLES31.functional.compute.basic.empty + +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt index c83822ead15..1a658979b6c 100644 --- a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt +++ b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt @@ -609,3 +609,14 @@ dEQP-GLES3.functional.transform_feedback.random_full_array_capture.interleaved.p dEQP-GLES3.functional.transform_feedback.random_full_array_capture.interleaved.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.lines.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.4,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail \ No newline at end of file diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt b/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt index 7b63e6b5af1..bb3ccc89de4 100644 --- a/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt +++ b/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt @@ -22,3 +22,6 @@ spec@ext_framebuffer_object@fbo-blending-formats # uprev Piglit in Mesa spec@egl_ext_protected_content@conformance +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment