> > Bootstrapped/regtested x86_64-linux, comitted.
> 
> Not with Ada apparently, resulting in 
> 
>                 === acats tests ===
> FAIL:   c34007d
> FAIL:   c34007g
> FAIL:   c34007s
> FAIL:   c37213j
> FAIL:   c37213k
> FAIL:   c37213l
> FAIL:   ce2201g
> FAIL:   cxa5a03
> FAIL:   cxa5a04
> FAIL:   cxa5a06
> FAIL:   cxg2013
> FAIL:   cxg2015
> 
The problem is that by redirection to noreturn, we end up freeing SSA name of 
the
LHS but later we still process statements that refer it until they are removed 
as
unreachable.
The following patch fixes it. I tested it on x86_64-linux, but changed my mind.
I think fixup_noreturn_call should do it instead, I will send updated patch 
after
testing.

Honza

Index: cgraph.c
===================================================================
--- cgraph.c    (revision 208875)
+++ cgraph.c    (working copy)
@@ -1329,6 +1331,7 @@ gimple
 cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
 {
   tree decl = gimple_call_fndecl (e->call_stmt);
+  tree lhs = gimple_call_lhs (e->call_stmt);
   gimple new_stmt;
   gimple_stmt_iterator gsi;
 #ifdef ENABLE_CHECKING
@@ -1471,6 +1474,22 @@ cgraph_redirect_edge_call_stmt_to_callee
       update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
     }
 
+  /* If the call becomes noreturn, remove the lhs.  */
+  if (lhs && (gimple_call_flags (new_stmt) & ECF_NORETURN))
+    {
+      if (TREE_CODE (lhs) == SSA_NAME)
+       {
+          gsi = gsi_for_stmt (new_stmt);
+
+         tree var = create_tmp_var (TREE_TYPE (lhs), NULL);
+         tree def = get_or_create_ssa_default_def
+                     (DECL_STRUCT_FUNCTION (e->caller->decl), var);
+         gimple set_stmt = gimple_build_assign (lhs, def);
+         gsi_insert_before (&gsi, set_stmt, GSI_SAME_STMT);
+       }
+      gimple_call_set_lhs (new_stmt, NULL_TREE);
+    }
+
   cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt, new_stmt, 
false);
 
   if (cgraph_dump_file)

Reply via email to