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

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

Description:
The C code involve for loops with ternary operation on an unsigned long long &
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 18446744073696022185, 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 -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

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
/mnt/data1/sujayk/CIFUZZR/riscv-gnu-toolchain-build/bin/qemu-riscv64
user-config.out 1
0

  //Expected Output: 18446744073696022185
  //Actual Output: 0


-- testcase (red.c) --

short c = 2;
short l = 6;
unsigned char m;
int k;
int a = -1;
unsigned long long t[2][2];

int printf(const char *, ...);

void b( short c, int k, short l, unsigned m, unsigned long long t[][2]) {
    for( signed x=0; x<2; x++)
      for( int ab=0; ab<k+2; ab++)
        a = ({
                int ac = a;
                int ad = ({  int ac = l ? m : t[x][0];
                             unsigned long long ad = c ? m : t[x][x];
                             ac < ad ? ac : ad;  });

                ac < ad ? ac : ad;
          });
}

int main() {
    long long ag;
    b(c,k,l,m,t);
    ag = a;
    printf("%llu\n", ag);
}

Reply via email to