i965/fs: Use a helper function for checking for flow control instructions.

In 2 of our checks, we were missing BREAK and CONTINUE.

NOTE: Candidate for the stable branches.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Eric Anholt
2013-02-05 15:36:18 -08:00
parent ce3dfa19ab
commit bf91f0b039
3 changed files with 22 additions and 23 deletions
+20 -15
View File
@@ -327,6 +327,23 @@ fs_inst::is_math()
opcode == SHADER_OPCODE_POW);
}
bool
fs_inst::is_control_flow()
{
switch (opcode) {
case BRW_OPCODE_DO:
case BRW_OPCODE_WHILE:
case BRW_OPCODE_IF:
case BRW_OPCODE_ELSE:
case BRW_OPCODE_ENDIF:
case BRW_OPCODE_BREAK:
case BRW_OPCODE_CONTINUE:
return true;
default:
return false;
}
}
bool
fs_inst::is_send_from_grf()
{
@@ -2070,16 +2087,12 @@ fs_visitor::compute_to_mrf()
break;
}
/* We don't handle flow control here. Most computation of
/* We don't handle control flow here. Most computation of
* values that end up in MRFs are shortly before the MRF
* write anyway.
*/
if (scan_inst->opcode == BRW_OPCODE_DO ||
scan_inst->opcode == BRW_OPCODE_WHILE ||
scan_inst->opcode == BRW_OPCODE_ELSE ||
scan_inst->opcode == BRW_OPCODE_ENDIF) {
if (scan_inst->is_control_flow() && scan_inst->opcode != BRW_OPCODE_IF)
break;
}
/* You can't read from an MRF, so if someone else reads our
* MRF's source GRF that we wanted to rewrite, that stops us.
@@ -2163,16 +2176,8 @@ fs_visitor::remove_duplicate_mrf_writes()
foreach_list_safe(node, &this->instructions) {
fs_inst *inst = (fs_inst *)node;
switch (inst->opcode) {
case BRW_OPCODE_DO:
case BRW_OPCODE_WHILE:
case BRW_OPCODE_IF:
case BRW_OPCODE_ELSE:
case BRW_OPCODE_ENDIF:
if (inst->is_control_flow()) {
memset(last_mrf_move, 0, sizeof(last_mrf_move));
continue;
default:
break;
}
if (inst->opcode == BRW_OPCODE_MOV &&
+1
View File
@@ -178,6 +178,7 @@ public:
bool overwrites_reg(const fs_reg &reg);
bool is_tex();
bool is_math();
bool is_control_flow();
bool is_send_from_grf();
fs_reg dst;
@@ -816,15 +816,8 @@ fs_visitor::schedule_instructions(bool post_reg_alloc)
next_block_header = (fs_inst *)next_block_header->next;
sched.add_inst(inst);
if (inst->opcode == BRW_OPCODE_IF ||
inst->opcode == BRW_OPCODE_ELSE ||
inst->opcode == BRW_OPCODE_ENDIF ||
inst->opcode == BRW_OPCODE_DO ||
inst->opcode == BRW_OPCODE_WHILE ||
inst->opcode == BRW_OPCODE_BREAK ||
inst->opcode == BRW_OPCODE_CONTINUE) {
if (inst->is_control_flow())
break;
}
}
sched.calculate_deps();
sched.schedule_instructions(next_block_header);