Fix PR78588 - rtlanal.c:5210:38: runtime error: shift exponent 4294967295 is too...
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Wed, 30 Nov 2016 07:30:55 +0000 (07:30 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Wed, 30 Nov 2016 07:30:55 +0000 (07:30 +0000)
Building gcc with -fsanitize=undefined shows:
 rtlanal.c:5210:38: runtime error: shift exponent 4294967295 is too large for 64-bit type 'long unsigned int'

This happens because if_then_else_cond() in combine.c calls
num_sign_bit_copies() in rtlanal.c with mode==BLKmode.

5205   bitwidth = GET_MODE_PRECISION (mode);
5206   if (bitwidth > HOST_BITS_PER_WIDE_INT)
5207     return 1;
5208
5209   nonzero = nonzero_bits (x, mode);
5210   return nonzero & (HOST_WIDE_INT_1U << (bitwidth - 1))
5211          ? 1 : bitwidth - floor_log2 (nonzero) - 1;

This causes (bitwidth - 1) to wrap around.

PR rtl-optimization/78588
* combine.c (if_then_else_cond): Also guard against BLKmode.
* rtlanal.c (num_sign_bit_copies1): Add assert.

From-SVN: r242997

gcc/ChangeLog
gcc/combine.c
gcc/rtlanal.c

index a5b191b..48862fb 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-30  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       PR rtl-optimization/78588
+       * combine.c (if_then_else_cond): Also guard against BLKmode.
+       * rtlanal.c (num_sign_bit_copies1): Add assert.
+
 2016-11-29  Jeff Law  <law@redhat.com>
 
        * common/config/arc/arc-common.c (arc_handle_option): Remove unused
index 22fb7a9..a32a0ec 100644 (file)
@@ -9176,7 +9176,7 @@ if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
   /* If X is known to be either 0 or -1, those are the true and
      false values when testing X.  */
   else if (x == constm1_rtx || x == const0_rtx
-          || (mode != VOIDmode
+          || (mode != VOIDmode && mode != BLKmode
               && num_sign_bit_copies (x, mode) == GET_MODE_PRECISION (mode)))
     {
       *ptrue = constm1_rtx, *pfalse = const0_rtx;
index 4e4eb2e..60550ad 100644 (file)
@@ -4840,6 +4840,8 @@ num_sign_bit_copies1 (const_rtx x, machine_mode mode, const_rtx known_x,
   if (mode == VOIDmode)
     mode = GET_MODE (x);
 
+  gcc_checking_assert (mode != BLKmode);
+
   if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x))
       || VECTOR_MODE_P (GET_MODE (x)) || VECTOR_MODE_P (mode))
     return 1;