https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91287
Bug ID: 91287
Summary: LTO disables linking with scalar MASS library (Fortran
only)
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: lto
Assignee: unassigned at gcc dot gnu.org
Reporter: wschmidt at gcc dot gnu.org
CC: marxin at gcc dot gnu.org
Target Milestone: ---
The MASS (Mathematical Acceleration Subsystem) libraries provide alternatives
to math functions in libm. We've discovered that when compiling a Fortran
program with -flto, the program is linked with libm rather than with the MASS
functions, leading to a degradation in performance versus not using -flto.
luoxhu@genoa test_mass $ cat hellofortran.f90
recursive subroutine square_cube(i,isquare,icube)
integer, intent(in) :: i ! input
integer, intent(out) :: isquare,icube ! output
!square = i**2
isquare = atan2 (real(i), real(2))
icube = i**3
if(i == 8) return
call square_cube(i+1,isq,icub)
end subroutine square_cube
program xx
implicit none
integer :: i,isq,icub
i = 1
call square_cube(i,isq,icub)
print*,"i,i^2,i^3=",i,isq,icub
end program xx
luoxhu@genoa test_mass $ cat build_fortran.sh
echo "mass without lto"
~/local/gcc_t/bin/gfortran -O3 -mcpu=power9 hellofortran.f90 -mveclibabi=mass
-L/opt/mass/8.1.3/Linux_LE/lib/ -lmass
nm a.out |grep atan2
echo "mass link with lto"
~/local/gcc_t/bin/gfortran -O3 -mcpu=power9 hellofortran.f90 -mveclibabi=mass
-L/opt/mass/8.1.3/Linux_LE/lib/ -lmass -flto
nm a.out |grep atan2
luoxhu@genoa test_mass $ ./build_fortran.sh
mass without lto
0000000010000a40 T atan2f
0000000010000a40 T _atan2f
mass link with lto
00000000100006f0 t 000001f8.plt_call.atan2f@@GLIBC_2.17
U atan2f@@GLIBC_2.17
The issue appears to occur during the "visibility" pass:
no-lto: (always __builtin_atan2f)
hellofortran.f90.013t.ompexp: _3 = __builtin_atan2f (_2, 2.0e+0);
hellofortran.f90.018t.fixup_cfg1: _3 = __builtin_atan2f (_2, 2.0e+0);
lto: (__builtin_atan2f -> atan2f )
hellofortran.f90.013t.ompexp: _3 = __builtin_atan2f (_2, 2.0e+0);
hellofortran.f90.016i.visibility:atan2/3 (atan2) @0x3fffb53e0708
hellofortran.f90.018t.fixup_cfg1: _3 = atan2f (_2, 2.0e+0);
We've observed that the problem does not occur with a similar C/C++ test case.
It's not clear to me whether this is an LTO problem or a Fortran front end
problem.
Thanks to Luo Xiong Hu for the test case and initial investigation.