ipa-inline.c (can_inline_edge_p): Look into DECL_STRUCT_FUNCTION of original nodes...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 25 Jul 2011 10:40:10 +0000 (10:40 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 25 Jul 2011 10:40:10 +0000 (10:40 +0000)
* ipa-inline.c (can_inline_edge_p): Look into DECL_STRUCT_FUNCTION of
original nodes if we are dealing with virtual clones.

From-SVN: r176739

gcc/ChangeLog
gcc/ipa-inline.c

index 66ec2c9b9823928630fda0da020f43c3bb7dd1a8..e8a7f250dc63ffcbd33df107f2889d4a8eeae0bd 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-25  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * ipa-inline.c (can_inline_edge_p): Look into DECL_STRUCT_FUNCTION of
+       original nodes if we are dealing with virtual clones.
+
 2011-07-25  Bernd Schmidt  <bernds@codesourcery.com>
 
        * common/config/c6x/c6x-common.c: New file.
index e0cb632613f587bd9fbb2baa47966422ca4af1e7..366fc2287806c06888b3cab8e2b6755f656dd5e3 100644 (file)
@@ -238,9 +238,20 @@ can_inline_edge_p (struct cgraph_edge *e, bool report)
 {
   bool inlinable = true;
   enum availability avail;
-  struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, &avail);
+  struct cgraph_node *callee
+    = cgraph_function_or_thunk_node (e->callee, &avail);
   tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->decl);
-  tree callee_tree = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
+  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);
 
   gcc_assert (e->inline_failed);
 
@@ -277,12 +288,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 (DECL_STRUCT_FUNCTION (callee->decl)
-          && DECL_STRUCT_FUNCTION
-               (callee->decl)->can_throw_non_call_exceptions
-          && !(DECL_STRUCT_FUNCTION (e->caller->decl)
-               && DECL_STRUCT_FUNCTION
-                    (e->caller->decl)->can_throw_non_call_exceptions))
+  else if (callee_cfun && callee_cfun->can_throw_non_call_exceptions
+          && !(caller_cfun && caller_cfun->can_throw_non_call_exceptions))
     {
       e->inline_failed = CIF_NON_CALL_EXCEPTIONS;
       inlinable = false;