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

            Bug ID: 123022
           Summary: [16 Regression] [RISCV] [Miscompile] GCC - riscv64
                    target, miscompiles at -O3 since
                    4e2a2d6ad2d1bfe1269bc78da4251814505eb42e
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: skothadiya at whileone dot in
  Target Milestone: ---

Created attachment 63002
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=63002&action=edit
Attached reduced testcase

Description:
The C code involve multiple for loops with operations and usage of long, char,
unsigned & int variables compiles correctly on x86_64 and produces the expected
output. However, when compiled for the riscv64 architecture, the resulting
binary yields an incorrect value. The expected output is 3326195747, but the
program returns 18446744073709551615. This miscompilation occurs specifically
with optimization enabled at levels -O3.

Compiler flags:
-march=rv64gcv_zvl512b -mrvv-vector-bits=zvl -O3

Reproduction Steps:
1. Compile the test case with GCC for riscv64 using the -O3 flag.
2. Execute the compiled binary.
3. Observe the output.

COMMANDS:
/mnt/data1/sujayk/CIFUZZR/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc
-march=rv64gcv_zvl512b -mrvv-vector-bits=zvl -O3 red.c -o user-config.out
-fsigned-char -fno-strict-aliasing -fwrapv -Wno-unknown-warning-option -Werror
-Wfatal-errors -Wall -Wformat -Wno-int-in-bool-context -Wno-dangling-pointer
-Wno-compare-distinct-pointer-types -Wno-overflow -Wuninitialized
-Warray-bounds -Wreturn-type -Wno-unused-function -Wno-unused-variable
-Wno-unused-but-set-variable -Wno-unused-value -Wno-address -Wno-bool-compare
-Wno-pointer-sign -Wno-bool-operation -Wno-tautological-compare
-Wno-self-assign -Wno-implicit-const-int-float-conversion
-Wno-constant-conversion -Wno-unused-value
-Wno-tautological-constant-out-of-range-compare -Wno-constant-logical-operand
-Wno-parentheses-equality -Wno-pointer-sign

QEMU_CPU=rv64,vlen=512,rvv_ta_all_1s=true,rvv_ma_all_1s=true,v=true,vext_spec=v1.0,zve32f=true,zve64f=true
timeout --verbose -k 0.1 4
/mnt/data1/sujayk/CIFUZZR/riscv-gnu-toolchain-build/bin/qemu-riscv64
user-config.out 1

  //Expected Output: 3326195747
  //Actual Output: 18446744073709551615


-- testcase (red.c) --

int printf(const char *, ...);
unsigned e[2][2];
long a;
char c[2];

int main() {
    long long b;
    c[1] = 3;
    for (unsigned h=0; h<2; h++)
      for (int i=c[0]; i<5; i+=5)
        for (int j=0; j<219; j++)
          a = c[h] ? e[h][h] + 3326195747 : 0;

    b = a;
    printf("%llu\n", b);
}


The issue is Found via fuzzer.

Reply via email to