https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115967
Bug ID: 115967 Summary: ubsan: shift exponent 64 is too large for 64-bit type HOST_WIDE_INT in ext-dce.cc on line 600 since r15-1901-g98914f9eba5f19 Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: jamborm at gcc dot gnu.org CC: law at gcc dot gnu.org Blocks: 63426 Target Milestone: --- Host: x86_64-linux Target: x86_64-linux Undefined behavior sanitizer reports a failure when running Fortran testcase gfortran.dg/ieee/large_1.f90 at -O2 and higher: /home/mjambor/gcc/mine/src/gcc/ext-dce.cc:600:15: runtime error: shift exponent 64 is too large for 64-bit type 'long unsigned int' /home/mjambor/gcc/mine/src/gcc/ext-dce.cc:404:23: runtime error: left shift of negative value -1 FAIL: gfortran.dg/ieee/large_1.f90 -O2 (test for excess errors) The failure is present since the introduction of the source file ext-dce.cc with commit r15-1901-g98914f9eba5f19 (Jeff Law: [to-be-committed][RISC-V][V3] DCE analysis for extension elimination) One way to reproduce the issue is to bootstrap GCC with Fortran enabled and with --with-build-config=bootstrap-ubsan and then run the test case as usual. It is however much easier to (on an x86_64-linux at least) simply apply the following patch and then run make -k check-gfortran RUNTESTFLAGS="ieee.exp=large_1.f90" --- a/gcc/ext-dce.cc +++ b/gcc/ext-dce.cc @@ -597,6 +597,7 @@ ext_dce_process_uses (rtx_insn *insn, rtx obj, bitmap live_tmp) bit = subreg_lsb (y).to_constant (); if (dst_mask) { + gcc_assert (bit < 64); dst_mask <<= bit; if (!dst_mask) dst_mask = -0x100000000ULL; Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63426 [Bug 63426] [meta-bug] Issues found with -fsanitize=undefined