From 5ec75ca10d3dbffb94582cfb7663a2ad1bca53d5 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Thu, 3 Feb 2022 18:26:40 -0800 Subject: [PATCH] intel/compiler: Teach signed integer range analysis about imax and imin This is especially helpful for a*isign(a) generated by idiv_by_const optimization. On many GPUs, isign(a) is lowered to imax(imin(a, 1), -1). There are no changes on fossil-db because ANV uses a different optimization path for idiv with a constant denominator. A future MR will change this. NOTE: This commit used to help a few hundred shader-db shaders, but now none are affected. I suspect this is due to some change in the idiv_by_const optimization. This could possibly be dropped. Reviewed-by: Caio Oliveira Part-of: --- .../compiler/brw_nir_opt_peephole_imul32x16.c | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/intel/compiler/brw_nir_opt_peephole_imul32x16.c b/src/intel/compiler/brw_nir_opt_peephole_imul32x16.c index 3762150924e..fb2522befae 100644 --- a/src/intel/compiler/brw_nir_opt_peephole_imul32x16.c +++ b/src/intel/compiler/brw_nir_opt_peephole_imul32x16.c @@ -122,6 +122,38 @@ signed_integer_range_analysis(nir_shader *shader, struct hash_table *range_ht, return root ^ integer_neg; } + case nir_op_imax: { + int src0_lo, src0_hi; + int src1_lo, src1_hi; + + signed_integer_range_analysis(shader, range_ht, + nir_ssa_scalar_chase_alu_src(scalar, 0), + &src0_lo, &src0_hi); + signed_integer_range_analysis(shader, range_ht, + nir_ssa_scalar_chase_alu_src(scalar, 1), + &src1_lo, &src1_hi); + + *lo = MAX2(src0_lo, src1_lo); + *hi = MAX2(src0_hi, src1_hi); + break; + } + + case nir_op_imin: { + int src0_lo, src0_hi; + int src1_lo, src1_hi; + + signed_integer_range_analysis(shader, range_ht, + nir_ssa_scalar_chase_alu_src(scalar, 0), + &src0_lo, &src0_hi); + signed_integer_range_analysis(shader, range_ht, + nir_ssa_scalar_chase_alu_src(scalar, 1), + &src1_lo, &src1_hi); + + *lo = MIN2(src0_lo, src1_lo); + *hi = MIN2(src0_hi, src1_hi); + break; + } + default: break; }