Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: gcc/gcc/ipa-utils.c

Issue 3050029: [gcc] GCC 4.5.0=>4.5.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gcc/gcc/ipa-type-escape.c ('k') | gcc/gcc/ira-color.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gcc/gcc/ipa-utils.c
diff --git a/gcc/gcc/ipa-utils.c b/gcc/gcc/ipa-utils.c
index 3b5d128f60d64ab010becbdee6614fa9294c77bb..4b88f599d53d97ca0a65f6e539c3aac0d465989e 100644
--- a/gcc/gcc/ipa-utils.c
+++ b/gcc/gcc/ipa-utils.c
@@ -28,10 +28,10 @@ along with GCC; see the file COPYING3. If not see
#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 @@ along with GCC; see the file COPYING3. If not see
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 @@ struct searchc_env {
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 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
}
- 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 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
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 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
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 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
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 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
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 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
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;
-}
+}
« no previous file with comments | « gcc/gcc/ipa-type-escape.c ('k') | gcc/gcc/ira-color.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698