LLVM IR无法跳出循环
LLVM IR cannot break out of the loop
我是 LLVM 的新手,我正在将我编写的脚本语言编译到 LLVM IR 中,然后 运行 使用 jit
这是我的脚本代码:
for (i = 0; i < 10; ++i) {
if (i == 5) {
print(100);
break;
}
print(i);
}
这是编译后的 LLVM IR:
; ModuleID = 'jit'
source_filename = "jit"
declare i32 @print(i32)
define i32 @main() {
entry:
%i = alloca i32, align 4
store i32 0, i32* %i, align 4
br label %loop
loop: ; preds = %loopStep, %entry
%i1 = load i32, i32* %i, align 4
%0 = icmp slt i32 %i1, 10
br i1 %0, label %loopBody, label %loopEnd
loopBody: ; preds = %loop
%i2 = load i32, i32* %i, align 4
%1 = icmp eq i32 %i2, 5
br i1 %1, label %then, label %else
loopStep: ; preds = %merge
%i4 = load i32, i32* %i, align 4
%2 = add i32 %i4, 1
store i32 %2, i32* %i, align 4
br label %loop
loopEnd: ; preds = %then, %loop
ret i32 0
merge: ; preds = %else, %then
%i3 = load i32, i32* %i, align 4
%3 = call i32 @print(i32 %i3)
br label %loopStep
then: ; preds = %loopBody
%4 = call i32 @print(i32 100)
br label %loopEnd
br label %merge
else: ; preds = %loopBody
br label %merge
}
这是 运行 jit:
的结果
0
1
2
3
4
100
5
6
7
8
9
我认为1==5
时正确的路由是%then -> %loopEnd -> ret
,但是jit的结果运行完全出乎意料
不知道哪里出了问题,谢谢帮助
我认为LLVM IR和汇编一样灵活,但事实并非如此。在生成LLVM IR时,需要做很多处理。例如,不能有多个连续的br
和多个连续的ret
。
我是 LLVM 的新手,我正在将我编写的脚本语言编译到 LLVM IR 中,然后 运行 使用 jit
这是我的脚本代码:
for (i = 0; i < 10; ++i) {
if (i == 5) {
print(100);
break;
}
print(i);
}
这是编译后的 LLVM IR:
; ModuleID = 'jit'
source_filename = "jit"
declare i32 @print(i32)
define i32 @main() {
entry:
%i = alloca i32, align 4
store i32 0, i32* %i, align 4
br label %loop
loop: ; preds = %loopStep, %entry
%i1 = load i32, i32* %i, align 4
%0 = icmp slt i32 %i1, 10
br i1 %0, label %loopBody, label %loopEnd
loopBody: ; preds = %loop
%i2 = load i32, i32* %i, align 4
%1 = icmp eq i32 %i2, 5
br i1 %1, label %then, label %else
loopStep: ; preds = %merge
%i4 = load i32, i32* %i, align 4
%2 = add i32 %i4, 1
store i32 %2, i32* %i, align 4
br label %loop
loopEnd: ; preds = %then, %loop
ret i32 0
merge: ; preds = %else, %then
%i3 = load i32, i32* %i, align 4
%3 = call i32 @print(i32 %i3)
br label %loopStep
then: ; preds = %loopBody
%4 = call i32 @print(i32 100)
br label %loopEnd
br label %merge
else: ; preds = %loopBody
br label %merge
}
这是 运行 jit:
的结果0
1
2
3
4
100
5
6
7
8
9
我认为1==5
时正确的路由是%then -> %loopEnd -> ret
,但是jit的结果运行完全出乎意料
不知道哪里出了问题,谢谢帮助
我认为LLVM IR和汇编一样灵活,但事实并非如此。在生成LLVM IR时,需要做很多处理。例如,不能有多个连续的br
和多个连续的ret
。