From 823893051052c55baece54449ba1f7c2669f4d33 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Fri, 30 Jun 2017 14:58:22 -0700 Subject: [PATCH] i965/fs: Do not move MOVs writing the flag outside of control flow The implementation of ballotARB() will start by zeroing the flags register. So, a doing something like if (gl_SubGroupInvocationARB % 2u == 0u) { ... = ballotARB(true); [...] } else { ... = ballotARB(true); [...] } (like fs-ballot-if-else.shader_test does) would generate identical MOVs to the same destination (the flag register!), and we definitely do not want to pull that out of the control flow. Reviewed-by: Kenneth Graunke --- src/intel/compiler/brw_fs_sel_peephole.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/intel/compiler/brw_fs_sel_peephole.cpp b/src/intel/compiler/brw_fs_sel_peephole.cpp index 8cd897f72e0..fd02792bebc 100644 --- a/src/intel/compiler/brw_fs_sel_peephole.cpp +++ b/src/intel/compiler/brw_fs_sel_peephole.cpp @@ -68,7 +68,8 @@ count_movs_from_if(fs_inst *then_mov[MAX_MOVS], fs_inst *else_mov[MAX_MOVS], { int then_movs = 0; foreach_inst_in_block(fs_inst, inst, then_block) { - if (then_movs == MAX_MOVS || inst->opcode != BRW_OPCODE_MOV) + if (then_movs == MAX_MOVS || inst->opcode != BRW_OPCODE_MOV || + inst->flags_written()) break; then_mov[then_movs] = inst; @@ -77,7 +78,8 @@ count_movs_from_if(fs_inst *then_mov[MAX_MOVS], fs_inst *else_mov[MAX_MOVS], int else_movs = 0; foreach_inst_in_block(fs_inst, inst, else_block) { - if (else_movs == MAX_MOVS || inst->opcode != BRW_OPCODE_MOV) + if (else_movs == MAX_MOVS || inst->opcode != BRW_OPCODE_MOV || + inst->flags_written()) break; else_mov[else_movs] = inst; -- 2.30.2