diff options
author | Eric Anholt <[email protected]> | 2013-02-05 15:36:18 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-02-17 14:20:39 -0800 |
commit | aaee8623052f55fd0237a360784c98dfc10e26f5 (patch) | |
tree | dbd90abce59b264626c17ad31c6cd4523928c1f9 | |
parent | b84d9aa0c661753d486bc87bc22198c5798947a8 (diff) |
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 <[email protected]>
(cherry picked from commit bf91f0b03942d966cf453201dc52c4aa4049f8fa)
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 35 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp | 9 |
3 files changed, 22 insertions, 23 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 8e57eb0fd09..8dab4317c10 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -328,6 +328,23 @@ fs_inst::is_math() } 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() { return (opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7 || @@ -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 && diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index d332502bde0..88fecb90494 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -178,6 +178,7 @@ public: bool overwrites_reg(const fs_reg ®); bool is_tex(); bool is_math(); + bool is_control_flow(); bool is_send_from_grf(); fs_reg dst; diff --git a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp index 3fbca6c4a13..c125928ee7d 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp @@ -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); |