OSDN Git Service

* ipa-cp.c (ipcp_versionable_function_p): Walk cgraph edges instead of
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 May 2010 07:01:26 +0000 (07:01 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:10:07 +0000 (14:10 +0900)
function body; do not check stdarg field of struct function.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159472 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-cp.c

index cfb3a7f..e5d0942 100644 (file)
@@ -1,5 +1,10 @@
 2010-05-16  Jan Hubicka  <jh@suse.cz>
 
 2010-05-16  Jan Hubicka  <jh@suse.cz>
 
+       * ipa-cp.c (ipcp_versionable_function_p): Walk cgraph edges instead of
+       function body; do not check stdarg field of struct function.
+
+2010-05-16  Jan Hubicka  <jh@suse.cz>
+
        * cgraph.c (dump_cgraph_node): Dump versionable flag.
        * cgraph.h (cgraph_local_info): Add versionable flag.
        * ipa-cp.c (ipcp_analyze_node): Set versionable flag.
        * cgraph.c (dump_cgraph_node): Dump versionable flag.
        * cgraph.h (cgraph_local_info): Add versionable flag.
        * ipa-cp.c (ipcp_analyze_node): Set versionable flag.
index 88a5b4f..723de16 100644 (file)
@@ -416,35 +416,21 @@ ipcp_print_all_lattices (FILE * f)
 static bool
 ipcp_versionable_function_p (struct cgraph_node *node)
 {
 static bool
 ipcp_versionable_function_p (struct cgraph_node *node)
 {
-  tree decl = node->decl;
-  basic_block bb;
+  struct cgraph_edge *edge;
 
   /* There are a number of generic reasons functions cannot be versioned.  */
   if (!node->local.versionable)
     return false;
 
 
   /* There are a number of generic reasons functions cannot be versioned.  */
   if (!node->local.versionable)
     return false;
 
-  /* Removing arguments doesn't work if the function takes varargs.  */
-  if (DECL_STRUCT_FUNCTION (decl)->stdarg)
-    return false;
-
-  /* Removing arguments doesn't work if we use __builtin_apply_args.  */
-  FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (decl))
+  /* Removing arguments doesn't work if the function takes varargs
+     or use __builtin_apply_args. */
+  for (edge = node->callees; edge; edge = edge->next_callee)
     {
     {
-      gimple_stmt_iterator gsi;
-      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-       {
-         const_gimple stmt = gsi_stmt (gsi);
-         tree t;
-
-         if (!is_gimple_call (stmt))
-           continue;
-         t = gimple_call_fndecl (stmt);
-         if (t == NULL_TREE)
-           continue;
-         if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL
-             && DECL_FUNCTION_CODE (t) == BUILT_IN_APPLY_ARGS)
-           return false;
-       }
+      tree t = edge->callee->decl;
+      if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL
+         && (DECL_FUNCTION_CODE (t) == BUILT_IN_APPLY_ARGS
+            || DECL_FUNCTION_CODE (t) == BUILT_IN_VA_START))
+       return false;
     }
 
   return true;
     }
 
   return true;