We recorded MOVs in the ACP that had abs modifiers (losing the sign of the original value), and then went ahead and copy propagated that into an expression that needed the original signed value.
NOTE: This is a candidate for stable release branches. Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> --- src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) I think a similar bug exists in register_coalesce()... diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp index 1870f43..d617d8c 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -40,6 +40,10 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry) return false; } + /* If we only have the absolute value, we can't recover the original. */ + if (entry->src.abs && !inst->src[arg].abs) + return false; + /* See resolve_ud_negate() and comment in brw_fs_emit.cpp. */ if (inst->conditional_mod && inst->src[arg].type == BRW_REGISTER_TYPE_UD && @@ -57,7 +61,6 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry) inst->src[arg].reg_offset = entry->src.reg_offset; if (!inst->src[arg].abs) { - inst->src[arg].abs = entry->src.abs; inst->src[arg].negate ^= entry->src.negate; } -- 1.7.11.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev