以一个给数组求和的程序来作为例子,编译器使用的是LLVM 18.1.8
! sum.f90 program sum integer, parameter :: n = 30 real(4), dimension(n) :: array real(4) :: result integer :: i do i = 1, n array(i) = i end do result = sum(array) print *, "Sum of array elements: ", result end program sum
前端优化
*.f90 -> FIR
LLVM编译器对Fortran语言的处理与C/C++不同,经过前端的词法分析、语法分析、语义分析之后,会生成一种中间语言叫FIR,它是MLIR的一种,在这一步,会对runtime库函数的一些函数做处理,比如我这里使用的给数组求和的函数sum,使其调用LLVM自身的runtime库函数。
flang-new -fc1 -emit-fir sum.f90 -o sum.mlir
截取一段关于sum函数的FIR,可以看待编译器将sum函数的参数做了处理,并且修改sum的函数名为_FortranASumReal4,这是runtime库里面对应的函数名
%c14_i32 = arith.constant 14 : i32 %18 = fir.convert %14 : (!fir.box<!fir.array<30xf32>>) -> !fir.box<none> %19 = fir.convert %17 : (!fir.ref<!fir.char<1,47>>) -> !fir.ref<i8> %20 = fir.convert %c0 : (index) -> i32 %21 = fir.convert %15 : (!fir.box<i1>) -> !fir.box<none> %22 = fir.call @_FortranASumReal4(%18, %19, %c14_i32, %20, %21) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32, i32, !fir.box<none>) -> f32 fir.store %22 to %8 : !fir.ref<f32>
中端优化
FIR -> IR
flang-new -fc1 -emit-llvm sum.mlir -o sum.ll
这一步将会生成中端优化后的IR
后端优化
IR->*.s
flang-new -S sum.ll -o sum.s
这一步将会生成后端优化后的汇编文件
但我这里采用的是llc进行后端优化,再链接生成binary
IR -> *.o
llc -filetype=obj sum.ll -o sum.o
*.o -> binary
flang-new sum.o -o sum -no-pie
运行结果
./sum 输出: Sum of array elements: 465.标签:fir,box,LLVM,编译,FIR,i32,sum,Fortran,array From: https://blog.csdn.net/qq_44083568/article/details/140904886