diff options
author | Christoph Bumiller <[email protected]> | 2014-09-06 01:36:48 +0200 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2014-09-08 17:03:21 +0100 |
commit | bb06f2cd93e8e16798bd59b458abd8d33a8e4658 (patch) | |
tree | 9d52c5bfb8bb3ed74ee6dc0ac3627090bd941923 /src | |
parent | d3745890c6d0679e3d700688a917c74953cb9d92 (diff) |
nvc0/ir: clarify recursion fix to finding first tex uses
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" <[email protected]>
Reviewed-by: Ilia Mirkin <[email protected]>
(cherry picked from commit ca9ab05d45ebf407485af2daa3742b897ff99162)
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp index 92f9a156f7c..b3e1e69b016 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -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; |