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

            Bug ID: 123097
           Summary: [16 Regression] [RISCV] [Miscompile] GCC - riscv64
                    target, miscompiles at -O3 since
                    0b129b8b368635b3170aa276809d644dc99e3256
           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 63038
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=63038&action=edit
Attached reduced testcase

Description:
The C code involve multiple for loops with operations and usage of long long &
Bool 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 0, but the program returns 1.
This miscompilation occurs specifically with optimization enabled at levels
-O3.

Compiler flags:
-march=rv64gcv -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:
/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc -march=rv64gcv -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=128,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 /riscv-gnu-toolchain-build/bin/qemu-riscv64
user-config.out 1

  //Expected Output: 0
  //Actual Output: 1


-- testcase (red.c) --

long long a;
int b[22];
_Bool c[22];

int printf(const char *, ...);
int main() {
    for (long f=0; f<10; ++f)
      b[f] = c[f] = 1;
    for (int f=0; f<5; f++)
      for( int g=0; g<5; g++)
        c[g*2] &= (_Bool)b[2*f];
    for (long f=0; f<2; ++f)
      a ^= c[f];
    printf("%llu\n", a);
}


The issue is Found via fuzzer.

Reply via email to