https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116772
Bug ID: 116772 Summary: [15 regression] SIGFPE (branch optimised out) in eigen-3.4.0 testsuite Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: sjames at gcc dot gnu.org Target Milestone: --- Forwarding a report from Paul Zander in Gentoo: """ While running the eigen-3.4.0 test suite in gentoo, a few tests fail with "signal SIGFPE, Arithmetic exception" under gcc-15. > Program received signal SIGFPE, Arithmetic exception. > 0x0000555555559dda in Eigen::internal::gemm_pack_lhs<double, long, > Eigen::internal::const_blas_data_mapper<double, long, 0>, 4, 2, double > __vector(4), 0, false, false>::operator()(double*, > Eigen::internal::const_blas_data_mapper<double, long, 0> const&, long, long, > long, long) (blockA=blockA@entry=0x7fffffffcb40, lhs=..., > depth=depth@entry=3, > rows=rows@entry=3, stride=stride@entry=0, offset=offset@entry=0, > this=<optimized out>) at > /var/tmp/paludis/dev-cpp-eigen-3.4.0-r3/work/eigen-3.4.0/Eigen/src/Core/products/GeneralBlockPanelKernel.h:2121 > 2121 const Index peeled_mc0 = Pack2>=PacketSize ? peeled_mc_quarter > (gdb) x/i $pc > => 0x555555559dda > <_ZN5Eigen8internal13gemm_pack_lhsIdlNS0_22const_blas_data_mapperIdlLi0EEELi4ELi2EDv4_dLi0ELb0ELb0EEclEPdRKS3_llll+154>: > idiv %r13 The failure occurs in > const Index peeled_mc0 = Pack2>=PacketSize ? peeled_mc_quarter > : Pack2>1 && last_lhs_progress ? > (rows/last_lhs_progress)*last_lhs_progress : 0; https://gitlab.com/libeigen/eigen/-/blob/3.4/Eigen/src/Core/products/GeneralBlockPanelKernel.h?ref_type=heads#L2121-2122 A simple reproducer is https://godbolt.org/z/a5hzzK377 > #include <iostream> > template<typename Index> > Index round(Index a,Index b){ > return b!=0 ? a/b*b :0; > } > > int main() { > std::cout << round<long>(3L, 1L) << '\n'; > std::cout << round<long>(3L, 0L) << '\n'; > return 0; > } Looking at assembler code gcc-15 reduces the ternary operation to "a/b*b", which then fails for b == 0. """