私は次のように伝播する方法に興味があります:この場合LLVMでMCレベルまで伝播する新しい属性をソースコードに追加しますか?
void foo(int __attribute__((aligned(16)))* p) { ... }
ポインタの「alignednessは、」MCレベルで提供されていますが、明らかに達成するためにLLVM-IRメタデータのアプローチを使用していませんこの。アライメント情報は、この値に依存してコード生成を変更するターゲットによって非常に重要です。私はこの属性にもっと似ていると思っています。
「アライメント」と同じ方法でコンパイラを伝播するように新しい属性を追加するのはどれくらい難しいでしょうか?そこで、LLVM-IRに新しい要素を追加しました。私はまた、LLVMの他の部分が気にしないときにこの新しい要素を無視することが最も難しい部分であることを期待しています。
LLVMには、パーサーからバックエンドにターゲット依存情報を渡す一般的なターゲットに依存しない方法がありません。
「DebugLoc」アプローチは、同様のquestionで提案されましたが、デバッグには関係しないため、ちょっとハックしたと思います。しかし、実装がこのように難しくない場合は、ハックが受け入れられるかもしれません。
更新: 新しい属性を使用する代わりにインラインアセンブリを使用するのはここですか?はいの場合、賛否両論は何ですか?
btw ...私の他のクエリは、このケースでOpenCLのアドレス空間がどのように動作するかです...私が探しているのはまさにそのようなものかもしれません。 (間違っていませんか?) – eternalStudent
@eternalStudent LLVMには、いくつかの値に独自のaddrspace修飾子があります。 OpenCLのLLVMベースのIRであるSPIRに興味があります(https://www.khronos.org/registry/SPIR/specs/spir_spec-2.0.pdf、セクション2.2)。だから私はあなたの質問に対する答えは、そのようなものが言語に焼き付けられているので、それらを追加することは簡単ではないということです。 – Oak
ありがとう@Oak :)優れた説明! OpenCLのアドレス空間に基づくコード生成の決定をターゲットが行うことは不可能だと私は理解しています。 メタデータは扱いが簡単ですが、メモリオペランド情報で使用できるように、あとでターゲット固有のものに変換する必要があります。 LLVM-IRメタデータを使用するパスを追加することは、まったく受け入れられます。私はそれをスケジューリングまで持続させるために何を変えなければならないかを理解する必要があります。ここにどんなアイデア? :) – eternalStudent