[nvptx] Fix printing of 128-bit constant
authorTom de Vries <tdevries@suse.de>
Thu, 10 Sep 2020 13:54:14 +0000 (15:54 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 10 Sep 2020 19:30:33 +0000 (21:30 +0200)
Currently, for this code from c-c++-common/spec-barrier-1.c:
...
__int128 g = 9;
...
we generate:
...
// BEGIN GLOBAL VAR DEF: g
.visible .global .align 8 .u64 g[2] = { 9, 9 };
...
and consequently the test-case fails in execution.

The problem is caused by a shift in nvptx_assemble_value:
...
      val >>= part * BITS_PER_UNIT;
...
where the shift amount is equal to the number of bits in val, which is
undefined behaviour.

Fix this by detecting the situation and setting val to 0.

Tested on nvptx.

gcc/ChangeLog:

PR target/97004
* config/nvptx/nvptx.c (nvptx_assemble_value): Handle shift by
number of bits in shift operand.

gcc/config/nvptx/nvptx.c

index 0376ad6ce9f37f5d88983a69d43a6ed854c618e1..ffcbe591a8f34111321b068eefd11da708e9c2ca 100644 (file)
@@ -2054,7 +2054,11 @@ nvptx_assemble_value (unsigned HOST_WIDE_INT val, unsigned size)
 
   for (unsigned part = 0; size; size -= part)
     {
-      val >>= part * BITS_PER_UNIT;
+      if (part * BITS_PER_UNIT == HOST_BITS_PER_WIDE_INT)
+       /* Avoid undefined behaviour.  */
+       val = 0;
+      else
+       val >>= (part * BITS_PER_UNIT);
       part = init_frag.size - init_frag.offset;
       part = MIN (part, size);