radv: rework nir_lower_bit_size callback and run DA on GFX8+

No fossil-db changes.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4791>
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 61ec858..e19e98f 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2950,29 +2950,61 @@
 static unsigned
 lower_bit_size_callback(const nir_alu_instr *alu, void *_)
 {
-	if (nir_op_is_vec(alu->op))
-		return 0;
+	struct radv_device *device = _;
+	enum chip_class chip = device->physical_device->rad_info.chip_class;
 
-	unsigned bit_size = alu->dest.dest.ssa.bit_size;
-	if (nir_alu_instr_is_comparison(alu))
-		bit_size = nir_src_bit_size(alu->src[0].src);
+	if (alu->dest.dest.ssa.bit_size & (8 | 16)) {
+		switch (alu->op) {
+		case nir_op_iabs:
+		case nir_op_iadd:
+		case nir_op_iand:
+		case nir_op_bitfield_select:
+		case nir_op_udiv:
+		case nir_op_idiv:
+		case nir_op_imax:
+		case nir_op_umax:
+		case nir_op_imin:
+		case nir_op_umin:
+		case nir_op_umod:
+		case nir_op_imod:
+		case nir_op_imul:
+		case nir_op_imul_high:
+		case nir_op_umul_high:
+		case nir_op_ineg:
+		case nir_op_inot:
+		case nir_op_ior:
+		case nir_op_irem:
+		case nir_op_ishl:
+		case nir_op_ishr:
+		case nir_op_ushr:
+		case nir_op_isign:
+		case nir_op_isub:
+		case nir_op_ixor:
+			return 32;
+		default:
+			return 0;
+		}
+	}
 
-	if (bit_size >= 32 || bit_size == 1)
-		return 0;
+	if (nir_src_bit_size(alu->src[0].src) & (8 | 16)) {
+		switch (alu->op) {
+		case nir_op_bit_count:
+		case nir_op_find_lsb:
+		case nir_op_ufind_msb:
+		case nir_op_ieq:
+		case nir_op_ige:
+		case nir_op_uge:
+		case nir_op_ilt:
+		case nir_op_ult:
+		case nir_op_ine:
+		case nir_op_i2b1:
+			return 32;
+		default:
+			return 0;
+		}
+	}
 
-	if (alu->op == nir_op_bcsel)
-		return 0;
-
-	const nir_op_info *info = &nir_op_infos[alu->op];
-
-	if (info->is_conversion)
-		return 0;
-
-	bool is_integer = info->output_type & (nir_type_uint | nir_type_int);
-	for (unsigned i = 0; is_integer && (i < info->num_inputs); i++)
-		is_integer = info->input_types[i] & (nir_type_uint | nir_type_int);
-
-	return is_integer ? 32 : 0;
+	return 0;
 }
 
 VkResult radv_create_shaders(struct radv_pipeline *pipeline,
@@ -3178,10 +3210,20 @@
 				NIR_PASS_V(nir[i], nir_opt_cse);
 			}
 
-			if (nir_lower_bit_size(nir[i], lower_bit_size_callback, NULL)) {
-				nir_lower_idiv(nir[i], nir_lower_idiv_precise);
-				nir_opt_constant_folding(nir[i]);
-				nir_opt_dce(nir[i]);
+			if (nir[i]->info.bit_sizes_int & (8 | 16)) {
+				if (device->physical_device->rad_info.chip_class >= GFX8) {
+					nir_convert_to_lcssa(nir[i], true, true);
+					nir_divergence_analysis(nir[i]);
+				}
+
+				if (nir_lower_bit_size(nir[i], lower_bit_size_callback, device)) {
+					nir_lower_idiv(nir[i], nir_lower_idiv_precise);
+					nir_opt_constant_folding(nir[i]);
+					nir_opt_dce(nir[i]);
+				}
+
+				if (device->physical_device->rad_info.chip_class >= GFX8)
+					nir_opt_remove_phis(nir[i]); /* cleanup LCSSA phis */
 			}
 
 			/* cleanup passes */