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