nvc0: don't overwrite phi sources at the end of a loop
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 19 Feb 2011 13:14:40 +0000 (14:14 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 24 Feb 2011 16:35:35 +0000 (17:35 +0100)
Except the reference to its own result.

src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c

index 687def0344d91b9cdfc96ebfdc6815cd6733b941..e2838a0f1d0f2696ccb9de2d22c26f63ebb57588 100644 (file)
@@ -465,6 +465,7 @@ bld_loop_end(struct bld_context *bld, struct nv_basic_block *bb)
       reg = (struct bld_register *)phi->target;
       phi->target = NULL;
 
+      /* start with s == 1, src[0] is from outside the loop */
       for (s = 1, n = 0; n < bb->num_in; ++n) {
          if (bb->in_kind[n] != CFG_EDGE_BACK)
             continue;
@@ -476,8 +477,11 @@ bld_loop_end(struct bld_context *bld, struct nv_basic_block *bb)
          for (i = 0; i < 4; ++i)
             if (phi->src[i] && phi->src[i]->value == val)
                break;
-         if (i == 4)
+         if (i == 4) {
+            /* skip values we do not want to replace */
+            for (; phi->src[s] && phi->src[s]->value != phi->def[0]; ++s);
             nv_reference(bld->pc, phi, s++, val);
+         }
       }
       bld->pc->current_block = save;