指令预计编号

ant*_*oyo 7 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
Run Code Online (Sandbox Code Playgroud)

运行时llc,我收到以下错误:

error: instruction expected to be numbered '%4'
%3 = load i64* %l
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么它应该%4%2. %2和之间没有返回结果的指令%4

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

那么为什么%3在这里使用会出错呢?

Oak*_*Oak 8

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

...
L2:
  ret void
%3:
  br label %L1
L1:
...
Run Code Online (Sandbox Code Playgroud)

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