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

            Bug ID: 113010
           Summary: [RISCV] sign-extension lost in comparison with
                    constant embedded in comma-op expression
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gkm at rivosinc dot com
  Target Milestone: ---

Implicit conversion rules in C for comparing (unsigned long) with (int) require
that (int) first widen to (long) extending sign, then convert to (unsigned
long). 

I debugged this far enough to see that expand_compound_operation () in
combine.cc converts (SIGN_EXTEND:DI (mem/c:SI ... )) into paradoxical
(SUBREG:DI (mem/c:SI ... )), and thus loses the sign extension.

It only happens when the constant comparand is within a comma operator.


Test case:
--------------------------------------------------
int minus_1 = -1;

int main ()
{
  return ((0, 0xfffffffful) < minus_1) ? 0 : 1;
}
--------------------------------------------------
Godbolt:
https://godbolt.org/z/xPMPzG1n1

The -march=rv64gc case begins to fail with gcc-13
The -march=rv64gc_zbs case begins to fail with gcc-12

Reply via email to