On Mon, Mar 04, 2024 at 09:34:30AM +0100, Uros Bizjak wrote:
> > --- gcc/config/i386/i386-expand.cc.jj 2024-03-01 14:56:34.120925989 +0100
> > +++ gcc/config/i386/i386-expand.cc 2024-03-03 18:41:08.278793046 +0100
> > @@ -451,6 +451,20 @@ ix86_expand_move (machine_mode mode, rtx
> > && GET_MODE (SUBREG_REG (op1)) == DImode
> > && SUBREG_BYTE (op1) == 0)
> > op1 = gen_rtx_ZERO_EXTEND (TImode, SUBREG_REG (op1));
> > + /* As not all values in XFmode are representable in real_value,
> > + we might be called with unfoldable SUBREGs of constants. */
> > + if (mode == XFmode
> > + && CONSTANT_P (SUBREG_REG (op1))
> > + && can_create_pseudo_p ())
>
> We have quite some unguarded force_regs in ix86_expand_move. While it
> doesn't hurt to have an extra safety net, is there a particular reason
> for can_create_pseudo_p check in the added code?
Various other places in ix86_expand_move do check can_create_pseudo_p, the
case I've mostly copied this from in ix86_expand_vector_move also does that,
and then there is the
Therefore, when given such a pair of operands, the pattern must
generate RTL which needs no reloading and needs no temporary
registers--no registers other than the operands. For example, if
you support the pattern with a 'define_expand', then in such a case
the 'define_expand' mustn't call 'force_reg' or any other such
function which might generate new pseudo registers.
in mov<M> description, which initially scared me off from using it at all.
Guess we'll ICE either way if something like that appears during RA.
Jakub