gfortran如何处理无法访问的代码?

时间:2016-02-25 19:16:52

标签: compiler-errors fortran compiler-optimization gfortran

让我们考虑这个Fortran 95代码(让我们说它包含在一个名为main.f95的文件中):

module params
    implicit none
    real*4, parameter :: r4_dum = 1
    real, parameter :: r_dum = 1
    logical, parameter :: r32bit = (kind(r4_dum)==kind(r_dum))
    contains
        subroutine print_state
            implicit none
            print*,'r32bit: ', r32bit
        end subroutine print_state
end module

module convert
    contains
        subroutine r32_to_64bit(r4, r8)
            implicit none
            real*4, intent(in) :: r4
            real*8, intent(out) :: r8
            r8 = dble(r4)
        end subroutine r32_to_64bit
end module convert

program test
    use params, only: r32bit, print_state
    use convert, only: r32_to_64bit
    implicit none
    real :: myReal
    real*8 :: work8

    call print_state
    if (r32bit) then
        call r32_to_64bit(myReal, work8)
    else
        work8 = myReal
    endif
end program test

您可以注意到,else的{​​{1}}部分无法访问。我运行了以下内容:

if (r32bit)

查看% gfortran -O3 -Wunreachable-code -fdump-tree-optimized main.f95 是否找到无法访问的部分并删除无用的分支,但这会产生绝望的空输出。在这种情况下,似乎gfortran没有删除代码中无法访问的部分。

所以,我的问题如下:阻止gfortran检测到这个gfortran部分的内容是无用的并且摆脱它?

1 个答案:

答案 0 :(得分:2)

我的编译器(gfortran 4.7和5.3 \d+)执行代码消除:

>>> print re.findall(r'^(.*\d+).*$', address)[0]
1234 Main St Smallville, KS 92348

并打印正确的答案

-O3 -fdump-tree-optimized

您无法期望优化能够修复无效的无法访问的代码。即使无法访问,代码仍然无效。

当我添加一些诊断

main (integer(kind=4) argc, character(kind=1) * * argv)
{
  static integer(kind=4) options.1[9] = {68, 1023, 0, 0, 1, 1, 0, 0, 31};

  <bb 2>:
  _gfortran_set_args (argc_2(D), argv_3(D));
  _gfortran_set_options (9, &options.1[0]);
  print_state ();
  return 0;

}

它仍然被正确消除:

> ./a.out 
 r32bit:  T

并且程序确实打印if (r32bit) then call r32_to_64bit(myReal, work8) print *, '+' else work8 = myReal print *, '-' endif 作为其最后输出。

最终代码中没有任何条件,它已被删除。

也许您希望test () { struct __st_parameter_dt dt_parm.1; <bb 2>: print_state (); dt_parm.1.common.filename = &"dead_elim.f90"[1]{lb: 1 sz: 1}; dt_parm.1.common.line = 34; dt_parm.1.common.flags = 128; dt_parm.1.common.unit = 6; _gfortran_st_write (&dt_parm.1); _gfortran_transfer_character_write (&dt_parm.1, &"+"[1]{lb: 1 sz: 1}, 1); _gfortran_st_write_done (&dt_parm.1); dt_parm.1 ={v} {CLOBBER}; return; } 立即打印一些内容?它没有这样做,它将优化的代码写入文件。在我的例子中,它被命名为+