CLang ++ генерирует ложные переменные в LLVM_IR - PullRequest
0 голосов
/ 08 февраля 2019

Пожалуйста, рассмотрите следующую программу:

int main() {
    int test = 17;
    return test;
}

Компилировать в LLVM_IR: clang++ -S -emit-llvm test.cpp

Глядя на ИК, функция main определяется следующим образом:

; Function Attrs: noinline norecurse nounwind optnone uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 17, i32* %2, align 4
  %3 = load i32, i32* %2, align 4
  ret i32 %3
}

Мы можем видеть, что %2 - это распределение нашей test переменной, загружая в нее 17, и %3 использует эту переменную в качестве возвращаемого значения функции (в соответствии с кодом, в котором мы ее написали),Однако мы видим, что %1 определяет другую переменную размером int и инициализирует ее значением 0, несмотря на то, что никогда не использует ее.Эту дополнительную переменную нигде не видно в исходном коде C ++.

Следует отметить, что я вижу, что то же самое генерируется при компиляции с использованием clang вместо clang++.

Что такоеэта дополнительная переменная?

1 Ответ

0 голосов
/ 28 февраля 2019

Я предполагаю, что вы используете старую версию clang.В новой версии (я имею в виду v7.0 и выше) имена значений печатаются по умолчанию.Но чтобы быть явно напечатанным, вы могли бы -fno-discard-value-names.С этой опцией вы получите следующий IR:

define dso_local i32 @main() #0 {
entry:
  %retval = alloca i32, align 4
  %test = alloca i32, align 4
  store i32 0, i32* %retval, align 4
  store i32 17, i32* %test, align 4
  %0 = load i32, i32* %test, align 4
  ret i32 %0
}

Теперь совершенно ясно, откуда взялся store 0.В неоптимизированном коде компилятор инициализирует retval до 0.

...