<div dir="ltr">LGTM<br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Nov 2, 2018 at 8:37 AM Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We cannot use nir_build_alu() to create the new alu as it has no<br>
way to know how many components of the src we will use. This<br>
results in it guessing the max number of components from one of<br>
its inputs.<br>
<br>
Fixes the following CTS tests:<br>
<br>
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag<br>
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom<br>
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_tessc<br>
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_vert<br>
<br>
V2: use nir_src_for_ssa() in clone<br>
<br>
Fixes: 2975422ceb6c ("nir: propagates if condition evaluation down some alu chains")<br>
---<br>
 src/compiler/nir/nir_opt_if.c | 31 ++++++++++++++++++++++++++++++-<br>
 1 file changed, 30 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c<br>
index ed93cac9ce9..8a971c43f24 100644<br>
--- a/src/compiler/nir/nir_opt_if.c<br>
+++ b/src/compiler/nir/nir_opt_if.c<br>
@@ -391,6 +391,34 @@ evaluate_if_condition(nir_if *nif, nir_cursor cursor, bool *value)<br>
    }<br>
 }<br>
<br>
+static nir_ssa_def *<br>
+clone_alu_and_replace_src_defs(nir_builder *b, const nir_alu_instr *alu,<br>
+                               nir_ssa_def **src_defs)<br>
+{<br>
+   nir_alu_instr *nalu = nir_alu_instr_create(b->shader, alu->op);<br>
+   nalu->exact = alu->exact;<br>
+<br>
+   nir_ssa_dest_init(&nalu->instr, &nalu->dest.dest,<br>
+                     alu->dest.dest.ssa.num_components,<br>
+                     alu->dest.dest.ssa.bit_size, alu-><a href="http://dest.dest.ssa.name" rel="noreferrer" target="_blank">dest.dest.ssa.name</a>);<br>
+<br>
+   nalu->dest.saturate = alu->dest.saturate;<br>
+   nalu->dest.write_mask = alu->dest.write_mask;<br>
+<br>
+   for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {<br>
+      assert(alu->src[i].src.is_ssa);<br>
+      nalu->src[i].src = nir_src_for_ssa(src_defs[i]);<br>
+      nalu->src[i].negate = alu->src[i].negate;<br>
+      nalu->src[i].abs = alu->src[i].abs;<br>
+      memcpy(nalu->src[i].swizzle, alu->src[i].swizzle,<br>
+             sizeof(nalu->src[i].swizzle));<br>
+   }<br>
+<br>
+   nir_builder_instr_insert(b, &nalu->instr);<br>
+<br>
+   return &nalu->dest.dest.ssa;;<br>
+}<br>
+<br>
 /*<br>
  * This propagates if condition evaluation down the chain of some alu<br>
  * instructions. For example by checking the use of some of the following alu<br>
@@ -456,7 +484,8 @@ propagate_condition_eval(nir_builder *b, nir_if *nif, nir_src *use_src,<br>
          def[i] = alu->src[i].src.ssa;<br>
       }<br>
    }<br>
-   nir_ssa_def *nalu = nir_build_alu(b, alu->op, def[0], def[1], def[2], def[3]);<br>
+<br>
+   nir_ssa_def *nalu = clone_alu_and_replace_src_defs(b, alu, def);<br>
<br>
    /* Rewrite use to use new alu instruction */<br>
    nir_src new_src = nir_src_for_ssa(nalu);<br>
-- <br>
2.19.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>