nir: Turn imov/fmov of undef into undef
authorTimothy Arceri <timothy.arceri@collabora.com>
Thu, 15 Dec 2016 23:17:33 +0000 (10:17 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Fri, 16 Dec 2016 09:32:59 +0000 (20:32 +1100)
Reverting the previous attempt at this a5502a721fd30fd resulted in
the following Vulkan test failing.

dEQP-VK.glsl.return.return_in_dynamic_loop_dynamic_vertex

This time we use the num_components from the alu dest rather than
num_inputs to the op to determine the size of the undef.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "13.0" <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99100

src/compiler/nir/nir_opt_undef.c

index c4777a86c8f3cb26eab3dc7c78492b80e65a396f..8d3210c637e0232b4125fdba5d37e620a33c4dd1 100644 (file)
@@ -79,22 +79,22 @@ opt_undef_vecN(nir_builder *b, nir_alu_instr *alu)
 {
    if (alu->op != nir_op_vec2 &&
        alu->op != nir_op_vec3 &&
-       alu->op != nir_op_vec4)
+       alu->op != nir_op_vec4 &&
+       alu->op != nir_op_fmov &&
+       alu->op != nir_op_imov)
       return false;
 
    assert(alu->dest.dest.is_ssa);
 
-   unsigned num_components = nir_op_infos[alu->op].num_inputs;
-
-   for (unsigned i = 0; i < num_components; i++) {
+   for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
       if (!alu->src[i].src.is_ssa ||
           alu->src[i].src.ssa->parent_instr->type != nir_instr_type_ssa_undef)
          return false;
    }
 
    b->cursor = nir_before_instr(&alu->instr);
-   nir_ssa_def *undef =
-      nir_ssa_undef(b, num_components, nir_dest_bit_size(alu->dest.dest));
+   nir_ssa_def *undef = nir_ssa_undef(b, alu->dest.dest.ssa.num_components,
+                                      nir_dest_bit_size(alu->dest.dest));
    nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, nir_src_for_ssa(undef));
 
    return true;