讓我們考慮這個Fortran 95的一段代碼(假設它包含在一個名爲main.f95
文件):gfortran如何處理無法訪問的代碼?
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
正如你可以看到,在if (r32bit)
的else
部分不可達。我跑了以下內容:
% gfortran -O3 -Wunreachable-code -fdump-tree-optimized main.f95
,看是否gfortran
發現無法訪問的一部分,並刪除無用的分支或沒有,但是這給一個拼命空輸出。看來gfortran
不會在本例中撕掉代碼中不可到達的部分。
所以,我的問題是以下幾點:什麼是防止gfortran
檢測到這個else
部分是無用的,並擺脫它?
@Adrien我不相信你的代碼「無法訪問」。這只是錯誤的,因爲錯誤指出,你的'真正的myReal'實際上是一個64位機器上的「真實(8)」。如果分支,編譯器不能(並且不應該)基於「無用」更改不正確的代碼。我想你可以很容易地想象如何徹底摧毀遺留的代碼庫重新編譯爲現代用途。 – NoseKnowsAll
@NoseKnowsAll條件'if(r32bit)'使呼叫確實無法訪問。如果myReal是真實的(8)',感謝上述條件,這是沒有辦法的。我並不是要求編譯器糾正錯誤的調用,而是不會在永遠不會執行的調用中引發錯誤。 – Adrien
@francescalus有道理。它解釋了爲什麼使用'-fdefault-real-8'選項編譯失敗。但是它並沒有解釋爲什麼當我沒有這個選項編譯時(在這種情況下代碼是有效的)沒有執行消除。 – Adrien