[Mesa-dev] [PATCH] ir_to_mesa: Fix reallocating registers for shaders with loops

Tom Stellard tstellar at gmail.com
Sun Mar 27 01:17:43 PDT 2011


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.
---
 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;
    }
 }
 
-- 
1.7.3.4



More information about the mesa-dev mailing list