vc4: Convert vc4_opt_peephole_sf to work with control flow.

We need to apply the peephole pass to each of the blocks in the program.
We don't do dataflow analysis for SF across blocks, but we also don't
generate code that would need us to do so.
This commit is contained in:
Eric Anholt 2016-07-08 16:59:15 -07:00
parent 6c1f834a23
commit 0c923e6c33

View file

@ -106,18 +106,21 @@ inst_result_equals(struct qinst *a, struct qinst *b)
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->cur_block->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.
@ -153,3 +156,14 @@ qir_opt_peephole_sf(struct vc4_compile *c)
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;
}