tree-cfg.c (group_case_labels_stmt): Merge scanning and compressing loops.
authorPeter Bergner <bergner@gcc.gnu.org>
Fri, 30 Jun 2017 16:04:08 +0000 (11:04 -0500)
committerPeter Bergner <bergner@gcc.gnu.org>
Fri, 30 Jun 2017 16:04:08 +0000 (11:04 -0500)
* tree-cfg.c (group_case_labels_stmt): Merge scanning and compressing
loops.  Remove now unneeded calls to gimple_switch_set_label() that
just set removed labels to NULL_TREE.

From-SVN: r249847

gcc/ChangeLog
gcc/tree-cfg.c

index 2fbfc2bebc2b0f232abdd34c6eeb14c64247fc7b..d5f94fb009f7e6fc9ebf71bf4d3e89c466cf2199 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-30  Peter Bergner  <bergner@vnet.ibm.com>
+
+       * tree-cfg.c (group_case_labels_stmt): Merge scanning and compressing
+       loops.  Remove now unneeded calls to gimple_switch_set_label() that
+       just set removed labels to NULL_TREE.
+
 2017-06-30  Aldy Hernandez  <aldyh@redhat.com>
 
        * tree-ssanames.c (set_range_info_raw): Abstract from ...
@@ -16,7 +22,7 @@
        For V16FI and V8SF_256 iterators, don't test if both operands are MEM
        if <mask_applied>.  For VI4F_256 iterator, use <store_mask_predicate>
        instead of register_operand and <store_mask_constraint> instead of v for
-        the input operand.  Make sure both operands aren't MEMs for if not
+       the input operand.  Make sure both operands aren't MEMs for if not
        <mask_applied>.
 
 2017-06-30  Sylvestre Ledru  <sylvestre@debian.org>
index 5af677ba65294993f48ffffa2b4d80e98a9bc56c..848b20f90d2b52cbae2c54b8158cc58b9f0ff597 100644 (file)
@@ -1679,13 +1679,13 @@ bool
 group_case_labels_stmt (gswitch *stmt)
 {
   int old_size = gimple_switch_num_labels (stmt);
-  int i, j, base_index, new_size = old_size;
+  int i, next_index, new_size;
   basic_block default_bb = NULL;
 
   default_bb = label_to_block (CASE_LABEL (gimple_switch_default_label (stmt)));
 
   /* Look for possible opportunities to merge cases.  */
-  i = 1;
+  new_size = i = 1;
   while (i < old_size)
     {
       tree base_case, base_high;
@@ -1699,23 +1699,21 @@ group_case_labels_stmt (gswitch *stmt)
       /* Discard cases that have the same destination as the default case.  */
       if (base_bb == default_bb)
        {
-         gimple_switch_set_label (stmt, i, NULL_TREE);
          i++;
-         new_size--;
          continue;
        }
 
       base_high = CASE_HIGH (base_case)
          ? CASE_HIGH (base_case)
          : CASE_LOW (base_case);
-      base_index = i++;
+      next_index = i + 1;
 
       /* Try to merge case labels.  Break out when we reach the end
         of the label vector or when we cannot merge the next case
         label with the current one.  */
-      while (i < old_size)
+      while (next_index < old_size)
        {
-         tree merge_case = gimple_switch_label (stmt, i);
+         tree merge_case = gimple_switch_label (stmt, next_index);
          basic_block merge_bb = label_to_block (CASE_LABEL (merge_case));
          wide_int bhp1 = wi::add (base_high, 1);
 
@@ -1727,9 +1725,7 @@ group_case_labels_stmt (gswitch *stmt)
              base_high = CASE_HIGH (merge_case) ?
                  CASE_HIGH (merge_case) : CASE_LOW (merge_case);
              CASE_HIGH (base_case) = base_high;
-             gimple_switch_set_label (stmt, i, NULL_TREE);
-             new_size--;
-             i++;
+             next_index++;
            }
          else
            break;
@@ -1742,23 +1738,22 @@ group_case_labels_stmt (gswitch *stmt)
          edge base_edge = find_edge (gimple_bb (stmt), base_bb);
          if (base_edge != NULL)
            remove_edge_and_dominated_blocks (base_edge);
-         gimple_switch_set_label (stmt, base_index, NULL_TREE);
-         new_size--;
+         i = next_index;
+         continue;
        }
-    }
 
-  /* Compress the case labels in the label vector, and adjust the
-     length of the vector.  */
-  for (i = 0, j = 0; i < new_size; i++)
-    {
-      while (! gimple_switch_label (stmt, j))
-       j++;
-      gimple_switch_set_label (stmt, i,
-                              gimple_switch_label (stmt, j++));
+      if (new_size < i)
+       gimple_switch_set_label (stmt, new_size,
+                                gimple_switch_label (stmt, i));
+      i = next_index;
+      new_size++;
     }
 
   gcc_assert (new_size <= old_size);
-  gimple_switch_set_num_labels (stmt, new_size);
+
+  if (new_size < old_size)
+    gimple_switch_set_num_labels (stmt, new_size);
+
   return new_size < old_size;
 }