This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix PR ipa/60315 (inliner explosion)


> > 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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]