glsl: loop unroll adjustments

Add a "max complexity" heuristic to allow unrolling long loops with small
bodies and short loops with large bodies.

The loop unroll limits may need further tweaking...
This commit is contained in:
Brian Paul
2009-01-06 17:36:20 -07:00
parent 1fa978c891
commit 0b0d0dcdef

View File

@@ -58,11 +58,18 @@
/** Max iterations to unroll */
const GLuint MAX_FOR_LOOP_UNROLL_ITERATIONS = 4;
const GLuint MAX_FOR_LOOP_UNROLL_ITERATIONS = 20;
/** Max for-loop body size (in slang operations) to unroll */
const GLuint MAX_FOR_LOOP_UNROLL_BODY_SIZE = 50;
/** Max for-loop body complexity to unroll.
* We'll compute complexity as the product of the number of iterations
* and the size of the body. So long-ish loops with very simple bodies
* can be unrolled, as well as short loops with larger bodies.
*/
const GLuint MAX_FOR_LOOP_UNROLL_COMPLEXITY = 200;
static slang_ir_node *
@@ -2533,6 +2540,10 @@ _slang_can_unroll_for_loop(slang_assemble_ctx * A, const slang_operation *oper)
/* get/check loop iteration limits */
start = (GLint) oper->children[0].children[0].children[1].literal[0];
end = (GLint) oper->children[1].children[0].children[1].literal[0];
if (start >= end)
return GL_FALSE; /* degenerate case */
if (end - start > MAX_FOR_LOOP_UNROLL_ITERATIONS) {
slang_info_log_print(A->log,
"Note: 'for (%s=%d; %s<%d; ++%s)' is too"
@@ -2541,6 +2552,14 @@ _slang_can_unroll_for_loop(slang_assemble_ctx * A, const slang_operation *oper)
return GL_FALSE;
}
if ((end - start) * bodySize > MAX_FOR_LOOP_UNROLL_COMPLEXITY) {
slang_info_log_print(A->log,
"Note: 'for (%s=%d; %s<%d; ++%s)' will generate"
" too much code to unroll",
varName, start, varName, end, varName);
return GL_FALSE;
}
return GL_TRUE; /* we can unroll the loop */
}