re PR tree-optimization/78819 (Wrong code with VRP caused by register assertions...
authorMarek Polacek <polacek@redhat.com>
Fri, 16 Dec 2016 14:19:44 +0000 (14:19 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 16 Dec 2016 14:19:44 +0000 (14:19 +0000)
PR tree-optimization/78819
* tree-vrp.c (find_switch_asserts): Return if the insertion limit is 0.
Don't register an assertion if the default case shares a label with
another case.

* gcc.dg/tree-ssa/vrp112.c: New test.

From-SVN: r243746

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/vrp112.c [new file with mode: 0644]
gcc/tree-vrp.c

index bdbadd348b7ed069df7e0a68d15f72d8f5f6a1f4..2a443d0a4999823060a8c96b4a49f0cdf832baab 100644 (file)
@@ -1,3 +1,10 @@
+2016-12-16  Marek Polacek  <polacek@redhat.com>
+
+       PR tree-optimization/78819
+       * tree-vrp.c (find_switch_asserts): Return if the insertion limit is 0.
+       Don't register an assertion if the default case shares a label with
+       another case.
+
 2016-12-16  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * config/arm/arm.md (subsi3_carryin): Add Thumb-2 RSC #0.
index afd90ee71d1eb1926b8d4de83d242aa18e5319b7..3307b2efce9ff865e918116e4d16b1e3a03a3efe 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-16  Marek Polacek  <polacek@redhat.com>
+
+       PR tree-optimization/78819
+       * gcc.dg/tree-ssa/vrp112.c: New test.
+
 2016-12-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/opt61.adb: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp112.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp112.c
new file mode 100644 (file)
index 0000000..fdc6711
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR tree-optimization/78819 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+__attribute__((noinline, noclone)) void
+foo (int argc)
+{
+  if (argc <= 0 || argc > 3)
+    return;
+
+  switch (argc)
+    {
+    case 1:
+    case 3:
+      if (argc != 3)
+       __builtin_abort ();
+      break;
+    case 2:
+      asm ("");
+      break;
+    default:
+      __builtin_abort ();
+    }
+}
+
+int
+main (void)
+{
+  foo (3);
+  return 0;
+}
index 97e9953a139b0c3f39859461c20f37db200683d2..31b6b7de35d814db08d07d3df68724ffda1c2d5a 100644 (file)
@@ -6051,10 +6051,17 @@ find_switch_asserts (basic_block bb, gswitch *last)
   /* Now register along the default label assertions that correspond to the
      anti-range of each label.  */
   int insertion_limit = PARAM_VALUE (PARAM_MAX_VRP_SWITCH_ASSERTIONS);
+  if (insertion_limit == 0)
+    return;
+
+  /* We can't do this if the default case shares a label with another case.  */
+  tree default_cl = gimple_switch_default_label (last);
   for (idx = 1; idx < n; idx++)
     {
       tree min, max;
       tree cl = gimple_switch_label (last, idx);
+      if (CASE_LABEL (cl) == CASE_LABEL (default_cl))
+       continue;
 
       min = CASE_LOW (cl);
       max = CASE_HIGH (cl);
@@ -6065,6 +6072,8 @@ find_switch_asserts (basic_block bb, gswitch *last)
        {
          tree next_min, next_max;
          tree next_cl = gimple_switch_label (last, idx);
+         if (CASE_LABEL (next_cl) == CASE_LABEL (default_cl))
+           break;
 
          next_min = CASE_LOW (next_cl);
          next_max = CASE_HIGH (next_cl);