tree-cfg (group_case_labels): Remove case labels that have the same target as the...
authorSteven Bosscher <stevenb@suse.de>
Wed, 7 Jul 2004 22:19:43 +0000 (22:19 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Wed, 7 Jul 2004 22:19:43 +0000 (22:19 +0000)
* tree-cfg (group_case_labels): Remove case labels that have the
same target as the default case.

From-SVN: r84239

gcc/ChangeLog
gcc/tree-cfg.c

index a1aa65406d3da1dd4f7c7aa5a8fd466b4be567ad..6031eee93985bd75f30025c5f7d26bbd8506b488 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-07  Steven Bosscher  <stevenb@suse.de>
+
+       * tree-cfg.c (group_case_labels): Remove case labels that have
+       the same target as the default case.
+
 2004-07-07  Steven Bosscher  <stevenb@suse.de>
 
        * tree-inline.c (optimize_inline_calls): Set DECL_INLINED_FNS
index 4bf00dff375a2f44770bbfb96479ae7975b13665..8600a99e4125468b3071ad80c480781de718477d 100644 (file)
@@ -937,6 +937,7 @@ group_case_labels (void)
          tree labels = SWITCH_LABELS (stmt);
          int old_size = TREE_VEC_LENGTH (labels);
          int i, j, new_size = old_size;
+         tree default_label = TREE_VEC_ELT (labels, old_size - 1);
 
          /* Look for possible opportunities to merge cases.
             Ignore the last element of the label vector because it
@@ -950,8 +951,18 @@ group_case_labels (void)
              if (! base_case)
                abort ();
 
-             type = TREE_TYPE (CASE_LOW (base_case));
              base_label = CASE_LABEL (base_case);
+
+             /* Discard cases that have the same destination as the
+                default case.  */
+             if (base_label == default_label)
+               {
+                 TREE_VEC_ELT (labels, i) = NULL_TREE;
+                 i++;
+                 continue;
+               }
+
+             type = TREE_TYPE (CASE_LOW (base_case));
              base_high = CASE_HIGH (base_case) ?
                CASE_HIGH (base_case) : CASE_LOW (base_case);