On Tue, Mar 29, 2016 at 1:42 PM, Martin Liška <mli...@suse.cz> wrote:
> Hello.
>
> The problem with the original patch is that I'm forced to produce
> an empty BB to produce true/false edge needed for the 'index' check:
>
> /home/marxin/Programming/testhsa/run_tests/012-switch/switch-5.c:28:9: error: 
> true/false edge after a non-GIMPLE_COND in bb 4
> /home/marxin/Programming/testhsa/run_tests/012-switch/switch-5.c:28:9: 
> internal compiler error: verify_flow_info failed
> 0x93121a verify_flow_info()
>         ../../gcc/cfghooks.c:260
> 0xd5ae4e execute_function_todo
>         ../../gcc/passes.c:1971
> 0xd59ea6 do_per_function
>         ../../gcc/passes.c:1645
> 0xd5afc2 execute_todo
>         ../../gcc/passes.c:2011
>
> It would nicer to not produce empty block for that purpose, but the question
> is if the change is acceptable during the stage4?

Hmm, why don't we short-cut things earlier in execute_one_pass where
we handle TODO_discard_function?
That is, sth like

Index: gcc/passes.c
===================================================================
--- gcc/passes.c        (revision 234453)
+++ gcc/passes.c        (working copy)
@@ -2334,6 +2334,33 @@ execute_one_pass (opt_pass *pass)

   /* Do it!  */
   todo_after = pass->execute (cfun);
+
+  if (todo_after & TODO_discard_function)
+    {
+      pass_fini_dump_file (pass);
+
+      gcc_assert (cfun);
+      /* As cgraph_node::release_body expects release dominators info,
+        we have to release it.  */
+      if (dom_info_available_p (CDI_DOMINATORS))
+       free_dominance_info (CDI_DOMINATORS);
+
+      if (dom_info_available_p (CDI_POST_DOMINATORS))
+       free_dominance_info (CDI_POST_DOMINATORS);
+
+      tree fn = cfun->decl;
+      pop_cfun ();
+      gcc_assert (!cfun);
+      cgraph_node::get (fn)->release_body ();
+
+      current_pass = NULL;
+      redirect_edge_var_map_empty ();
+
+      ggc_collect ();
+
+      return true;
+    }
+
   do_per_function (clear_last_verified, NULL);

   /* Stop timevar.  */
@@ -2373,23 +2400,6 @@ execute_one_pass (opt_pass *pass)
   current_pass = NULL;
   redirect_edge_var_map_empty ();

-  if (todo_after & TODO_discard_function)
-    {
-      gcc_assert (cfun);
-      /* As cgraph_node::release_body expects release dominators info,
-        we have to release it.  */
-      if (dom_info_available_p (CDI_DOMINATORS))
-       free_dominance_info (CDI_DOMINATORS);
-
-      if (dom_info_available_p (CDI_POST_DOMINATORS))
-       free_dominance_info (CDI_POST_DOMINATORS);
-
-      tree fn = cfun->decl;
-      pop_cfun ();
-      gcc_assert (!cfun);
-      cgraph_node::get (fn)->release_body ();
-    }
-
   /* Signal this is a suitable GC collection point.  */
   if (!((todo_after | pass->todo_flags_finish) & TODO_do_not_ggc_collect))
     ggc_collect ();


> Thanks,
> Martin

Reply via email to