6

構造体型の LLVM 値を作成しようとしています。私はLLVM-Cインターフェースを使用しており、関数を見つけています:

LLVMValueRef    LLVMConstStruct (LLVMValueRef *ConstantVals, unsigned Count, LLVMBool Packed)

すべてのメンバーが LLVMConstXXX() によって作成された定数値である場合、これは正常に機能し、次のようなコードが生成されます。

store { i32, i32, i32 } { i32 1, i32 2, i32 3 }, { i32, i32, i32 }* %17, align 4

しかし問題は、メンバーが定数でない場合、次のようなものが生成されることです。

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
store { i32, i32, i32 } { i32 1, i32 %0, i32 3 }, { i32, i32, i32 }* %17, align 4

そして、この LLVM コードを NVVM (Nvidia PTX バックエンド) に送信すると、次のように表示されます。

モジュール 0 (27、39): 解析エラー: 関数ローカル名の無効な使用

したがって、この構造体値の作成が正しいかどうかはわかりません。必要なのは、割り当てられたメモリではなく、値です。

誰でもアイデアがありますか?

よろしく、シャン。

4

1 に答える 1

11

定数構造体は、その名前に忠実な一種のリテラルであり、一般的な値ではなく、他の定数のみを含むことができます。したがって、その構造体を生成する正しい方法は、insertvalue. 上記の例では、次のようになります。

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
%1 = insertvalue {i32, i32, i32} {i32 1, i32 undef, i32 3}, i32 %0, 1
store { i32, i32, i32 } %1, { i32, i32, i32 }* %17, align 4
于 2013-04-03T11:43:47.310 に答える