FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVMの新しい中間言語表現 MLIRを試す(5. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。

以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。

docs.google.com


MLIRをClangで使用する

f:id:msyksphinz:20200706010509p:plain:w400

現在のClangのIR生成に関する問題。ASTから複雑な処理を通じてLLVM IRを生成するが、C++からLLVM IRの差分が大きすぎる。また、Clangコミュニティの動きが素早く、長期プランによる開発ブランチが作れない。インクリメンタルなパスを見つける必要がある。

f:id:msyksphinz:20200706010525p:plain:w400

まずは診断パスから始めることを推奨する。それを交換してアップグレードすることにより、IR生成パスを直接作るよりも障壁がはるかに低くなる。

f:id:msyksphinz:20200706010537p:plain:w400

最初はCIRの表現を定義する。CIRとは中間的な表現を意味する。

いくつかのイタレーションの後、既存のフローセンシティブなデータフロー診断を移植することは理にかなっている。これらはclangコンパイラフローで使用されるものであり、この方法の利点はMLIRを使用すること新しい診断用のテストケースを簡単に作成することができるということである。

f:id:msyksphinz:20200706010550p:plain:w400

新しいフローセンシティブな診断が動作し古いものよりも良いようであれば、これをデフォルトに設定する。これによりMLIRがプロダクションのClangパスで有効になる。正常に動作することが確認できれば、Clang CFGに基づく古い実装を削除することができる。

Clang CFGをどうするかということだが関連しているコードが大量にあるため、進行を妨げないようにするためにCSA(Clang Static Analyze)の実装の詳細になるようにCFGを移動することを推奨する。

f:id:msyksphinz:20200706010604p:plain:w400

MLIRパスがデフォルトで本番環境で有効になっているので、次はIRの生成フローで使用することを考える。このパスでは、C++のすべての機能をサポートしている必要があり、これは非常に難易度が高い。ある時点で完全に実装が完了すると、デフォルトで有効にすることができる。

f:id:msyksphinz:20200706010615p:plain:w400