https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109086
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to liwei from comment #3) > Thank you for your quick reply! > > The final call of the expand_simple_binop function returns part of the code > as follows (optabs.cc): > > 1671 xop0 = widen_operand (xop0, wider_mode, mode, unsignedp, no_extend); > 1672 > 1673 /* The second operand of a shift must always be extended. */ > 1674 xop1 = widen_operand (xop1, wider_mode, mode, unsignedp, > 1675 no_extend && binoptab != ashl_optab); > 1676 > 1677 temp = expand_binop (wider_mode, binoptab, xop0, xop1, NULL_RTX, > 1678 unsignedp, OPTAB_DIRECT); > 1679 if (temp) > 1680 { > 1681 if (mclass != MODE_INT > 1682 || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode)) > 1683 { > 1684 if (target == 0) > 1685 target = gen_reg_rtx (mode); > 1686 convert_move (target, temp, 0); > 1687 return target; > 1688 } > 1689 else > 1690 return gen_lowpart (mode, temp); > 1691 } > > In the above code, target = result, when promote xop0 and xop1 machine mode > to DI, then match adddi3 insn pattern and save the new rtx to temp, then > because the mclass equal MODE_INT (also equal true for > TRULY_NOOP_TRUNCATION_MODES_P function), the code enter else branch and > return lowpart of temp which is irrelevant with target (i.e. result). Sure, but expand_simple_binop doesn't need to return 'target' > Maybe the expand_binop function does not consider the case of dependency > with `target` when generating rtx for the case of promote MODE_INT mode, and > maybe theoretically it does not need to be considered, except that > builtin_strcmp happens to meet such cases, so I think it is enough to modify > the processing logic of builtin_strcmp (my humble opinion). I'm still missing the obvious? We assign the result to 'result', so it should be all fine? I see that emit_cmp_and_jump_insns eventually forces the lowpart to a register but still it should work.