From bf91f0b03942d966cf453201dc52c4aa4049f8fa Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 5 Feb 2013 15:36:18 -0800 Subject: [PATCH] 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 --- src/mesa/drivers/dri/i965/brw_fs.cpp | 35 ++++++++++++---------- src/mesa/drivers/dri/i965/brw_fs.h | 1 + .../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 8e57eb0..8dab431 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 d332502..88fecb9 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 3fbca6c..c125928 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); -- 2.7.4