aco: don't remove the loop exec mask in transition_to_Exact()
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 26 Sep 2019 14:38:09 +0000 (15:38 +0100)
committerRhys Perry <pendingchaos02@gmail.com>
Fri, 27 Sep 2019 09:57:03 +0000 (10:57 +0100)
No pipeline-db changes.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
src/amd/compiler/aco_insert_exec_mask.cpp

index b423c5b9190f273ee4219d406d489a72c43bd311..155c21a5aa470188a7aaff727cdd4779ca37538c 100644 (file)
@@ -313,7 +313,11 @@ void transition_to_Exact(exec_ctx& ctx, Builder bld, unsigned idx)
 {
    if (ctx.info[idx].exec.back().second & mask_type_exact)
       return;
-   if (ctx.info[idx].exec.back().second & mask_type_global) {
+   /* We can't remove the loop exec mask, because that can cause exec.size() to
+    * be less than num_exec_masks. The loop exec mask also needs to be kept
+    * around for various uses. */
+   if ((ctx.info[idx].exec.back().second & mask_type_global) &&
+       !(ctx.info[idx].exec.back().second & mask_type_loop)) {
       ctx.info[idx].exec.pop_back();
       assert(ctx.info[idx].exec.back().second & mask_type_exact);
       ctx.info[idx].exec.back().first = bld.pseudo(aco_opcode::p_parallelcopy, bld.def(s2, exec),