基于tinygo的LLVM绑定实现无Else块的If/Then分支问题
如何用TinyGo的LLVM绑定实现不带Else块的If/Then分支
我正在使用TinyGo的LLVM Go语言绑定,尝试实现不带Else块的If/Then分支逻辑。之前找到过用C++ API实现的方案,但TinyGo的绑定并没有提供向函数中push_back块的方法。
我尝试编译如下阶乘代码:
func factorial(x: i8) -> i8 { if x == 0 { return 1; } return x * factorial(x - 1); }
为简化展示,生成的LLVM IR如下:
define i8 @factorial(i8 %x) { entry: %RETURN_VALUE = alloca i8, align 1 %0 = alloca i8, align 1 store i8 %x, i8* %0, align 1 %1 = load i8, i8* %0, align 1 %2 = icmp eq i8 %1, 0 br i1 %2, label %3, label %merge 3: ; preds = %entry store i8 1, i8* %RETURN_VALUE, align 1 br label %merge merge: ; preds = %3, %entry %4 = load i8, i8* %0, align 1 %5 = load i8, i8* %0, align 1 %6 = sub i8 %5, 1 %7 = call i8 @factorial(i8 %6) %8 = mul i8 %4, %7 store i8 %8, i8* %RETURN_VALUE, align 1 %9 = load i8, i8* %RETURN_VALUE, align 1 ret i8 %9 }
我当前的思路是通过一个变量存储返回值,遇到return语句时修改该变量的值,最后统一返回。这种方式在带Else的If/Then分支中能正常工作,但我希望语言是命令式的,支持不带Else的If/Then分支。
我还尝试用clang -S -emit-llvm x.c将C代码编译为LLVM IR来参考:
int main() { int x = 8; if (x) { return 1; } x = 3; return 0; }
编译后的LLVM IR如下:
define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca i32, align 4 store i32 0, i32* %1, align 4 store i32 8, i32* %2, align 4 %3 = load i32, i32* %2, align 4 %4 = icmp ne i32 %3, 0 br i1 %4, label %5, label %6 5: ; preds = %0 store i32 1, i32* %1, align 4 br label %7 6: ; preds = %0 store i32 3, i32* %2, align 4 store i32 0, i32* %1, align 4 br label %7 7: ; preds = %6, %5 %8 = load i32, i32* %1, align 4 ret i32 %8 }
我实在不知道该如何实现这种分支逻辑。
内容的提问来源于stack exchange,提问作者kamkow1
相关产品推荐
相关产品推荐

