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

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

Description:
The C code involve for loop operations using char, long long, int & unsigned,
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 113, but the program returns 0. This
miscompilation occurs specifically with optimization enabled at levels -O3.

Compiler flags:
-march=rv64gcv   -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/CIFUZZR/riscv-gnu-toolchain-build/bin/riscv64-unknown-linux-gnu-gcc
-march=rv64gcv_zvl1024b -mrvv-vector-bits=zvl -mrvv-max-lmul=m8 -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
0

  //Expected Output: 113
  //Actual Output: 0


-- testcase (red.c) --

int printf(const char *, ...);
long long a;
char b = 9;
long c;

int main() {
    for (char f=0; f<2; f++)
      for (int g=3; g<10; g++)
        for (unsigned h=!c; h<10; h += 3)
          b *= 3;
    a = (int)b;
    printf("%llu\n", a);
}

Reply via email to