diff options
author | Kenneth Graunke <[email protected]> | 2016-12-14 17:56:35 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2017-01-17 21:45:00 -0800 |
commit | 90bf39cd2b39874557a7c492d92b85945d45f3c6 (patch) | |
tree | ee4fdb5efaecd6c9059ed6222d08e4ec01af0cc5 /src/mesa/drivers/dri | |
parent | be5f53e769deb936509efd6f0576b15b7a5432b9 (diff) |
i965: Combine some dead code elimination NOP'ing code.
In theory we might have incorrectly NOP'd instructions that write the
flag, but where that flag value isn't used, and yet the instruction
either writes the accumulator or has side effects.
I don't believe any such instructions exist, so this is mostly a
code cleanup.
Curro pointed out that FS_OPCODE_FB_WRITE has a null destination and
actually writes the flag on Gen4-5 to dynamically decide whether to
write some payload data. The hunk removed in this patch might have
NOP'd it, except that we don't actually mark flags_written() in the
IR, so it doesn't think the flag is touched at all. That's sketchy,
but it means it wouldn't hit this today (though there are likely other
problems!).
v2: Properly replace the inst->regs_written() check in the second
hunk with the flag being live (mistake caught by Curro).
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp | 9 |
1 files changed, 1 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp b/src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp index 04901a97e40..0dd609121ca 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp @@ -70,17 +70,10 @@ fs_visitor::dead_code_eliminate() } } - if (inst->dst.is_null() && inst->flags_written()) { - if (!(flag_live[0] & inst->flags_written())) { - inst->opcode = BRW_OPCODE_NOP; - progress = true; - } - } - if (inst->dst.is_null() && !inst->is_control_flow() && !inst->has_side_effects() && - !inst->flags_written() && + !(flag_live[0] & inst->flags_written()) && !inst->writes_accumulator) { inst->opcode = BRW_OPCODE_NOP; progress = true; |