https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123444
Bug ID: 123444
Summary: [16 Regression] [RISCV] [Miscompile] GCC - riscv64
target, miscompiles at -O3 since
ca8d97f8cb8d282c190183e9c297d5e0490bab4e
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: skothadiya at whileone dot in
Target Milestone: ---
Created attachment 63251
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=63251&action=edit
Attached reduced testcase
Description:
The C code involve for loops on various datatypes, 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 1, but the program returns 0. This miscompilation occurs specifically
with optimization enabled at level -O3.
Compiler flags:
-march=rv64gcv_zvl1024b -mrvv-vector-bits=zvl -mrvv-max-lmul=dynamic -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/cifuzz-pad/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc
-march=rv64gcv_zvl1024b -mrvv-vector-bits=zvl -mrvv-max-lmul=dynamic -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
gcc -O1 red.c -o native.out -fno-strict-aliasing -fwrapv -w
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 /riscv-gnu-toolchain-build/bin/qemu-riscv64
user-config.out 1
0
timeout --verbose -k 0.1 1 ./native.out 1
1
//Expected Output: 1
//Actual Output: 0
-- testcase (red.c) --
int printf(const char *, ...);
long long a;
int b = 3064864;
char c = 7;
long d = -3999289147344557351LL + 3999289147344557369;
_Bool e = 1;
short f[59];
int main() {
for (long i=0; i<19; ++i)
f[i] = 25158;
for (int j=0; j<d; j+=4)
for (char k=0; k<8; k+=b) {
int l = c ? f[j] : 0;
e = l ? e : l;
}
a = (int)e;
printf("%llu\n", a);
}
The issue is Found via fuzzer.