10

最近、llvm-gcc によって作成された LLVM アセンブリを調べていて、その目的がよくわからないステートメントが繰り返し表示されていることに気付きました。

たとえば、次の C プログラム:

int main(void)
{
   void (*f)(void) = (0x21332);
   f();
}

「llvm-gcc -emit-llvm -S」でコンパイルすると、次のコードが生成されます (無関係な部分は削除されています)。

define i32 @main() nounwind {
entry:
   %retval = alloca i32     ; <i32*> [#uses=1]
   %f = alloca void ()*     ; <void ()**> [#uses=2]
   %"alloca point" = bitcast i32 0 to i32       ; <i32> [#uses=0]
   store void ()* inttoptr (i64 135986 to void ()*), void ()** %f, align 4
   %0 = load void ()** %f, align 4      ; <void ()*> [#uses=1]
   call void %0() nounwind
   br label %return

行の目的に興味があります:

%"alloca point" = bitcast i32 0 to i32      ; <i32> [#uses=0]

割り当て先の変数は二度と使用されず、ビットキャスト自体は無意味であるため、何もしないようです。私が考えることができるのは、後でコード生成/分析の目的で実際に nop として挿入され、コードの興味深い部分を示しているということだけです。

4

2 に答える 2

8

llvm-gcc ソース: gcc/llvm-convert.cppから、これはヘルパー Value* として使用されるだけであり、デッド命令除去パスによって削除されます。

// Create a dummy instruction in the entry block as a marker to insert new
// alloc instructions before.  It doesn't matter what this instruction is,
// it is dead.  This allows us to insert allocas in order without having to
// scan for an insertion point. Use BitCast for int -> int
于 2009-10-26T00:55:26.630 に答える
-1

インターネットでこれを見つけました:コンパイル時にサイズを決定できるAllocasは、スタックフレームサイズが計算されるときにスタックにスペースが割り当てられます。可変サイズの allocas の場合、ターゲット固有のコードはスタックのサイズを変更し、必要に応じてフレーム ポインターとスタック ポインターを調整し、発信パラメーターの位置をスタックの一番上に調整する必要があります。

一部のスタックスペースを正しく機能させるためにあるように聞こえます。

于 2009-08-22T15:57:25.117 に答える