nvc0/ir: clarify recursion fix to finding first tex uses
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 5 Sep 2014 23:36:48 +0000 (01:36 +0200)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 6 Sep 2014 03:08:24 +0000 (23:08 -0400)
This is a simple shader for reproducing the case mentioned:

FRAG
DCL IN[0], GENERIC[0], PERSPECTIVE
DCL OUT[0], COLOR
DCL SAMP[0]
DCL CONST[0]
DCL TEMP[0..1], LOCAL
IMM[0] FLT32 {    0.0000,    -1.0000,     1.0000,     0.0000}
  0: MOV TEMP[0].x, CONST[0].wwww
  1: MOV TEMP[1].x, CONST[0].wwww
  2: BGNLOOP
  3:   IF TEMP[0].xxxx
  4:     BRK
  5:   ENDIF
  6:   ADD TEMP[0].x, TEMP[0], IMM[0].zzzz
  7:   IF CONST[0].xxxx
  8:     TEX TEMP[1].x, CONST[0], SAMP[0], 2D
  9:   ENDIF
 10:   IF CONST[0].zzzz
 11:     MOV TEMP[1].x, CONST[0].zzzz
 12:   ENDIF
 13: ENDLOOP
 14: MOV OUT[0], TEMP[1].xxxx
 15: END

Cc: "10.2 10.3" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp

index 92f9a15..b3e1e69 100644 (file)
@@ -185,15 +185,13 @@ NVC0LegalizePostRA::findFirstUses(
       for (Value::UseIterator u = v->uses.begin(); u != v->uses.end(); ++u) {
          Instruction *usei = (*u)->getInsn();
 
-         /* XXX HACK ALERT XXX
-          *
-          * This shouldn't have to be here, we should always be making forward
-          * progress by looking at the uses. However this somehow does not
-          * appear to be the case. Probably because this is being done right
-          * after RA, when the defs/uses lists have been messed with by node
-          * merging. This should probably be moved to being done right before
-          * RA. But this will do for now.
-          */
+         // NOTE: In case of a loop that overwrites a value but never uses
+         // it, it can happen that we have a cycle of uses that consists only
+         // of phis and no-op moves and will thus cause an infinite loop here
+         // since these are not considered actual uses.
+         // The most obvious (and perhaps the only) way to prevent this is to
+         // remember which instructions we've already visited.
+
          if (visited.find(usei) != visited.end())
             continue;