https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120479
Bug ID: 120479 Summary: missed opportunity to generate czero.nez Product: gcc Version: 16.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: bonzini at gnu dot org Target Milestone: --- Target: riscv Given this code: void f(unsigned *s, unsigned a0, unsigned a1, unsigned a2, unsigned a3) { unsigned r, c; r = s[0] + a0; s[0] = r; c = r < a0; // (1) r = s[1] + a1; s[1] = r + c; c = (r < a1) | (r == -1 ? c : 0); // (2) r = s[2] + a2; s[2] = r + c; c = (r < a2) | (r == -1 ? c : 0); s[3] += a3 + c; } with "-O2 -march=rv32g_zicond", GCC generates the following instructions to compute the expression marked with (2): ; c from line (1) in a7; r+1 in t1 seqz t1,t1 and t3,a7,t1 ; t3 = (t1 == 0) ? 0 : a7 sltu a5,a2,a5 ; r<a1 in a5 or a5,a5,t3 The seqz+and sequence can be replaced by a single czero.nez instruction: ; c from line (1) in a7, r+1 in t1 czero.nez t3,a7,t1 ; t3 = (t1 != 0) ? a7 : 0 sltu a5,a2,a5 ; r<a1 in a5 or a5,a5,t3