https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121689

            Bug ID: 121689
           Summary: gcc-15.2 makes qemu riscv emulation on ppc64 jump into
                    an if (false) when -fgcse is enabled.
           Product: gcc
           Version: 15.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: christian.ehrhardt at canonical dot com
  Target Milestone: ---

Created attachment 62212
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62212&action=edit
the preprocessed file (*.i*) that triggers the bug - from a qemu 10.1 build

Hi,
For the report here I'll focus on what a gcc bug report should have per [1]
But if you want more details, background how it was found or built files with
debuginfo to look at the effective compiler output in good and bad case, you
might look at the Ubuntu bug [2] and would probably find it. 


# the exact version of GCC

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/powerpc64le-linux-gnu/15/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: powerpc64le-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 15.2.0-1ubuntu1'
--with-bugurl=file:///usr/share/doc/gcc-15/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust,cobol,algol68
--prefix=/usr --with-gcc-major-version-only --program-suffix=-15
--program-prefix=powerpc64le-linux-gnu- --enable-shared
--enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext
--enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace
--enable-gnu-unique-object --enable-plugin --enable-default-pie
--with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --with-libphobos-druntime-only=yes
--enable-objc-gc=auto --enable-secureplt --with-cpu=power9
--enable-targets=powerpcle-linux --disable-multilib --enable-multiarch
--disable-werror --with-long-double-128 --with-long-double-format=ieee
--enable-offload-targets=nvptx-none=/build/gcc-15-4HtANx/gcc-15-15.2.0/debian/tmp-nvptx/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=powerpc64le-linux-gnu --host=powerpc64le-linux-gnu
--target=powerpc64le-linux-gnu --with-build-config=bootstrap-lto-lean
--enable-link-serialization=1
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.0 (Ubuntu 15.2.0-1ubuntu1)


# the system type;

- A VM matching the Ubuntu build and test environments.
- 2 cpus, 4 gb memory
- Running Ubuntu 25.10 questing [6] daily builds
- Chip POWER9 (architected), altivec supported, 2.3 (pvr 004e 1203)


# the options given when GCC was configured/built
>From [4][5] which is Ubuntu building the toolchain I got the following, if in
doubt more can be found in that build log.

Configured with: -v
         --with-pkgversion='Ubuntu 15.2.0-1ubuntu1'
         --with-bugurl='file:///usr/share/doc/gcc-15/README.Bugs'
        
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust,cobol,algol68
         --prefix=/usr
         --with-gcc-major-version-only
         --program-suffix=-15
         --program-prefix=powerpc64le-linux-gnu-
         --enable-shared
         --enable-linker-build-id
         --libexecdir=/usr/libexec
         --without-included-gettext
         --enable-threads=posix
         --libdir=/usr/lib
         --enable-nls
         --enable-bootstrap
         --enable-clocale=gnu
         --enable-libstdcxx-debug
         --enable-libstdcxx-time=yes
         --with-default-libstdcxx-abi=new
         --enable-libstdcxx-backtrace
         --enable-gnu-unique-object
         --enable-plugin
         --enable-default-pie
         --with-system-zlib
         --enable-libphobos-checking=release
         --with-target-system-zlib=auto
         --with-libphobos-druntime-only=yes
         --enable-objc-gc=auto
         --enable-secureplt
         --with-cpu=power9
         --enable-targets=powerpcle-linux
         --disable-multilib
         --enable-multiarch
         --disable-werror
         --with-long-double-128
         --with-long-double-format=ieee
        
--enable-offload-targets=nvptx-none=/<<PKGBUILDDIR>>/debian/tmp-nvptx/usr
         --enable-offload-defaulted
         --without-cuda-driver
         --enable-checking=release
         --build=powerpc64le-linux-gnu
         --host=powerpc64le-linux-gnu
         --target=powerpc64le-linux-gnu
         --with-build-config=bootstrap-lto-lean
         --enable-link-serialization=1


# the complete command line that triggers the bug;

>From qemu build ninja -v:

