https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95443
Bug ID: 95443 Summary: cmpstrnqi patterns update string length Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: hjl.tools at gmail dot com CC: crazylht at gmail dot com, hubicka at ucw dot cz, ubizjak at gmail dot com Target Milestone: --- Target: i386,x86-64 We have countreg = ix86_zero_extend_to_Pmode (operands[3]); /* %%% Iff we are testing strict equality, we can use known alignment to good advantage. This may be possible with combine, particularly once cc0 is dead. */ align = operands[4]; if (CONST_INT_P (operands[3])) { if (operands[3] == const0_rtx) { emit_move_insn (operands[0], const0_rtx); DONE; } emit_insn (gen_cmpstrnqi_nz_1 (addr1, addr2, countreg, align, operands[1], operands[2])); } else { emit_insn (gen_cmp_1 (Pmode, countreg, countreg)); emit_insn (gen_cmpstrnqi_1 (addr1, addr2, countreg, align, operands[1], operands[2])); } cmpstrnqi patterns updates countreg to 0, wich can lead to wrong codes.