Description
Flattens nested loops into a single loop hierarchy.
In the RTL implementation, it costs a clock cycle to move between loops in the loop hierarchy. Flattening nested loops allows optimization of loops to a single loop. This saves clock cycles, potentially allowing for greater optimization of the loop body logic.
- Perfect loop nests
-
- Only the innermost loop has loop body content.
- There is no logic specified between the loop statements.
- All loop bounds are constant.
- Semi-perfect loop nests
-
- Only the innermost loop has loop body content.
- There is no logic specified between the loop statements.
- The outermost loop bound can be a variable.
- Imperfect loop nests
-
When the inner loop has variables bounds, or if the loop body is not exclusively inside the inner loop, do the following. Try to restructure the code, or unroll the loops in the loop body to create a perfect loop nest.
Syntax
syn.directive.loop_flatten=[OPTIONS] <location>
-
<location>is the location (inner-most loop), in the formatfunction[/label].
Options
-
off - Prevents loop flattening from taking place. Can prevent some
loops from being flattened while all others in the specified location are
flattened.Important: The presence of the LOOP_FLATTEN pragma or directive enables the optimization. The addition of
offdisables it.
Examples
Flattens loop_1 in function foo and all (perfect or semi-perfect) loops above it in
the loop hierarchy, into a single loop.
set_directive_loop_flatten=foo/loop_1
Prevents loop flattening in loop_2
of function foo.
set_directive_loop_flatten=off foo/loop_2