新建文件main.le
decl le print_int32(i32);
le fibonacci(step:i32)->i32{
if(step3){
ret 1;
}el{
ret fibonacci(step-1)+fibonacci(step-2);
}
}
le main()->i32{
print_int32(fibonacci(20));
ret 0;
}
执行lelang -i main.le -S ir -o out.ll
得到
; ModuleID = 'main'
source_filename = "main"
target triple = "arm64-apple-darwin21.4.0"
declare void @print_int32(i32)
define i32 @fibonacci(i32 %0) {
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 %0, i32* %3, align 4
%4 = load i32, i32* %3, align 4
%5 = icmp slt i32 %4, 3
br i1 %5, label %6, label %7
6: ; preds = %1
store i32 1, i32* %2, align 4
br label %16
7: ; preds = %1
%8 = load i32, i32* %3, align 4
%9 = sub i32 %8, 1
%10 = call i32 @fibonacci(i32 %9)
%11 = load i32, i32* %3, align 4
%12 = sub i32 %11, 2
%13 = call i32 @fibonacci(i32 %12)
%14 = add i32 %10, %13
store i32 %14, i32* %2, align 4
br label %16
15: ; No predecessors!
br label %16
16: ; preds = %15, %7, %6
%17 = load i32, i32* %2, align 4
ret i32 %17
}
define i32 @main() {
%1 = alloca i32, align 4
%2 = call i32 @fibonacci(i32 20)
call void @print_int32(i32 %2)
store i32 0, i32* %1, align 4
br label %3
3: ; preds = %0
%4 = load i32, i32* %1, align 4
ret i32 %4
}
执行lelang -i main.le -S exe -o out
,并运行out,程序打印
6765
decl le print_int32(i32);
le fibonacci(step:i32)->i32{
if(step3){
ret 1;
}el{
ret fibonacci(step-1)+fibonacci(step-2);
}
}
le main()->i32{
print_int32(fibonacci(20));
ret 0;
}