diff --git a/.pick_status.json b/.pick_status.json index 30fdd900926..5b72f93d2d2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2924,7 +2924,7 @@ "description": "nir/opt_intrinsic: rework sample mask opt with vector alu", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d3ce8a7f6b93e893929b81f4d6605a2a968730a1", "notes": null diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index d333a7070fb..f20a7ac6e0c 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -319,24 +319,23 @@ opt_intrinsics_intrin(nir_builder *b, nir_intrinsic_instr *intrin, if (nir_src_parent_instr(use_src)->type == nir_instr_type_alu) { nir_alu_instr *alu = nir_instr_as_alu(nir_src_parent_instr(use_src)); - if (alu->op == nir_op_ieq || - alu->op == nir_op_ine) { - /* Check for 0 in either operand. */ - nir_const_value *const_val = - nir_src_as_const_value(alu->src[0].src); - if (!const_val) - const_val = nir_src_as_const_value(alu->src[1].src); - if (!const_val || const_val->i32 != 0) - continue; + if ((alu->op != nir_op_ieq && alu->op != nir_op_ine) || alu->def.num_components != 1) + continue; - nir_def *new_expr = nir_load_helper_invocation(b, 1); + nir_alu_src *alu_src = list_entry(use_src, nir_alu_src, src); + unsigned src_index = alu_src - alu->src; + nir_scalar other = nir_scalar_chase_alu_src(nir_get_scalar(&alu->def, 0), !src_index); - if (alu->op == nir_op_ine) - new_expr = nir_inot(b, new_expr); + if (!nir_scalar_is_const(other) || nir_scalar_as_uint(other)) + continue; - nir_def_replace(&alu->def, new_expr); - progress = true; - } + nir_def *new_expr = nir_load_helper_invocation(b, 1); + + if (alu->op == nir_op_ine) + new_expr = nir_inot(b, new_expr); + + nir_def_replace(&alu->def, new_expr); + progress = true; } } return progress;