cgraph.h (cgraph_node::get_fun): Declare.
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 7 Oct 2014 09:18:37 +0000 (09:18 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 7 Oct 2014 09:18:37 +0000 (09:18 +0000)
* cgraph.h (cgraph_node::get_fun): Declare.
* cgraph.c (cgraph_node::get_fun): New method.
* ipa-inline.c (can_inline_edge_p): Use it.

From-SVN: r215968

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/ipa-inline.c

index 9349546e524e2c5b7f8e538dde9b8d3c246596cd..f1f16ee14a7178c4534a339ea8cda5195782ce5b 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cgraph.h (cgraph_node::get_fun): Declare.
+       * cgraph.c (cgraph_node::get_fun): New method.
+       * ipa-inline.c (can_inline_edge_p): Use it.
+
 2014-10-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros
index 38dc7e663fa12b72cb2858f6035dfed1d6092cf4..f842b1b6432d7e1dc122d31ac6b3a9cfd45c3f96 100644 (file)
@@ -2992,6 +2992,23 @@ cgraph_node::get_body (void)
   return true;
 }
 
+/* Return the DECL_STRUCT_FUNCTION of the function.  */
+
+struct function *
+cgraph_node::get_fun (void)
+{
+  cgraph_node *node = this;
+  struct function *fun = DECL_STRUCT_FUNCTION (node->decl);
+
+  while (!fun && node->clone_of)
+    {
+      node = node->clone_of;
+      fun = DECL_STRUCT_FUNCTION (node->decl);
+    }
+
+  return fun;
+}
+
 /* Verify if the type of the argument matches that of the function
    declaration.  If we cannot verify this or there is a mismatch,
    return false.  */
index 20b5c4e4805cb08d30cd20fbccf1a137c350c3f0..1df7534cd71f039aa7741a8292100ba72ca0e60e 100644 (file)
@@ -919,6 +919,9 @@ public:
      are free'd in final.c via free_after_compilation().  */
   void release_body (bool keep_arguments = false);
 
+  /* Return the DECL_STRUCT_FUNCTION of the function.  */
+  struct function *get_fun (void);
+
   /* cgraph_node is no longer nested function; update cgraph accordingly.  */
   void unnest (void);
 
index d7a232cee8a5e72b6d59a30d99e87b39d82418eb..9ac19298c198a31206829db953f9baf29503a38d 100644 (file)
@@ -273,15 +273,8 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
   tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->decl);
   tree callee_tree
     = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
-  struct function *caller_cfun = DECL_STRUCT_FUNCTION (e->caller->decl);
-  struct function *callee_cfun
-    = callee ? DECL_STRUCT_FUNCTION (callee->decl) : NULL;
-
-  if (!caller_cfun && e->caller->clone_of)
-    caller_cfun = DECL_STRUCT_FUNCTION (e->caller->clone_of->decl);
-
-  if (!callee_cfun && callee && callee->clone_of)
-    callee_cfun = DECL_STRUCT_FUNCTION (callee->clone_of->decl);
+  struct function *caller_fun = e->caller->get_fun ();
+  struct function *callee_fun = callee ? callee->get_fun () : NULL;
 
   gcc_assert (e->inline_failed);
 
@@ -296,7 +289,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
       inlinable = false;
     }
   else if (!inline_summary (callee)->inlinable 
-          || (caller_cfun && fn_contains_cilk_spawn_p (caller_cfun)))
+          || (caller_fun && fn_contains_cilk_spawn_p (caller_fun)))
     {
       e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
       inlinable = false;
@@ -333,8 +326,8 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
      caller cannot.
      FIXME: this is obviously wrong for LTO where STRUCT_FUNCTION is missing.
      Move the flag into cgraph node or mirror it in the inline summary.  */
-  else if (callee_cfun && callee_cfun->can_throw_non_call_exceptions
-          && !(caller_cfun && caller_cfun->can_throw_non_call_exceptions))
+  else if (callee_fun && callee_fun->can_throw_non_call_exceptions
+          && !(caller_fun && caller_fun->can_throw_non_call_exceptions))
     {
       e->inline_failed = CIF_NON_CALL_EXCEPTIONS;
       inlinable = false;