cgraph.c: Include expr.h and tree-dfa.h.
authorJan Hubicka <hubicka@ucw.cz>
Fri, 28 Mar 2014 15:30:58 +0000 (16:30 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 28 Mar 2014 15:30:58 +0000 (15:30 +0000)
* cgraph.c: Include expr.h and tree-dfa.h.
(cgraph_redirect_edge_call_stmt_to_callee): If call in noreturn; remove LHS.

From-SVN: r208901

gcc/ChangeLog
gcc/cgraph.c

index c619f8e..1ca072e 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       * cgraph.c: Include expr.h and tree-dfa.h.
+       (cgraph_redirect_edge_call_stmt_to_callee): If call in noreturn; remove LHS.
+
 2014-03-28  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/60675
index 586ef79..3b76aa4 100644 (file)
@@ -61,6 +61,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-inline.h"
 #include "cfgloop.h"
 #include "gimple-pretty-print.h"
+#include "expr.h"
+#include "tree-dfa.h"
 
 /* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this.  */
 #include "tree-pass.h"
@@ -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 (struct cgraph_edge *e)
       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)