https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122971
Bug ID: 122971
Summary: [16 Regression] [RISCV] [Miscompile] GCC - riscv64
target, miscompiles at -O3 since
ec870d3b5f378172006104bad674d7875463da18
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 62975
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62975&action=edit
Attached reduced testcase
Description:
The C code involve multiple for loops with operations on char & int, 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 16, but the program returns 0. This miscompilation
occurs specifically with optimization enabled at levels -O3.
Compiler flags:
-march=rv64gcv_zvl1024b -flto -mrvv-vector-bits=zvl -mrvv-max-lmul=m2 -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_zvl1024b -flto -mrvv-vector-bits=zvl -mrvv-max-lmul=m2 -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=1024,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: 16
//Actual Output: 0
-- testcase (red.c) --
int b;
long long c;
char a = 16;
int printf(const char *, ...);
int main() {
for (int g=0; g<6; g++)
for (char h=0; h<80; h++)
for (int i=0; i<12; i++)
for (int j=0; j<3; j++) {
a *= 83;
for (int k=0; k<6; k++)
b ^= 1040277492;
}
c = a;
printf("%llu\n", c);
}
This issue is Found via fuzzer.