https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123940
Bug ID: 123940
Summary: [14/15/16 Regression] [RISCV] [Miscompile] GCC -
riscv64 target, miscompiles at -O3 since
g:4eba48a684b1a1f77aa18b29a1ae58dbdc842b5b
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 63563
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=63563&action=edit
Attached reduced testcase
Description:
The testcase code involves 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 15, but the program returns 0. This miscompilation occurs
with optimization enabled at level -O3.
COMMANDS:
/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc
-march=rv64gcv_zvl256b -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=256,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
-- testcase (red.c) --
int printf(const char *, ...);
long a;
long long b;
_Bool c[16];
char d[16];
char e;
int f = 1;
int main() {
for (long i=0; i<16; ++i)
c[i] = 40;
for (int j=0; j<16; j++) {
e = (c[j] ? j : d[j]) + d[j];
a = f * c[j] ?: ~0;
}
b = (int)e;
printf("%llu\n", b);
}
The issue is Found via fuzzer.