diff gcc/ipa-utils.c @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents a06113de4d67
children 04ced10e8804
line wrap: on
line diff
--- a/gcc/ipa-utils.c	Sun Feb 07 18:28:00 2010 +0900
+++ b/gcc/ipa-utils.c	Fri Feb 12 23:39:51 2010 +0900
@@ -28,10 +28,10 @@
 #include "tree-pass.h"
 #include "langhooks.h"
 #include "pointer-set.h"
+#include "splay-tree.h"
 #include "ggc.h"
 #include "ipa-utils.h"
 #include "ipa-reference.h"
-#include "c-common.h"
 #include "gimple.h"
 #include "cgraph.h"
 #include "output.h"
@@ -44,15 +44,15 @@
    that is printed before the nodes are printed.  ORDER is an array of
    cgraph_nodes that has COUNT useful nodes in it.  */
 
-void 
-ipa_utils_print_order (FILE* out, 
-		       const char * note, 
-		       struct cgraph_node** order, 
-		       int count) 
+void
+ipa_utils_print_order (FILE* out,
+		       const char * note,
+		       struct cgraph_node** order,
+		       int count)
 {
   int i;
   fprintf (out, "\n\n ordered call graph: %s\n", note);
-  
+
   for (i = count - 1; i >= 0; i--)
     dump_cgraph_node(dump_file, order[i]);
   fprintf (out, "\n");
@@ -81,39 +81,43 @@
    searching from.  */
 
 static void
-searchc (struct searchc_env* env, struct cgraph_node *v) 
+searchc (struct searchc_env* env, struct cgraph_node *v,
+	 bool (*ignore_edge) (struct cgraph_edge *))
 {
   struct cgraph_edge *edge;
   struct ipa_dfs_info *v_info = (struct ipa_dfs_info *) v->aux;
-  
+
   /* mark node as old */
   v_info->new_node = false;
   splay_tree_remove (env->nodes_marked_new, v->uid);
-  
+
   v_info->dfn_number = env->count;
   v_info->low_link = env->count;
   env->count++;
   env->stack[(env->stack_size)++] = v;
   v_info->on_stack = true;
-  
+
   for (edge = v->callees; edge; edge = edge->next_callee)
     {
       struct ipa_dfs_info * w_info;
       struct cgraph_node *w = edge->callee;
 
+      if (ignore_edge && ignore_edge (edge))
+        continue;
+
       if (w->aux && cgraph_function_body_availability (edge->callee) > AVAIL_OVERWRITABLE)
 	{
 	  w_info = (struct ipa_dfs_info *) w->aux;
-	  if (w_info->new_node) 
+	  if (w_info->new_node)
 	    {
-	      searchc (env, w);
+	      searchc (env, w, ignore_edge);
 	      v_info->low_link =
 		(v_info->low_link < w_info->low_link) ?
 		v_info->low_link : w_info->low_link;
-	    } 
-	  else 
-	    if ((w_info->dfn_number < v_info->dfn_number) 
-		&& (w_info->on_stack)) 
+	    }
+	  else
+	    if ((w_info->dfn_number < v_info->dfn_number)
+		&& (w_info->on_stack))
 	      v_info->low_link =
 		(w_info->dfn_number < v_info->low_link) ?
 		w_info->dfn_number : v_info->low_link;
@@ -121,7 +125,7 @@
     }
 
 
-  if (v_info->low_link == v_info->dfn_number) 
+  if (v_info->low_link == v_info->dfn_number)
     {
       struct cgraph_node *last = NULL;
       struct cgraph_node *x;
@@ -130,17 +134,17 @@
 	x = env->stack[--(env->stack_size)];
 	x_info = (struct ipa_dfs_info *) x->aux;
 	x_info->on_stack = false;
-	
-	if (env->reduce) 
+
+	if (env->reduce)
 	  {
 	    x_info->next_cycle = last;
 	    last = x;
-	  } 
-	else 
+	  }
+	else
 	  env->result[env->order_pos++] = x;
-      } 
+      }
       while (v != x);
-      if (env->reduce) 
+      if (env->reduce)
 	env->result[env->order_pos++] = v;
     }
 }
@@ -151,8 +155,9 @@
    nodes.  Only consider nodes that have the output bit set. */
 
 int
-ipa_utils_reduced_inorder (struct cgraph_node **order, 
-			   bool reduce, bool allow_overwritable)
+ipa_utils_reduced_inorder (struct cgraph_node **order,
+			   bool reduce, bool allow_overwritable,
+			   bool (*ignore_edge) (struct cgraph_edge *))
 {
   struct cgraph_node *node;
   struct searchc_env env;
@@ -164,13 +169,13 @@
   env.nodes_marked_new = splay_tree_new (splay_tree_compare_ints, 0, 0);
   env.count = 1;
   env.reduce = reduce;
-  
-  for (node = cgraph_nodes; node; node = node->next) 
+
+  for (node = cgraph_nodes; node; node = node->next)
     {
       enum availability avail = cgraph_function_body_availability (node);
 
       if (avail > AVAIL_OVERWRITABLE
-	  || (allow_overwritable 
+	  || (allow_overwritable
 	      && (avail == AVAIL_OVERWRITABLE)))
 	{
 	  /* Reuse the info if it is already there.  */
@@ -181,19 +186,19 @@
 	  info->on_stack = false;
 	  info->next_cycle = NULL;
 	  node->aux = info;
-	  
+
 	  splay_tree_insert (env.nodes_marked_new,
-			     (splay_tree_key)node->uid, 
+			     (splay_tree_key)node->uid,
 			     (splay_tree_value)node);
-	} 
-      else 
+	}
+      else
 	node->aux = NULL;
     }
   result = splay_tree_min (env.nodes_marked_new);
   while (result)
     {
       node = (struct cgraph_node *)result->value;
-      searchc (&env, node);
+      searchc (&env, node, ignore_edge);
       result = splay_tree_min (env.nodes_marked_new);
     }
   splay_tree_delete (env.nodes_marked_new);
@@ -210,17 +215,15 @@
 tree
 get_base_var (tree t)
 {
-  if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
-    return t;
-
-  while (!SSA_VAR_P (t) 
+  while (!SSA_VAR_P (t)
 	 && (!CONSTANT_CLASS_P (t))
 	 && TREE_CODE (t) != LABEL_DECL
 	 && TREE_CODE (t) != FUNCTION_DECL
-	 && TREE_CODE (t) != CONST_DECL)
+	 && TREE_CODE (t) != CONST_DECL
+	 && TREE_CODE (t) != CONSTRUCTOR)
     {
       t = TREE_OPERAND (t, 0);
     }
   return t;
-} 
+}