On Wed, Jul 22, 2020 at 09:33:47AM +0100, Richard Sandiford wrote:
> Jozef Lawrynowicz <joze...@mittosystems.com> writes:
> > is_int_mode does not allow MODE_PARTIAL_INT modes, so convert_modes was
> > not allowing a constant value to be converted to a MODE_PARTIAL_INT for
> > use as operand 2 in patterns such as ashlpsi3. The constant had
> > to be copied into a register before it could be used, but now can be
> > used directly as an operand without any copying.
> 
> Yeah.  I guess this dates back to when MODE_PARTIAL_INTs didn't have
> a known precision.

Is that what the section on MODE_PARTIAL_INT in the description for the
"subreg" RTX refers to?  From "14.8 Registers and Memory" of gccint:

  A MODE_PARTIAL_INT mode behaves as if it were as wide as the corresponding
  MODE_INT mode, except that it has an unknown number of undefined bits.

If so, that whole section seems out of date. I can work on getting it
fixed up.

> 
> > diff --git a/gcc/expr.c b/gcc/expr.c
> > index c7c3e9fd655..5a252f0935f 100644
> > --- a/gcc/expr.c
> > +++ b/gcc/expr.c
> > @@ -696,7 +696,7 @@ convert_modes (machine_mode mode, machine_mode oldmode, 
> > rtx x, int unsignedp)
> >      return x;
> >  
> >    if (CONST_SCALAR_INT_P (x)
> > -      && is_int_mode (mode, &int_mode))
> > +      && is_a <scalar_int_mode> (mode, &int_mode))
> >      {
> >        /* If the caller did not tell us the old mode, then there is not
> >      much to do with respect to canonicalization.  We have to
> 
> I think we also need to change the condition in:
> 
>       /* If the caller did not tell us the old mode, then there is not
>        much to do with respect to canonicalization.  We have to
>        assume that all the bits are significant.  */
>       if (GET_MODE_CLASS (oldmode) != MODE_INT)
> 
> to is_a <scalar_int_mode> (old_mode)
> 
> OK with that, thanks.

Thanks, I'll regtest that change and apply if all looks good.

Jozef
> 
> Richard

Reply via email to