我的目标是在 LLVM 中做一些简单的事情。我想使用 C 库函数 getchar 定义一个从命令行读取输入的 LLVM 函数。这是我的伪代码算法:
getInt:
get a character, set the value to VAL
check if VAL is '-'
if yes then set SGN to -1 and set VAL to the next character else set SGN to 1
set NV = to the next char minus 48
while (NV >= 0) // 48 is the first ASCII character that represents a number
set VAL = VAL*10
set VAL = VAL + NV
set NV to the next char minus 48
return SGN*VAL
所以现在,我想出的 LLVM 代码是我认为将上述内容转换为 LLVM IR 的最直接的方法。但是,我收到错误“PHI 节点未分组在基本块的顶部”。如果我移动一些东西来修复这个错误,我会得到关于支配地位的错误。下面是给我 PHI 节点错误的 LLVM IR 代码。我相信我误解了有关 LLVM IR 的一些基本知识,因此非常感谢您提供的任何帮助。
define i32 @getIntLoop() {
_L1:
%0 = call i32 @getchar()
%1 = phi i32 [ %0, %_L1 ], [ %3, %_L2 ], [ %8, %_L4 ]
%2 = icmp eq i32 %1, 45
br i1 %2, label %_L2, label %_L5
_L2: ; preds = %_L1
%3 = call i32 @getchar()
br label %_L3
_L3: ; preds = %_L4, %_L2
%4 = call i32 @getchar()
%5 = icmp slt i32 %4, 40
br i1 %5, label %_L5, label %_L4
_L4: ; preds = %_L3
%6 = sub i32 %4, 48
%7 = mul i32 %1, 10
%8 = add i32 %6, %7
br label %_L3
_L5: ; preds = %_L3, %_L1
br i1 %2, label %_L6, label %_L7
_L6: ; preds = %_L5
%9 = mul i32 -1, %1
ret i32 %9
_L7: ; preds = %_L5
ret i32 %1
}