[nvptx] Fix UB in nvptx_assemble_value
authorTom de Vries <tdevries@suse.de>
Fri, 11 Sep 2020 05:13:25 +0000 (07:13 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 11 Sep 2020 05:27:56 +0000 (07:27 +0200)
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.

gcc/config/nvptx/nvptx.c

index 4fca0ed76d9a063e697dd33ce8688b39fc5b88ad..0c590d8d1f6723a70965f1805323a28c43e6b2df 100644 (file)
@@ -2053,7 +2053,9 @@ nvptx_assemble_value (unsigned HOST_WIDE_INT val, unsigned size)
   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)
     {