*/
switch (writer->dst.file) {
case QFILE_TEMP:
- for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) {
+ for (int i = 0; i < qir_get_nsrc(inst); i++) {
if (inst->src[i].file == QFILE_TEMP &&
inst->src[i].index == writer->dst.index) {
return true;
return false;
}
- for (int i = 0; i < qir_get_op_nsrc(a->op); i++) {
+ for (int i = 0; i < qir_get_nsrc(a); i++) {
if (!qir_reg_equals(a->src[i], b->src[i]) ||
src_file_varies_on_reread(a->src[i]) ||
src_file_varies_on_reread(b->src[i])) {
return true;
}
-bool
-qir_opt_peephole_sf(struct vc4_compile *c)
+static bool
+qir_opt_peephole_sf_block(struct vc4_compile *c, struct qblock *block)
{
bool progress = false;
+ /* We don't have liveness dataflow analysis for flags, but we also
+ * never generate a use of flags across control flow, so just treat
+ * them as unused at block exit.
+ */
bool sf_live = false;
struct qinst *last_sf = NULL;
/* Walk the block from bottom to top, tracking if the SF is used, and
* removing unused or repeated ones.
*/
- list_for_each_entry_rev(struct qinst, inst, &c->instructions, link) {
+ qir_for_each_inst_rev(inst, block) {
if (inst->sf) {
if (!sf_live) {
/* Our instruction's SF isn't read, so drop it.
return progress;
}
+
+bool
+qir_opt_peephole_sf(struct vc4_compile *c)
+{
+ bool progress = false;
+
+ qir_for_each_block(block, c)
+ progress = qir_opt_peephole_sf_block(c, block) || progress;
+
+ return progress;
+}