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

            Bug ID: 125478
           Summary: [16/17 Regression][RISCV][Miscompile] GCC -
                    miscompiles at -O3 since
                    g:948d33f490a6b0051376da6bdcf55223a552b30f
           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 64565
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=64565&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 0, but the program returns 18446744073709551615. This
miscompilation occurs with optimization enabled at level -O3.


COMMANDS:
/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc -march=rv64gcv -O3
-mrvv-vector-bits=zvl 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
18446744073709551615

  //Expected Output: 0
  //Actual Output: 18446744073709551615


-- testcase (red.c) --
long long a;
long b;
char c[169];
int d;

int printf(const char *, ...);
int main() {
  for (long g=0; g<13; ++g)
    for (long h=0; h<13; ++h)
      c[g*13 +h] = 8;

  for (unsigned g=0; g<13; g++)
    for (int h=0; h<13; h +=3)
      b += (c[g*13+h]) >> c[g*13 +9];

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


The issue is Found via fuzzer.
  • [Bug tree-optimization/125478] ... skothadiya at whileone dot in via Gcc-bugs

Reply via email to