ifort 与 gfortran 中的尾调用优化

问题描述

我有一些代码,当用 gfortran 编译时,完成了尾调用优化,但当用 ifort 编译时,它不是。

以下是一些描述问题的非常简单的片段:

gfortran

ifort

因此,代码

function f(a,b)
    real,intent(in) :: a,b
    real :: f
    f = a**b
end function f

使用 gfortran 编译为:

f_:
    movss   xmm1,DWORD PTR [rsi]
    movss   xmm0,DWORD PTR [rdi]
    jmp     powf

并使用 ifort 来:

f_:
    push      rsi                                           #1.10
    movss     xmm0,DWORD PTR [rdi]                         #4.10
    movss     xmm1,DWORD PTR [rsi]                         #4.10
    call      powf                                          #4.10
    pop       rcx                                           #5.1
    ret                                                     #5.1

我希望两个编译器都进行尾调用优化,并且我在两个编译器中都使用了 -O3 编译器标志。

我在网上查了一下,但找不到类似的问题。我只找到了这个:Does gfortran support tail call elimination? 但这里 gfortran 没有做优化,代码也复杂得多。

为什么ifort不做尾调用优化?

[编辑]: vtune output of my original code (not the simplified version above)

[编辑]: 下面是 f 的使用示例:

program calling_func

real :: res

res = 0.d0

do i = 1,10000
    res = res + f(real(mod(i,3)),real(mod(i,3)))
end do
Print *,res

end program calling_func

function f(a,b)
    implicit none
    real,b
    real :: f
    f = a**b
end function f

在 gfortran 上,行 f = a**b 在汇编中转换为 jmp pow,而在 ifort 中转换为 call pow

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)