https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91016
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED Assignee|unassigned at gcc dot gnu.org |marxin at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> --- (In reply to Uroš Bizjak from comment #2) > ix86_expand_sse_compare_mask generates temporary by itself, so the REG RTX > is just overwritten. There is no issue with reusage of pseudos as they are > short lived, and die in AND RTX anyway. OTOH, non-AVX AND RTX requires > matched registers so I guess that this is a non-issue. > > I think the following (untested) patch should fix all mentioned issues for > good: Thank you for the patch, I'll test it and install. Is it pre-approved? > > --cut here-- > diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c > index d50b811d863f..8a4955f87d2f 100644 > --- a/gcc/config/i386/i386-expand.c > +++ b/gcc/config/i386/i386-expand.c > @@ -16052,14 +16052,13 @@ ix86_expand_rounddf_32 (rtx operand0, rtx operand1) > 0, OPTAB_DIRECT); > > /* Compensate. */ > - tmp = gen_reg_rtx (mode); > /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */ > tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false); > - emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, one, tmp))); > + emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, tmp, one))); > xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, > OPTAB_DIRECT); > /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */ > tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false); > - emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, one, tmp))); > + emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, tmp, one))); > xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, > OPTAB_DIRECT); > > /* res = copysign (xa2, operand1) */ > --cut here--