[Mesa-dev] [PATCH 11/16] mesa: Simplify _mesa_find_temp_intervals().
Eric Anholt
eric at anholt.net
Wed May 28 11:37:42 PDT 2014
Since there are no other callers, we can make it static and propagate some
types around, removing one of the giant stack allocations.
---
src/mesa/program/prog_optimize.c | 77 ++++++++++++++++++----------------------
src/mesa/program/prog_optimize.h | 7 ----
2 files changed, 34 insertions(+), 50 deletions(-)
diff --git a/src/mesa/program/prog_optimize.c b/src/mesa/program/prog_optimize.c
index f0d279b..20c6dd9 100644
--- a/src/mesa/program/prog_optimize.c
+++ b/src/mesa/program/prog_optimize.c
@@ -851,14 +851,6 @@ struct interval_list
struct interval Intervals[REG_ALLOCATE_MAX_PROGRAM_TEMPS];
};
-
-static void
-append_interval(struct interval_list *list, const struct interval *inv)
-{
- list->Intervals[list->Num++] = *inv;
-}
-
-
/** Insert interval inv into list, sorted by interval end */
static void
insert_interval_by_end(struct interval_list *list, const struct interval *inv)
@@ -945,9 +937,9 @@ struct loop_info
* instruction 'ic'.
*/
static void
-update_interval(GLint intBegin[], GLint intEnd[],
+update_interval(struct interval *interval,
struct loop_info *loopStack, GLuint loopStackDepth,
- GLuint index, GLuint ic)
+ GLuint ic)
{
int i;
GLuint begin = ic;
@@ -957,7 +949,7 @@ update_interval(GLint intBegin[], GLint intEnd[],
* of the outermost loop that doesn't contain its definition.
*/
for (i = 0; i < loopStackDepth; i++) {
- if (intBegin[index] < loopStack[i].Start) {
+ if (interval->Start < loopStack[i].Start) {
end = loopStack[i].End;
break;
}
@@ -971,14 +963,13 @@ update_interval(GLint intBegin[], GLint intEnd[],
begin = loopStack[0].Start;
}
- ASSERT(index < REG_ALLOCATE_MAX_PROGRAM_TEMPS);
- if (intBegin[index] == -1) {
- ASSERT(intEnd[index] == -1);
- intBegin[index] = begin;
- intEnd[index] = end;
+ if (interval->Start == -1) {
+ ASSERT(interval->End == -1);
+ interval->Start = begin;
+ interval->End = end;
}
else {
- intEnd[index] = end;
+ interval->End = end;
}
}
@@ -986,23 +977,27 @@ update_interval(GLint intBegin[], GLint intEnd[],
/**
* Find first/last instruction that references each temporary register.
*/
-GLboolean
-_mesa_find_temp_intervals(const struct prog_instruction *instructions,
- GLuint numInstructions,
- GLint intBegin[REG_ALLOCATE_MAX_PROGRAM_TEMPS],
- GLint intEnd[REG_ALLOCATE_MAX_PROGRAM_TEMPS])
+static GLboolean
+_mesa_find_temp_intervals(struct gl_program *prog,
+ struct interval_list *intervals)
{
struct loop_info loopStack[MAX_LOOP_NESTING];
GLuint loopStackDepth = 0;
GLuint i;
+ /* We will output a struct interval_list with an interval per declared
+ * temporary, even if the temp is never used.
+ */
for (i = 0; i < REG_ALLOCATE_MAX_PROGRAM_TEMPS; i++){
- intBegin[i] = intEnd[i] = -1;
+ intervals->Intervals[i].Reg = i;
+ intervals->Intervals[i].Start = -1;
+ intervals->Intervals[i].End = -1;
}
+ intervals->Num = REG_ALLOCATE_MAX_PROGRAM_TEMPS;
/* Scan instructions looking for temporary registers */
- for (i = 0; i < numInstructions; i++) {
- const struct prog_instruction *inst = instructions + i;
+ for (i = 0; i < prog->NumInstructions; i++) {
+ const struct prog_instruction *inst = prog->Instructions + i;
if (inst->Opcode == OPCODE_BGNLOOP) {
loopStack[loopStackDepth].Start = i;
loopStack[loopStackDepth].End = inst->BranchTarget;
@@ -1022,16 +1017,16 @@ _mesa_find_temp_intervals(const struct prog_instruction *instructions,
const GLuint index = inst->SrcReg[j].Index;
if (inst->SrcReg[j].RelAddr)
return GL_FALSE;
- update_interval(intBegin, intEnd, loopStack, loopStackDepth,
- index, i);
+ update_interval(&intervals->Intervals[index],
+ loopStack, loopStackDepth, i);
}
}
if (inst->DstReg.File == PROGRAM_TEMPORARY) {
const GLuint index = inst->DstReg.Index;
if (inst->DstReg.RelAddr)
return GL_FALSE;
- update_interval(intBegin, intEnd, loopStack, loopStackDepth,
- index, i);
+ update_interval(&intervals->Intervals[index],
+ loopStack, loopStackDepth, i);
}
}
}
@@ -1051,9 +1046,7 @@ static GLboolean
find_live_intervals(struct gl_program *prog,
struct interval_list *liveIntervals)
{
- GLint intBegin[REG_ALLOCATE_MAX_PROGRAM_TEMPS];
- GLint intEnd[REG_ALLOCATE_MAX_PROGRAM_TEMPS];
- GLuint i;
+ GLuint i, skipped;
/*
* Note: we'll return GL_FALSE below if we find relative indexing
@@ -1066,19 +1059,17 @@ find_live_intervals(struct gl_program *prog,
}
/* build intermediate arrays */
- if (!_mesa_find_temp_intervals(prog->Instructions, prog->NumInstructions,
- intBegin, intEnd))
+ if (!_mesa_find_temp_intervals(prog, liveIntervals))
return GL_FALSE;
- /* Build live intervals list from intermediate arrays */
- liveIntervals->Num = 0;
- for (i = 0; i < REG_ALLOCATE_MAX_PROGRAM_TEMPS; i++) {
- if (intBegin[i] >= 0) {
- struct interval inv;
- inv.Reg = i;
- inv.Start = intBegin[i];
- inv.End = intEnd[i];
- append_interval(liveIntervals, &inv);
+ /* Compress the intervals list down to just what's used. */
+ skipped = 0;
+ for (i = 0; i < liveIntervals->Num; i++) {
+ if (liveIntervals->Intervals[i].Start >= 0) {
+ if (skipped)
+ liveIntervals->Intervals[i - skipped] = liveIntervals->Intervals[i];
+ } else {
+ skipped++;
}
}
diff --git a/src/mesa/program/prog_optimize.h b/src/mesa/program/prog_optimize.h
index 7607bff..f3c2fe2 100644
--- a/src/mesa/program/prog_optimize.h
+++ b/src/mesa/program/prog_optimize.h
@@ -33,13 +33,6 @@ struct gl_context;
struct gl_program;
struct prog_instruction;
-
-extern GLboolean
-_mesa_find_temp_intervals(const struct prog_instruction *instructions,
- GLuint numInstructions,
- GLint intBegin[MAX_PROGRAM_TEMPS],
- GLint intEnd[MAX_PROGRAM_TEMPS]);
-
extern void
_mesa_optimize_program(struct gl_context *ctx, struct gl_program *program);
--
2.0.0.rc2
More information about the mesa-dev
mailing list