ソース言語からLLVM IR(.llファイル)を生成しています。この言語には可変ローカル変数はなく、alloca
はまだ使用されていません。これまでのものはすべてLLVMレジスタにあります。しかし、それは不変のローカル値を持っています。現在のところ、イニシャライザの部分が定数または別の識別子でない限り正常に動作します。 %n = add i32 %a, %b
:例えば:a + b
命令add i32 %a, %b
にコンパイルし、命令は、必要に応じてローカル値に割り当てることができるので、ラインとなるためLLVM IRにローカルの名前付きレジスタのコードを生成する方法は?
def fun(a: Int, b: Int) = {
val n = a + b
n + 2
}
これは、微細なコンパイル。一方
、私はトラブル次のコードを生成します:
def fun() = {
val n = 1
n
}
私は%n = bitcast i32 1 to i32
を生成することがありましたが、bitcastすべてのタイプでは動作しませんし、本当にこのために意図されていません。まあ、私はLLVMには本当にこれを意図したものは何もないと思います。
しかし値のタイプに応じてさまざまなノーオペレーション命令を生成することなく良い解決策がありますか? bitcast例えばタプルでは動作しません。
再びerror: invalid cast opcode for cast from '{ i32, i32 }' to '{ i32, i32 }'
%n = bitcast {i32, i32} {i32 1, i32 2} to {i32, i32}
は、IRには「コピー」の指示がないかもしれないので、私はこれをやろうとするべきではなく、値でのn%を交換する必要がありますどこでも使用されていますか?