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.

Reply via email to