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.
"""

Reply via email to