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

            Bug ID: 116912
           Summary: Cross-compiling aarch64 on x86_64 incorrectly
                    ignores/discards function output parameter
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: seanjc at google dot com
  Target Milestone: ---

Created attachment 59242
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59242&action=edit
Intermediate output of the miscompiled file

aarch64-linux-gnu-gcc 13.2.0 and 11.4.0 (haven't tried other gcc versions) on
x86-64 miscompile this code snippet:

  static  noinline void set_pmcr_n(uint64_t *pmcr, uint64_t pmcr_n)
  {
        u64p_replace_bits((__u64 *) pmcr, pmcr_n, ARMV8_PMU_PMCR_N);
  }

        pmcr = pmcr_orig;
        printf("orig = %lx, next = %lx, want = %lu\n", pmcr_orig, pmcr,
pmcr_n);
        set_pmcr_n(&pmcr, pmcr_n);
        printf("orig = %lx, next = %lx, want = %lu\n", pmcr_orig, pmcr,
pmcr_n);

into code the ignores the @pmcr output parameter.  The generated code for
set_pmcr_n() is correct, the caller simply ignores the result that is stored
into @pmcr.  Note, the printf() calls aren't necessary to reproduce the issue,
they were added purely to serve as markers to make it easy to visually confirm
the issue.  There is other consumption of the set_pmcr_n() output that also
ignores the result (the issue originally manifested as a failed test).

E.g. aarch64-linux-gnu-gcc 13.2.0 generates:

 0000000000401c90 <set_pmcr_n>:
  401c90:       f9400002        ldr     x2, [x0]
  401c94:       b3751022        bfi     x2, x1, #11, #5
  401c98:       f9000002        str     x2, [x0]
  401c9c:       d65f03c0        ret

 0000000000402660 <test_create_vpmu_vm_with_pmcr_n>:
  ...
  402724:       aa1403e3        mov     x3, x20
  402728:       aa1503e2        mov     x2, x21
  40272c:       aa1603e0        mov     x0, x22
  402730:       aa1503e1        mov     x1, x21
  402734:       940060ff        bl      41ab30 <_IO_printf>
  402738:       aa1403e1        mov     x1, x20
  40273c:       910183e0        add     x0, sp, #0x60
  402740:       97fffd54        bl      401c90 <set_pmcr_n>
  402744:       aa1403e3        mov     x3, x20
  402748:       aa1503e2        mov     x2, x21
  40274c:       aa1503e1        mov     x1, x21
  402750:       aa1603e0        mov     x0, x22
  402754:       940060f7        bl      41ab30 <_IO_printf>

and running the compiled program with a value of pmcr_n=6 yields output of:

  orig = 3040, next = 3040, want = 0
  orig = 3040, next = 3040, want = 0

$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc-cross/aarch64-linux-gnu/13/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 13.2.0-13'
--with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-13 --enable-shared
--enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext
--enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace
--enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support
--enable-plugin --enable-default-pie --with-system-zlib
--enable-libphobos-checking=release --without-target-system-zlib
--enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu-
--includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.0 (Debian 13.2.0-13)

Reply via email to