描述
通过创建循环主体的多个副本来变换循环。
循环的迭代执行次数由循环归纳变量来指定。迭代次数也可能受到循环主体内的逻辑影响(例如,对任意循环出口变量进行中断或修改)。在 RTL 中,循环按表示循环主体的逻辑块来实现,此类逻辑块会执行相同次数的迭代。
set_directive_unroll
命令支持将循环完全展开。展开循环会在 RTL 中创建循环主体副本,副本数量与循环迭代次数相同,或者也可按因数 N 部分展开,从而创建循环主体的 N 份副本并对循环迭代次数进行相应的调整。
如果用于部分展开的因数 N 并非原始循环迭代计数的整数倍,那么必须在循环主体的每个展开片段后检查原始退出条件。
要完全展开循环,在编译时循环边界必须已知。对于部分展开则无需满足此条件。
语法
set_directive_unroll [OPTIONS] <location>
-
<location>
表示要展开的循环位置(格式为format function[/label]
)。
选项
-
-factor <integer>
- 指定非零整数,表示已请求部分展开。
循环主体将按此次数重复。迭代信息将进行相应的调整。
-
-skip_exit_check
- 仅当指定因数时才有效(部分展开)。
- 固定边界
如果迭代计数为因数的倍数,则不执行出口条件检查。
如果迭代计数并非因数的整数倍,则该工具将执行以下操作:
- 阻止展开。
- 发出警告,称必须执行出口检查后才能继续。
- 变量边界
移除出口条件检查。您必须确保:
- 变量边界为因数的整数倍。
- 实际上无需出口检查。
- 固定边界
-
-off
或off=true
- 为指定循环禁用展开。
示例
展开 foo
函数内的 L1
循环。将编译指示置于 L1
循环的主体内。
set_directive_unroll foo/L1
在 foo
函数的 L2
循环上指定展开因数 4。移除出口检查。将编译指示置于 L2
循环的主体内。
set_directive_unroll -skip_exit_check -factor 4 foo/L2