When nvptx_assemble_value is called with size == 16, this bitshift runs
into UB:
...
val &= ((unsigned HOST_WIDE_INT)2 << (size * BITS_PER_UNIT - 1)) - 1;
...
Fix this by checking the shift amount.
Tested on nvptx.
gcc/ChangeLog:
* config/nvptx/nvptx.c (nvptx_assemble_value): Fix undefined
behaviour.
bool negative_p
= val & (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1));
- val &= ((unsigned HOST_WIDE_INT)2 << (size * BITS_PER_UNIT - 1)) - 1;
+ /* Avoid undefined behaviour. */
+ if (size * BITS_PER_UNIT < HOST_BITS_PER_WIDE_INT)
+ val &= (HOST_WIDE_INT_1U << (size * BITS_PER_UNIT)) - 1;
for (unsigned part = 0; size; size -= part)
{