Mesa (master): i965/fs: Do not move MOVs writing the flag outside of control flow
Matt Turner
mattst88 at kemper.freedesktop.org
Fri Jul 21 00:03:33 UTC 2017
Module: Mesa
Branch: master
Commit: 823893051052c55baece54449ba1f7c2669f4d33
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=823893051052c55baece54449ba1f7c2669f4d33
Author: Matt Turner <mattst88 at gmail.com>
Date: Fri Jun 30 14:58:22 2017 -0700
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 <kenneth at whitecape.org>
---
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 8cd897f72e..fd02792beb 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;
More information about the mesa-commit
mailing list