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