2011-07-02 11 views
0

ソース言語から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%を交換する必要がありますどこでも使用されていますか?

答えて

0

あなたは二つの可能性があります。

  1. はallocaを年代、負荷およびストアを使用してコードを生成します(-O0で例えば打ち鳴らすのか、LLVM-GCCの出力を確認してください)、その後にすべてのこのようなものを調達する-mem2reg最適化パスを使用しますLLVMレジスタ
  2. どこでも%nの代わりに1を使用します。
関連する問題