Re: [PATCH 1/3] expr: Allow scalar_int_mode target mode when converting a constant

2020-07-24 Thread Richard Sandiford
Jozef Lawrynowicz  writes:
> On Wed, Jul 22, 2020 at 09:33:47AM +0100, Richard Sandiford wrote:
>> Jozef Lawrynowicz  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.

Yeah.  Before d8487c949ad5 the number of significant bits in a partial
mode was hidden from target-independent code.

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

Sounds good :-)

Thanks,
Richard


Re: [PATCH 1/3] expr: Allow scalar_int_mode target mode when converting a constant

2020-07-22 Thread Jozef Lawrynowicz
On Wed, Jul 22, 2020 at 09:33:47AM +0100, Richard Sandiford wrote:
> Jozef Lawrynowicz  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  (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  (old_mode)
> 
> OK with that, thanks.

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

Jozef
> 
> Richard


Re: [PATCH 1/3] expr: Allow scalar_int_mode target mode when converting a constant

2020-07-22 Thread Richard Sandiford
Jozef Lawrynowicz  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.

> 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  (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  (old_mode)

OK with that, thanks.

Richard


[PATCH 1/3] expr: Allow scalar_int_mode target mode when converting a constant

2020-07-21 Thread Jozef Lawrynowicz
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.

Successfully regtested on trunk for x86_64-pc-linux-gnu and msp430-elf.
Ok to apply?
>From 485feafad6ef0966ff0e1d2ae383cd2b6dbc5c96 Mon Sep 17 00:00:00 2001
From: Jozef Lawrynowicz 
Date: Wed, 15 Jul 2020 11:19:16 +0100
Subject: [PATCH 1/3] expr: Allow scalar_int_mode target mode when converting a
 constant

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.

gcc/ChangeLog:

* expr.c (convert_modes): Allow a constant integer to be converted to
any scalar int mode.

---
 gcc/expr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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  (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
-- 
2.27.0