Mesa (main): nir: Do peephole select on other instructions if the limit is ~0.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 18 05:01:20 UTC 2021
Module: Mesa
Branch: main
Commit: 47804f53f991c3467671e05421df437b0f34eb22
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=47804f53f991c3467671e05421df437b0f34eb22
Author: Eric Anholt <eric at anholt.net>
Date: Wed Aug 12 11:17:28 2020 -0700
nir: Do peephole select on other instructions if the limit is ~0.
limit==0 is the signal for "don't peephole anything but a move that will
be optimized aways." limit > 0 is "up to N alu instructions may be moved
out." nir-to-tgsi uses ~0 as the indicator of "No, we really need to
eliminate all if instructions" on hardware like i915 that doesn't have
control flow.
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11329>
---
src/compiler/nir/nir_opt_peephole_select.c | 34 +++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c
index 62530ddd793..dec36670cbc 100644
--- a/src/compiler/nir/nir_opt_peephole_select.c
+++ b/src/compiler/nir/nir_opt_peephole_select.c
@@ -61,9 +61,37 @@
static bool
block_check_for_allowed_instrs(nir_block *block, unsigned *count,
- bool alu_ok, bool indirect_load_ok,
+ unsigned limit, bool indirect_load_ok,
bool expensive_alu_ok)
{
+ bool alu_ok = limit != 0;
+
+ /* Used on non-control-flow HW to flatten all IFs. */
+ if (limit == ~0) {
+ nir_foreach_instr(instr, block) {
+ switch (instr->type) {
+ case nir_instr_type_alu:
+ case nir_instr_type_deref:
+ case nir_instr_type_load_const:
+ case nir_instr_type_phi:
+ case nir_instr_type_ssa_undef:
+ case nir_instr_type_tex:
+ break;
+
+ case nir_instr_type_intrinsic:
+ if (!nir_intrinsic_can_reorder(nir_instr_as_intrinsic(instr)))
+ return false;
+ break;
+
+ case nir_instr_type_call:
+ case nir_instr_type_jump:
+ case nir_instr_type_parallel_copy:
+ return false;
+ }
+ }
+ return true;
+ }
+
nir_foreach_instr(instr, block) {
switch (instr->type) {
case nir_instr_type_intrinsic: {
@@ -379,9 +407,9 @@ nir_opt_peephole_select_block(nir_block *block, nir_shader *shader,
/* ... and those blocks must only contain "allowed" instructions. */
unsigned count = 0;
- if (!block_check_for_allowed_instrs(then_block, &count, limit != 0,
+ if (!block_check_for_allowed_instrs(then_block, &count, limit,
indirect_load_ok, expensive_alu_ok) ||
- !block_check_for_allowed_instrs(else_block, &count, limit != 0,
+ !block_check_for_allowed_instrs(else_block, &count, limit,
indirect_load_ok, expensive_alu_ok))
return false;
More information about the mesa-commit
mailing list