summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2018-09-12 17:16:50 -0700
committerIan Romanick <[email protected]>2018-09-17 00:38:22 -0700
commitdf9dbc03d3df37c10f2d7b73124f8b3fd7a2518f (patch)
tree6e64b111bc87f2e6e8e6e485aa6b5be55ad51e77 /src
parent0dd8189f159258ad8684036b0d696dbb58a268ca (diff)
i965/fs: Don't propagate conditional modifiers from integer compares to adds
No shader-db changes on any Intel platform... which probably explains why no bugs have been bisected to this problem since it landed in Mesa 18.1. :( The commit mentioned below is in 18.2, so 18.1 would need a slightly different fix (due to code refactoring). Signed-off-by: Ian Romanick <[email protected]> Fixes: 77f269bb560 "i965/fs: Refactor propagation of conditional modifiers from compares to adds" Reviewed-by: Alejandro PiƱeiro <[email protected]> (reviewed the original patch) Cc: Matt Turner <[email protected]> (reviewed the original patch)
Diffstat (limited to 'src')
-rw-r--r--src/intel/compiler/brw_fs_cmod_propagation.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/intel/compiler/brw_fs_cmod_propagation.cpp b/src/intel/compiler/brw_fs_cmod_propagation.cpp
index 5b74f267359..5fb522f810f 100644
--- a/src/intel/compiler/brw_fs_cmod_propagation.cpp
+++ b/src/intel/compiler/brw_fs_cmod_propagation.cpp
@@ -211,9 +211,17 @@ opt_cmod_propagation_local(const gen_device_info *devinfo, bblock_t *block)
/* A CMP with a second source of zero can match with anything. A CMP
* with a second source that is not zero can only match with an ADD
* instruction.
+ *
+ * Only apply this optimization to float-point sources. It can fail for
+ * integers. For inputs a = 0x80000000, b = 4, int(0x80000000) < 4, but
+ * int(0x80000000) - 4 overflows and results in 0x7ffffffc. that's not
+ * less than zero, so the flags get set differently than for (a < b).
*/
if (inst->opcode == BRW_OPCODE_CMP && !inst->src[1].is_zero()) {
- progress = cmod_propagate_cmp_to_add(devinfo, block, inst) || progress;
+ if (brw_reg_type_is_floating_point(inst->src[0].type) &&
+ cmod_propagate_cmp_to_add(devinfo, block, inst))
+ progress = true;
+
continue;
}