https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86526
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- As the patch contains a lot of formatting fixes (Qing, please watch out formatting of your patches more carefully, there should be no whitespace at the end of lines, tabs should be used rather than 8 spaces, we write type *var_or_arg rather than type* var_or_arg, etc.), here is just the important part from diff -upb: @@ -6785,6 +6785,8 @@ inline_string_cmp (rtx target, tree var_ rtx result = target ? target : gen_reg_rtx (mode); rtx_code_label *ne_label = gen_label_rtx (); tree unit_type_node = is_memcmp ? unsigned_char_type_node : char_type_node; + scalar_int_mode unit_mode + = as_a <scalar_int_mode> TYPE_MODE (unit_type_node); start_sequence (); @@ -6792,11 +6794,7 @@ inline_string_cmp (rtx target, tree var_ { var_rtx = adjust_address (var_rtx_array, TYPE_MODE (unit_type_node), offset); - const_rtx - = builtin_memcpy_read_str (CONST_CAST (char *, const_str), - offset, - as_a <scalar_int_mode> - TYPE_MODE (unit_type_node)); + const_rtx = c_readstr (const_str + offset, unit_mode); rtx op0 = (const_str_n == 1) ? const_rtx : var_rtx; rtx op1 = (const_str_n == 1) ? var_rtx : const_rtx; @@ -6805,8 +6803,7 @@ inline_string_cmp (rtx target, tree var_ if (i < length - 1) emit_cmp_and_jump_insns (result, CONST0_RTX (mode), NE, NULL_RTX, mode, true, ne_label); - offset - += GET_MODE_SIZE (as_a <scalar_int_mode> TYPE_MODE (unit_type_node)); + offset += GET_MODE_SIZE (unit_mode); } emit_label (ne_label);