diff options
-rw-r--r-- | src/gallium/drivers/vc4/Makefile.sources | 1 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_opt_dead_code.c | 17 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_opt_peephole_sf.c | 82 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_qir.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_qir.h | 1 |
5 files changed, 85 insertions, 17 deletions
diff --git a/src/gallium/drivers/vc4/Makefile.sources b/src/gallium/drivers/vc4/Makefile.sources index 0d1d4f799dc..612a0a402a0 100644 --- a/src/gallium/drivers/vc4/Makefile.sources +++ b/src/gallium/drivers/vc4/Makefile.sources @@ -26,6 +26,7 @@ C_SOURCES := \ vc4_opt_constant_folding.c \ vc4_opt_copy_propagation.c \ vc4_opt_dead_code.c \ + vc4_opt_peephole_sf.c \ vc4_opt_small_immediates.c \ vc4_opt_vpm.c \ vc4_program.c \ diff --git a/src/gallium/drivers/vc4/vc4_opt_dead_code.c b/src/gallium/drivers/vc4/vc4_opt_dead_code.c index ad51ed779ea..0256159fc69 100644 --- a/src/gallium/drivers/vc4/vc4_opt_dead_code.c +++ b/src/gallium/drivers/vc4/vc4_opt_dead_code.c @@ -82,7 +82,6 @@ qir_opt_dead_code(struct vc4_compile *c) { bool progress = false; bool *used = calloc(c->num_temps, sizeof(bool)); - bool sf_used = false; list_for_each_entry_safe_rev(struct qinst, inst, &c->instructions, link) { @@ -109,22 +108,6 @@ qir_opt_dead_code(struct vc4_compile *c) continue; } - if (qir_depends_on_flags(inst)) - sf_used = true; - if (inst->sf) { - if (!sf_used) { - if (debug) { - fprintf(stderr, "Removing SF on: "); - qir_dump_inst(c, inst); - fprintf(stderr, "\n"); - } - - inst->sf = false; - progress = true; - } - sf_used = false; - } - for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { if (inst->src[i].file == QFILE_TEMP) used[inst->src[i].index] = true; diff --git a/src/gallium/drivers/vc4/vc4_opt_peephole_sf.c b/src/gallium/drivers/vc4/vc4_opt_peephole_sf.c new file mode 100644 index 00000000000..0bc3e67acb2 --- /dev/null +++ b/src/gallium/drivers/vc4/vc4_opt_peephole_sf.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2016 Broadcom + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file vc4_opt_peephole_sf.c + * + * Quick optimization to eliminate unused SF updates. + */ + +#include "vc4_qir.h" +#include "util/u_math.h" + +static bool debug; + +static void +dump_from(struct vc4_compile *c, struct qinst *inst) +{ + if (!debug) + return; + + fprintf(stderr, "optimizing: "); + qir_dump_inst(c, inst); + fprintf(stderr, "\n"); +} + +static void +dump_to(struct vc4_compile *c, struct qinst *inst) +{ + if (!debug) + return; + + fprintf(stderr, "to: "); + qir_dump_inst(c, inst); + fprintf(stderr, "\n"); +} + +bool +qir_opt_peephole_sf(struct vc4_compile *c) +{ + bool progress = false; + bool sf_live = false; + + /* Walk the block from bottom to top, tracking if the SF is used, and + * removing unused ones. + */ + list_for_each_entry_rev(struct qinst, inst, &c->instructions, link) { + if (inst->sf) { + if (!sf_live) { + dump_from(c, inst); + inst->sf = false; + dump_to(c, inst); + progress = true; + } + sf_live = false; + } + + if (qir_depends_on_flags(inst)) + sf_live = true; + } + + return progress; +} diff --git a/src/gallium/drivers/vc4/vc4_qir.c b/src/gallium/drivers/vc4/vc4_qir.c index 4cdc8a2baae..b36c0d934cc 100644 --- a/src/gallium/drivers/vc4/vc4_qir.c +++ b/src/gallium/drivers/vc4/vc4_qir.c @@ -540,6 +540,7 @@ qir_optimize(struct vc4_compile *c) OPTPASS(qir_opt_algebraic); OPTPASS(qir_opt_constant_folding); OPTPASS(qir_opt_copy_propagation); + OPTPASS(qir_opt_peephole_sf); OPTPASS(qir_opt_dead_code); OPTPASS(qir_opt_small_immediates); OPTPASS(qir_opt_vpm); diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h index c52d824e34e..8813cb4f1ce 100644 --- a/src/gallium/drivers/vc4/vc4_qir.h +++ b/src/gallium/drivers/vc4/vc4_qir.h @@ -496,6 +496,7 @@ bool qir_opt_algebraic(struct vc4_compile *c); bool qir_opt_constant_folding(struct vc4_compile *c); bool qir_opt_copy_propagation(struct vc4_compile *c); bool qir_opt_dead_code(struct vc4_compile *c); +bool qir_opt_peephole_sf(struct vc4_compile *c); bool qir_opt_small_immediates(struct vc4_compile *c); bool qir_opt_vpm(struct vc4_compile *c); void vc4_nir_lower_blend(nir_shader *s, struct vc4_compile *c); |