LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations. |
来月にリリースが予定されているLLVM Clang 3.3で導入される最適化機能のひとつ、ループ・ベクタライゼーションに関して、実際にどのような機能が導入されるのかが「LLVM 3.3 Vectorization Improvements」で紹介された。ループ・ベクタライゼーションはLLVM Clang 3.2で導入されたが、初期設定では無効になっている。バージョン3.2から3.3の間でループ・ベクタライゼーションの機能改善が進み、より複雑なループも最適化が実施できるようになったと説明がある。
LLVM Clang 3.3で実現される主なループ・ベクタライゼーション(ループ処理の最適化)の機能は次のとおり。
- ループをベクトル化するかどうかの判断基準となるコストモデルの改善。x86とARMに関して改善が実施されており、従来よりもより正確にその効果を見積もって最適化するかどうかを判断するようになった。
- アウト・オブ・オーダー実行に対応したプロセッサにおいて処理が並列に実行されるように、より独立した命令へループを展開する。
- if構文を含んだループも展開できるように処理を改善。特に最大値や最小値を求めるようなパターンに対応した。
- 浮動小数点演算を含むループに関しても展開できるように対応。浮動小数点演算を含むループを展開する場合は-ffast-mathオプションが指定されている必要があり、この場合には丸め処理にはこだわらずに速度優先で最適化処理を実施する(-ffast-mathを指定した場合、丸めに関しては値の同一性が保証されないので、たとえばa+(b+c)と(a+b)+cといった浮動小数点演算の結果が必ずしも一致するとは限らないという点に注意する必要がある)。
これら機能は-O3などの最適化レベルを指定した場合に適用される。