summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2014-11-10 22:02:38 -0800
committerMatt Turner <[email protected]>2014-11-11 09:41:06 -0800
commit4001181ba37f2a79129fe52c489e626724c390dd (patch)
treee5652aa714230b2f53e6d84e139848ed96eb5b9e
parent20a061d2b4c327d154b2067a611a2ac3f2e39698 (diff)
i965/fs: Don't use if_block/else_block in SEL peephole.
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
index c3bfd00e70d..f18589cbe99 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
@@ -132,16 +132,21 @@ fs_visitor::opt_peephole_sel()
if (if_inst->opcode != BRW_OPCODE_IF)
continue;
- if (!block->else_block)
- continue;
-
- assert(block->else_block->end()->opcode == BRW_OPCODE_ELSE);
-
fs_inst *else_mov[MAX_MOVS] = { NULL };
fs_inst *then_mov[MAX_MOVS] = { NULL };
bblock_t *then_block = block->next();
- bblock_t *else_block = block->else_block->next();
+ bblock_t *else_block = NULL;
+ foreach_list_typed(bblock_link, child, link, &block->children) {
+ if (child->block != then_block) {
+ if (child->block->prev()->end()->opcode == BRW_OPCODE_ELSE) {
+ else_block = child->block;
+ }
+ break;
+ }
+ }
+ if (else_block == NULL)
+ continue;
int movs = count_movs_from_if(then_mov, else_mov, then_block, else_block);