В LLVM IR отсутствуют номера виртуальных регистров
Рассмотрим следующие два примера:
int test_plus(int a, int b)
{
int c = a + b;
return c;
}
int reg_incr(int a)
{
int b = a + 1;
return b;
}
IR LLVM будет:
; Function Attrs: nounwind ssp uwtable
define i32 @test_plus(i32, i32) #0 {
%3 = alloca i32, align 4
%4 = alloca i32, align 4
%5 = alloca i32, align 4
store i32 %0, i32* %3, align 4
store i32 %1, i32* %4, align 4
%6 = load i32, i32* %3, align 4
%7 = load i32, i32* %4, align 4
%8 = add nsw i32 %6, %7
store i32 %8, i32* %5, align 4
%9 = load i32, i32* %5, align 4
ret i32 %9
}
; Function Attrs: nounwind ssp uwtable
define i32 @reg_incr(i32) #0 {
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 %0, i32* %2, align 4
%4 = load i32, i32* %2, align 4
%5 = add nsw i32 %4, 1
store i32 %5, i32* %3, align 4
%6 = load i32, i32* %3, align 4
ret i32 %6
}
В первой функции зарегистрируйтесь %2
пропал, отсутствует (%0
а также %1
используются для аргументов);
Аналогично, во второй функции зарегистрируйтесь %1
пропал, отсутствует.
Просто любопытно, для чего используются недостающие? почему они не соответствуют?
1 ответ
Я верю #0
относится к самой функции. а также #1/#2
относится к аргументам