prog_optimize: Fix reallocating registers for shaders with loops
Registers that are used inside of loops need to be considered live starting with the first instruction of the outermost loop. https://bugs.freedesktop.org/show_bug.cgi?id=34370 NOTE: This is a candidate for the 7.9 and 7.10 branches. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user