re PR middle-end/53887 (ICE in hoist_edge_and_branch_if_true, at tree-switch-conversi...
authorSteven Bosscher <steven@gcc.gnu.org>
Mon, 9 Jul 2012 18:53:35 +0000 (18:53 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Mon, 9 Jul 2012 18:53:35 +0000 (18:53 +0000)
gcc/
PR tree-optimization/53887
* tree-cfg.c (group_case_labels_stmt): Make non-static.
* tree-flow.h (group_case_labels_stmt): Add prototype.
* tree-switch-conversion.c (process_switch): Use group_case_labels_stmt
to pre-process every switch.

testsuite/
PR tree-optimization/53887
* gcc.dg/pr53887.c: New test.

From-SVN: r189389

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr53887.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-flow.h
gcc/tree-switch-conversion.c

index 3e8bfc236c73bdb723a733077aa06b0de198f400..d8edad09b3c000557edfc14b7a576cc10073ef12 100644 (file)
@@ -1,3 +1,11 @@
+2012-07-09  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR tree-optimization/53887
+       * tree-cfg.c (group_case_labels_stmt): Make non-static.
+       * tree-flow.h (group_case_labels_stmt): Add prototype.
+       * tree-switch-conversion.c (process_switch): Use group_case_labels_stmt
+       to pre-process every switch.
+
 2012-07-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/53882
index 07187ebe3d257a5bebb0133d7ea7147d1f42f138..5777c5f9fb4eeb871375519db4d31068b779170d 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-09  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR tree-optimization/53887
+       * gcc.dg/pr53887.c: New test.
+
 2012-07-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/53882
diff --git a/gcc/testsuite/gcc.dg/pr53887.c b/gcc/testsuite/gcc.dg/pr53887.c
new file mode 100644 (file)
index 0000000..b46126c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+enum
+{ Failed, NoError, NoDiskette }
+a;
+int b, c;
+void
+fn1 ()
+{
+    if (c)
+        a << 1;
+    switch (b)
+    {
+    default:
+        a << 1;
+    case 0:
+        b = 0;
+    case 1:
+    case NoDiskette:
+        ;
+    }
+}
+
index dd4760951a73437f1a795d44fda63c4d4b6186b7..bdcf7c3af9dcb53d5fbb511d46856eab0aa073ce 100644 (file)
@@ -125,7 +125,6 @@ static edge find_taken_edge_computed_goto (basic_block, tree);
 static edge find_taken_edge_cond_expr (basic_block, tree);
 static edge find_taken_edge_switch_expr (basic_block, tree);
 static tree find_case_label_for_value (gimple, tree);
-static void group_case_labels_stmt (gimple);
 
 void
 init_empty_tree_cfg_for_function (struct function *fn)
@@ -1331,7 +1330,7 @@ cleanup_dead_labels (void)
    the ones jumping to the same label.
    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
 
-static void
+void
 group_case_labels_stmt (gimple stmt)
 {
   int old_size = gimple_switch_num_labels (stmt);
index cf7883985c2671c2d83f7197e9ca2b3649749f3c..8f7d336037e77c42ceb363057fe37443342bbe7e 100644 (file)
@@ -428,6 +428,7 @@ extern void debug_loop_num (unsigned, int);
 extern void print_loops (FILE *, int);
 extern void print_loops_bb (FILE *, basic_block, int, int);
 extern void cleanup_dead_labels (void);
+extern void group_case_labels_stmt (gimple);
 extern void group_case_labels (void);
 extern gimple first_stmt (basic_block);
 extern gimple last_stmt (basic_block);
index 94fbf1dec69095bde9761e15ac081e5a39dce494..80457989a476f897ebcea486854243dd07bbfa9d 100644 (file)
@@ -1339,8 +1339,14 @@ process_switch (gimple swtch)
 {
   struct switch_conv_info info;
 
-  /* Degenerate case with only a default label should never happen.  */
-  gcc_checking_assert (gimple_switch_num_labels (swtch) > 1);
+  /* Group case labels so that we get the right results from the heuristics
+     that decide on the code generation approach for this switch.  */
+  group_case_labels_stmt (swtch);
+
+  /* If this switch is now a degenerate case with only a default label,
+     there is nothing left for us to do.   */
+  if (gimple_switch_num_labels (swtch) < 2)
+    return "switch is a degenerate case";
 
   collect_switch_conv_info (swtch, &info);