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.
This commit is contained in:
Jozef Lawrynowicz 2020-07-22 12:34:30 +01:00
parent ade6e7204c
commit 4821e0aabe
1 changed files with 2 additions and 2 deletions

View 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),