-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/27/2011 01:17 AM, Tom Stellard wrote: > Registers that are used inside of loops need to be considered live > starting with the very first instruction in the loop. > > This fixes the following piglit tests on r300: > - glsl-fs-loop-redundant-condition > - glsl-vs-loop-redundant-condition > - glsl-vs-vec4-indexing-temp-dst-in-loop > > NOTE: This is a candidate for the 7.9 and 7.10 branches.
This is https://bugs.freedesktop.org/show_bug.cgi?id=34370. There are a couple patches already in the bug report. The first one (by me) is a hack. The second one (by Fabian Bieler) seems better, but I haven't had a chance to really review it yet. We should resolve this and get one of the patches in soon. I should be able to review, test, and compare all three, but I won't get to it until Tuesday. > --- > src/mesa/program/prog_optimize.c | 17 ++++++++++++++--- > 1 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/src/mesa/program/prog_optimize.c > b/src/mesa/program/prog_optimize.c > index 96971f2..164297a 100644 > --- a/src/mesa/program/prog_optimize.c > +++ b/src/mesa/program/prog_optimize.c > @@ -937,24 +937,35 @@ update_interval(GLint intBegin[], GLint intEnd[], > GLuint index, GLuint ic) > { > int i; > + GLuint begin = ic; > + GLuint end = ic; > > /* If the register is used in a loop, extend its lifetime through the end > * of the outermost loop that doesn't contain its definition. > */ > for (i = 0; i < loopStackDepth; i++) { > if (intBegin[index] < loopStack[i].Start) { > - ic = loopStack[i].End; > + end = loopStack[i].End; > break; > } > } > > + /* Variables that are live at the end of a loop will also be live at the > + * beginning, so an instruction inside of a loop should have its live > + * interval begin at the start of the outermost loop. > + */ > + if (loopStackDepth > 0 && ic > loopStack[0].Start && ic < > loopStack[0].End) { > + begin = loopStack[0].Start; > + } > + > ASSERT(index < REG_ALLOCATE_MAX_PROGRAM_TEMPS); > if (intBegin[index] == -1) { > ASSERT(intEnd[index] == -1); > - intBegin[index] = intEnd[index] = ic; > + intBegin[index] = begin; > + intEnd[index] = end; > } > else { > - intEnd[index] = ic; > + intEnd[index] = end; > } > } > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk2PxuEACgkQX1gOwKyEAw+KqQCePDF9nV5ClztXFjokZhQSUCuP QjsAoIceHefPsRVXylt5REoJMXQs9qRB =UHfP -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