[2/2] gcc-15 -m64 -mlittle-endian -Ilibqemu-riscv64-softmmu.a.p -I. -I..
-Itarget/riscv -I../target/riscv -Isubprojects/libvduse
-I../subprojects/libvduse -Iqapi -Itrace -Iui -Iui/shader
-I/usr/include/p11-kit-1 -I/usr/include/pixman-1 -I/usr/include/libpng16
-I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/glib-2.0
-I/usr/lib/powerpc64le-linux-gnu/glib-2.0/include -I/usr/include/sysprof-6
-I/usr/include/libmount -I/usr/include/blkid -I/usr/include/gio-unix-2.0
-I/usr/include/pipewire-0.3 -I/usr/include/spa-0.2 -I/usr/include/fuse3
-I/usr/include/powerpc64le-linux-gnu -fdiagnostics-color=auto -Wall
-Winvalid-pch -Werror -std=gnu11 -O2 -g -fstack-protector-strong -Wempty-body
-Wendif-labels -Wexpansion-to-defined -Wformat-security -Wformat-y2k
-Wignored-qualifiers -Wimplicit-fallthrough=2 -Winit-self
-Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs
-Wold-style-declaration -Wold-style-definition -Wredundant-decls -Wshadow=local
-Wstrict-prototypes -Wtype-limits -Wundef -Wvla -Wwrite-strings
-Wno-missing-include-dirs -Wno-psabi -Wno-shift-negative-value -isystem
/root/qemu/linux-headers -isystem linux-headers -iquote . -iquote /root/qemu
-iquote /root/qemu/include -iquote /root/qemu/host/include/ppc64 -iquote
/root/qemu/host/include/generic -iquote /root/qemu/tcg/ppc -pthread
-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
-fno-common -fwrapv -ftrivial-auto-var-init=zero -fzero-call-used-regs=used-gpr
-O2 -g -Wno-implicit-fallthrough -Wno-error=address -Wno-error=type-limits
-save-temps -fPIE -isystem /usr/include/mit-krb5 -D_REENTRANT -D_DEFAULT_SOURCE
-D_XOPEN_SOURCE=600 -DNCURSES_WIDECHAR=1 -isystem../linux-headers
-isystemlinux-headers -DCOMPILING_PER_TARGET
'-DCONFIG_TARGET="riscv64-softmmu-config-target.h"'
'-DCONFIG_DEVICES="riscv64-softmmu-config-devices.h"' -MD -MQ
libqemu-riscv64-softmmu.a.p/target_riscv_pmu.c.o -MF
libqemu-riscv64-softmmu.a.p/target_riscv_pmu.c.o.d -o
libqemu-riscv64-softmmu.a.p/target_riscv_pmu.c.o -c ../target/riscv/pmu.c


# the compiler output (error messages, warnings, etc.); and

There is no warning/error message reported.
The issue can be seen when running the code.

# the preprocessed file (*.i*) that triggers the bug

I'll attach target_riscv_pmu.c.i

# Minimal background

This was spotted testing the new qemu 10.1, but actually found an issue with
gcc-15 which was also recently updated in Ubuntu 25.10. The non pre-processed
code (so you can see the surroundings) matches [3] from the qemu project.
This is emulating riscv in qemu and the same code runs fine on x86, arm64,
s390x - but on ppc64 as the build and host platform it fails.

When building with -O2 I found it failing, and eventually debugging made me
able to verify that the smallest set of good/bad is
- bad: CFLAGS="-O2 -g"
- good: CFLAGS="-O2 -g -fno-gcse"

The behavior then is odd as it executes inside a seemingly false condition

## code ##
qemu.git/target/riscv/pmu.c

  192 static void riscv_pmu_icount_update_priv(CPURISCVState *env,
  193 target_ulong newpriv, bool new_virt)
  194 {
  195 uint64_t *snapshot_prev, *snapshot_new;
  196 uint64_t current_icount;
  197 uint64_t *counter_arr;
  198 uint64_t delta;
  199
  200 if (icount_enabled()) {
  201 current_icount = icount_get_raw();
  202 } else {
  203 current_icount = cpu_get_host_ticks();
  204 }
  205 ...

Thread 3 "qemu-system-ris" hit Breakpoint 1, riscv_pmu_icount_update_priv
(env=0x10147c310, newpriv=1, new_virt=false) at ../target/riscv/pmu.c:200
200 if (icount_enabled()) {
(gdb) n
203 current_icount = cpu_get_host_ticks();
(gdb) n
206 if (env->virt_enabled) {
(gdb) n
211 counter_arr = env->pmu_fixed_ctrs[1].counter;
(gdb) n
212 snapshot_prev = env->pmu_fixed_ctrs[1].counter_prev;
(gdb) n
215 if (new_virt) {
(gdb) n
216 g_assert(newpriv <= PRV_S);
(gdb) p new_virt
$1 = false

For awareness of the project this was also reported to qemu [7].

[1]: https://gcc.gnu.org/bugs/#need
[2]: https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/2120835
[3]:
https://gitlab.com/qemu-project/qemu/-/blame/v10.1.0/target/riscv/pmu.c?ref_type=tags#L206
[4]:
https://launchpad.net/ubuntu/+source/gcc-15/15.2.0-1ubuntu1/+build/31076840
[5]:
https://launchpadlibrarian.net/810820637/buildlog_ubuntu-questing-ppc64el.gcc-15_15.2.0-1ubuntu1_BUILDING.txt.gz
[6]: https://discourse.ubuntu.com/t/questing-quokka-release-schedule/36462
[7]: https://lists.gnu.org/archive/html/qemu-devel/2025-08/msg03901.html

Reply via email to