Fix PR78556 - left shift of negative values
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Mon, 28 Nov 2016 18:33:19 +0000 (18:33 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Mon, 28 Nov 2016 18:33:19 +0000 (18:33 +0000)
Running bootstrap-ubsan on ppc64le shows many instances of e.g.:
 config/rs6000/rs6000.c:6217:36: runtime error: left shift of negative value -12301

        PR target/78556
* config/rs6000/rs6000.c (vspltis_constant): Add casts to avoid
left shifting of negative values.

From-SVN: r242928

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index ded59707617b044e0dc977566057b915e1410f19..41dcb5d6ca5678953c793c51da521831f2eb81fc 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-28  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       PR target/78556
+       * config/rs6000/rs6000.c (vspltis_constant): Add casts to avoid
+       left shifting of negative values.
+
 2016-11-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/78298
index 6c28e6aaf6543a03b5db0a91e35b452d1eb47b98..dfb5dc86b118383eab5bafed5c898c20d3932857 100644 (file)
@@ -6214,7 +6214,9 @@ vspltis_constant (rtx op, unsigned step, unsigned copies)
       bitsize /= 2;
       small_val = splat_val >> bitsize;
       mask >>= bitsize;
-      if (splat_val != ((small_val << bitsize) | (small_val & mask)))
+      if (splat_val != ((HOST_WIDE_INT)
+          ((unsigned HOST_WIDE_INT) small_val << bitsize)
+          | (small_val & mask)))
        return false;
       splat_val = small_val;
     }