intel/compiler: Don't copy prop source mods into PICK_HIGH_32BIT
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 22 Apr 2020 22:03:03 +0000 (15:03 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 23 Apr 2020 00:03:18 +0000 (17:03 -0700)
VEC4_OPCODE_PICK_HIGH_32BIT performs 32-bit UD access on a 64-bit DF
value.  abs and negate make sense on DF, but break entirely when
trying to access pieces of the value as unsigned integer dwords.

Fixes an fsign Piglit test on Ivybridge:
tests/spec/arb_gpu_shader_fp64/execution/built-in-functions/vs-sign-neg-abs

It had regressed when I removed nir_lower_to_source_modifiers, as that
caused us to start generating different code which provoked this bug.

Fixes: b7c47c4f7cf ("intel/compiler: Drop nir_lower_to_source_mods() and related handling.")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2817
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4691>

src/intel/compiler/brw_vec4_copy_propagation.cpp

index 597e75c8b899e51815f8965ba82b3c0bd28a7cda..8fb5d1c245101c36281dfd5009bc89d36d226406 100644 (file)
@@ -381,7 +381,8 @@ try_copy_propagate(const struct gen_device_info *devinfo,
       return false;
 
    if (has_source_modifiers &&
-       inst->opcode == SHADER_OPCODE_GEN4_SCRATCH_WRITE)
+       (inst->opcode == SHADER_OPCODE_GEN4_SCRATCH_WRITE ||
+        inst->opcode == VEC4_OPCODE_PICK_HIGH_32BIT))
       return false;
 
    unsigned composed_swizzle = brw_compose_swizzle(inst->src[arg].swizzle,