説明
ループ本体のコピーを複数作成することによりループを変換します。
ループは、ループ帰納変数で指定されている反復回数実行されます。反復回数は、break やループの exit 変数の変更など、ループ本体内のロジックにも影響します。ループは、ループ本題を表すロジックのブロックで RTL にインプリメントされ、同じ反復回数実行されます。
syn.directive.unroll
コマンドでは、ループを完全にまたは部分的に展開できます。ループを完全に展開すると、ループの反復回数と同じ数のループ本体のコピーが RTL に作成されます。係数 N でループを部分展開すると、ループ本体のコピーが N 個作成され、ループ反復数が調整されます。
部分展開に使用される係数 N が元のループ反復回数の整数倍でない場合は、ループ本文の展開された部分の後の元の終了条件をチェックする必要があります。
ループを完全に展開するには、ループの境界がコンパイル時に認識される必要があります。これは部分展開には必要ありません。
構文
syn.directive.unroll=[OPTIONS] <location>
-
<location>
: 展開するループの場所をformat function[/label]
の形式で指定します。
オプション
-
factor=<integer>
- 以外の整数値を指定して、部分展開が実行されるようにします。
ループ本文は、ここで指定した回数分繰り返され、それに応じて反復回数が調整されます。
-
skip_exit_check
- -factor を指定した場合 (部分展開) にのみ有効です。
- 固定境界
反復回数が係数の倍数である場合は、終了条件はチェックされません。
反復回数が係数の整数倍でない場合は、次のようになります。- 展開は実行されません。
- 処理を続行するには終了チェックを実行する必要があることを示す警告メッセージが表示されます。
- 可変境界
終了条件チェックが削除されます。次を確認してください。
- 可変境界が係数の整数倍である。
- 終了チェックが不要である。
- 固定境界
例
関数 foo
内のループ L1
を展開します。プラグマは L1
の本体に記述します。
syn.directive.unroll=foo/L1
関数 foo
のループ L2
の展開係数を 4 に指定します。最終チェックを削除します。プラグマは L2
の本体に記述します。
syn.directive.unroll=skip_exit_check factor=4 foo/L2