X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_opt_idiv_const.c;h=49130f66dd88bb1184e92635520e8a876b18da38;hb=43d22c8f2011b780467df97e58981522edccfa21;hp=8f70821ca2fba37c4488e5d4028bde6a2e7a4cd2;hpb=14531d676b11999123c04fb7569ab80c9f150180;p=mesa.git diff --git a/src/compiler/nir/nir_opt_idiv_const.c b/src/compiler/nir/nir_opt_idiv_const.c index 8f70821ca2f..49130f66dd8 100644 --- a/src/compiler/nir/nir_opt_idiv_const.c +++ b/src/compiler/nir/nir_opt_idiv_const.c @@ -32,18 +32,18 @@ build_udiv(nir_builder *b, nir_ssa_def *n, uint64_t d) if (d == 0) { return nir_imm_intN_t(b, 0, n->bit_size); } else if (util_is_power_of_two_or_zero64(d)) { - return nir_ushr(b, n, nir_imm_int(b, util_logbase2_64(d))); + return nir_ushr_imm(b, n, util_logbase2_64(d)); } else { struct util_fast_udiv_info m = util_compute_fast_udiv_info(d, n->bit_size, n->bit_size); if (m.pre_shift) - n = nir_ushr(b, n, nir_imm_int(b, m.pre_shift)); + n = nir_ushr_imm(b, n, m.pre_shift); if (m.increment) n = nir_uadd_sat(b, n, nir_imm_intN_t(b, m.increment, n->bit_size)); n = nir_umul_high(b, n, nir_imm_intN_t(b, m.multiplier, n->bit_size)); if (m.post_shift) - n = nir_ushr(b, n, nir_imm_int(b, m.post_shift)); + n = nir_ushr_imm(b, n, m.post_shift); return n; } @@ -65,15 +65,16 @@ build_umod(nir_builder *b, nir_ssa_def *n, uint64_t d) static nir_ssa_def * build_idiv(nir_builder *b, nir_ssa_def *n, int64_t d) { + uint64_t abs_d = d < 0 ? -d : d; + if (d == 0) { return nir_imm_intN_t(b, 0, n->bit_size); } else if (d == 1) { return n; } else if (d == -1) { return nir_ineg(b, n); - } else if (util_is_power_of_two_or_zero64(d)) { - uint64_t abs_d = d < 0 ? -d : d; - nir_ssa_def *uq = nir_ishr(b, n, nir_imm_int(b, util_logbase2_64(abs_d))); + } else if (util_is_power_of_two_or_zero64(abs_d)) { + nir_ssa_def *uq = nir_ushr_imm(b, nir_iabs(b, n), util_logbase2_64(abs_d)); nir_ssa_def *n_neg = nir_ilt(b, n, nir_imm_intN_t(b, 0, n->bit_size)); nir_ssa_def *neg = d < 0 ? nir_inot(b, n_neg) : n_neg; return nir_bcsel(b, neg, nir_ineg(b, uq), uq); @@ -88,8 +89,8 @@ build_idiv(nir_builder *b, nir_ssa_def *n, int64_t d) if (d < 0 && m.multiplier > 0) res = nir_isub(b, res, n); if (m.shift) - res = nir_ishr(b, res, nir_imm_int(b, m.shift)); - res = nir_iadd(b, res, nir_ushr(b, res, nir_imm_int(b, n->bit_size - 1))); + res = nir_ishr_imm(b, res, m.shift); + res = nir_iadd(b, res, nir_ushr_imm(b, res, n->bit_size - 1)); return res; } @@ -196,6 +197,8 @@ nir_opt_idiv_const_impl(nir_function_impl *impl, unsigned min_bit_size) if (progress) { nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); + } else { + nir_metadata_preserve(impl, nir_metadata_all); } return progress;