让我们考虑这个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
部分的内容是无用的并且摆脱它?
答案 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;
}
立即打印一些内容?它没有这样做,它将优化的代码写入文件。在我的例子中,它被命名为+
。