打印斐波那契数

  1. 新建文件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;
}
  1. 执行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
}
  1. 执行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;
}