Какова цель строки точки %alloca, которая встречается в коде llvm?

В последнее время я просматривал некоторые сборки 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 для более поздних целей генерации/анализа кода, указывая на интересные части кода.


person David Terei    schedule 21.08.2009    source источник
comment
Мне также любопытно в этой строке; Я только что наткнулся на него сегодня вечером, просматривая кое-какие материалы для генерации кода. Кажется, это граница alloca, но я не знаю, почему.   -  person Albinofrenchy    schedule 22.08.2009


Ответы (2)


Из источника llvm-gcc: gcc/ llvm-convert.cpp, он просто используется как вспомогательное значение* и будет удален при проходе исключения мертвых инструкций.

// 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
person Nathan Howell    schedule 26.10.2009
comment
Да, это правильно. Также задал этот вопрос в списке рассылки LLVM и получил аналогичный ответ, если быть точным: он там как заполнитель для того, куда вставлять временные файлы: alloca идет перед битовой передачей, а фактическая генерация кода начинается после нее. Это просто удобство для интерфейса; instcombine устранит его, а все остальное просто проигнорирует. - person David Terei; 02.11.2009

Нашел это в Интернете: Allocas, размер которых можно определить во время компиляции, будет выделено пространством в стеке при вычислении размера кадра стека. Для распределений переменного размера целевому конкретному коду придется изменять размер стека, корректируя указатель кадра и указатель стека по мере необходимости, а также корректируя местоположения исходящих параметров в верхней части стека.

звучит так, будто это нужно для того, чтобы некоторое пространство стека работало правильно.

person Joe Caffeine    schedule 22.08.2009
comment
Вопрос не в самой аллоке. ОП спрашивает об инструкции с именем alloca point, которая, по-видимому, не работает. - person Jay Conrod; 23.10.2009