Я смотрел на сборку LLVM, выпущенную llvm-gcc в последнее время, и я заметил повторяющееся утверждение, о котором я не уверен в его цели.
Например, следующая программа 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 для более поздних целей генерации/анализа кода, указывая на интересные части кода.