Check for overflow in tree-switch-conversion (PR middle-end/90478).
authorMartin Liska <mliska@suse.cz>
Wed, 15 May 2019 12:58:53 +0000 (14:58 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 15 May 2019 12:58:53 +0000 (12:58 +0000)
2019-05-15  Martin Liska  <mliska@suse.cz>

PR middle-end/90478
* tree-switch-conversion.c (jump_table_cluster::can_be_handled):
Check for overflow.
2019-05-15  Martin Liska  <mliska@suse.cz>

PR middle-end/90478
* gcc.dg/tree-ssa/pr90478-2.c: New test.
* gcc.dg/tree-ssa/pr90478.c: New test.

From-SVN: r271210

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr90478-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr90478.c [new file with mode: 0644]
gcc/tree-switch-conversion.c

index 8bb14cf131dbd07234e4b3cc38fb0de3edefa0e7..f05bd98f39a675ae90d12b355d0919b7d018b7b3 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-15  Martin Liska  <mliska@suse.cz>
+
+       PR middle-end/90478
+       * tree-switch-conversion.c (jump_table_cluster::can_be_handled):
+       Check for overflow.
+
 2019-05-15  Richard Biener  <rguenther@suse.de>
 
        * tree-into-ssa.c (pass_build_ssa::execute): Run
index b7d63ed8210cf0eb45ac8d761fe07ad7c395114c..c91e601a946c56542bf9f93de48463cab7ccf5cb 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-15  Martin Liska  <mliska@suse.cz>
+
+       PR middle-end/90478
+       * gcc.dg/tree-ssa/pr90478-2.c: New test.
+       * gcc.dg/tree-ssa/pr90478.c: New test.
+
 2019-05-15  Richard Biener  <rguenther@suse.de>
 
        * gcc.dg/gimplefe-40.c: Amend.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr90478-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr90478-2.c
new file mode 100644 (file)
index 0000000..f0fc103
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-Os --param jump-table-max-growth-ratio-for-size=2147483647" } */
+
+long
+foo (long x, long y)
+{
+  x = x & y;
+  switch (y)
+    {
+    case 63L: x >>= 0; break;
+    case 4032L: x >>= 6; break;
+    case 258048L: x >>= 12; break;
+    case 16515072L: x >>= 18; break;
+    default: __builtin_unreachable ();
+    }
+  return x;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr90478.c b/gcc/testsuite/gcc.dg/tree-ssa/pr90478.c
new file mode 100644 (file)
index 0000000..f19808d
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+typedef struct {
+  long a;
+} c;
+
+void e();
+
+void d() {
+  c *b;
+  switch (b->a)
+  case 8:
+  case 2:
+  case 2057594037927936:
+  case 0:
+  case 4611686018427387904:
+    e();
+}
index bedeb2fd86553349fc289a1f2d7512c7e3779be5..5f8ed46f496cccd9b53ee7a5295c09912190ba0c 100644 (file)
@@ -1284,7 +1284,11 @@ jump_table_cluster::can_be_handled (const vec<cluster *> &clusters,
       comparison_count += sc->m_range_p ? 2 : 1;
     }
 
-  return 100 * range <= max_ratio * comparison_count;
+  unsigned HOST_WIDE_INT lhs = 100 * range;
+  if (lhs < range)
+    return false;
+
+  return lhs <= max_ratio * comparison_count;
 }
 
 /* Return true if cluster starting at START and ending at END (inclusive)