Llvm 应编号的指令

Llvm 应编号的指令,llvm,Llvm,我对以下LLVM代码有问题: %0 = load i64* %u %1 = load i64* %l %2 = icmp sgt i64 %1, %1 br i1 %2, label %L1, label %L2 L2: ret void br label %L1 L1: %3 = load i64* %l %4 = sub i64 %3, 1 store i64 %4, i64* %i 运行llc时,我得到以下错误:

我对以下LLVM代码有问题:

    %0 = load i64* %u
    %1 = load i64* %l
    %2 = icmp sgt i64 %1, %1
    br i1 %2, label %L1, label %L2
L2:
    ret void
    br label %L1
L1:

    %3 = load i64* %l
    %4 = sub i64 %3, 1
    store i64 %4, i64* %i
运行
llc
时,我得到以下错误:

error: instruction expected to be numbered '%4'
%3 = load i64* %l
但是我不明白为什么在
%2
之后应该是
%4
。在
%2
%4
之间没有返回结果的指令

我需要理解这一点,因为我正在编写LLVM代码生成器


那么为什么在这里使用
%3
是错误的呢?

基本块与指令共享相同的编号。由于
ret
是一个终止符,因此在它之后有一个未命名(且无法访问)的基本块,因此您的代码相当于:

...
L2:
  ret void
%3:
  br label %L1
L1:
...

这就是为什么它希望下一个未命名的东西是
%4

而不是br标签%L1,您能将其切换为“不可访问”吗?