Что не так с этим номером регистра LLVM?

Я пишу компилятор для простого C-подобного языка для курса, который я изучаю. Этот бит кода:

int main() {
    printInt(not(0));
    return 0;
}

int not(int n) {
    if (n == 0) {
        return 1;
    } else {
        int result = 0;
        return result;
    }
}

.. Я наивно компилирую в этот биткод:

declare void @printInt(i32)
declare void @printDouble(double)
declare void @printString(i8*)
declare i32 @readInt()
declare double @readDouble()

define i32 @main() {
entry:
    %0 = call i32 @not(i32 0)
    call void @printInt(i32 %0)
    ret i32 0
    unreachable
}

define i32 @not(i32 %n_0) {
entry:
    %0 = icmp eq i32 %n_0, 0
    br i1 %0, label %lab0, label %lab1
lab0:
    ret i32 1
    br label %lab2
lab1:
    %result_0 = alloca i32 
    store i32 0, i32* %result_0
    %1 = load i32* %result_0
    ret i32 %1
    br label %lab2
lab2:
    unreachable
}

Однако opt не принимает этот код.

opt: core023.ll:25:5: error: instruction expected to be numbered '%2'
%1 = load i32* %result_0

Теперь, насколько я понимаю, безымянные временные регистры должны быть пронумерованы последовательно, начиная с 0. Что и имеет место здесь. Но, видимо, строка «%1 = sub..» должна была иметь номер %2. Это почему? Любая из инструкций между %0 и %1 увеличивает порядковый номер? Или, может быть, это просто последующая ошибка из-за чего-то еще?

6
задан keiter 6 May 2012 в 20:57
поделиться