expr: Allow scalar_int_mode target mode when converting a constant
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Wed, 22 Jul 2020 11:34:30 +0000 (12:34 +0100)
committerJozef Lawrynowicz <jozef.l@mittosystems.com>
Wed, 22 Jul 2020 11:34:46 +0000 (12:34 +0100)
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

index b4bbeff..5db0a7a 100644 (file)
@@ -696,12 +696,12 @@ 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
         assume that all the bits are significant.  */
-      if (GET_MODE_CLASS (oldmode) != MODE_INT)
+      if (!is_a <scalar_int_mode> (oldmode))
        oldmode = MAX_MODE_INT;
       wide_int w = wide_int::from (rtx_mode_t (x, oldmode),
                                   GET_MODE_PRECISION (int_mode),