最近、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 として挿入され、コードの興味深い部分を示しているということだけです。