diff options
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cgraph.h | 36 | ||||
-rw-r--r-- | gcc/ipa-reference.c | 11 | ||||
-rw-r--r-- | gcc/ipa-type-escape.c | 2 |
4 files changed, 50 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a5aadaf18f5..0a36da5f5bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-12-19 Jan Hubicka <jh@suse.cz> + + * cgraph.h (FOR_EACH_STATIC_VARIABLE, FOR_EACH_STATIC_INITIALIZER): New + macros. + (varpool_first_static_initializer, varpol_next_static_initializer): New + inline functions. + * ipa-reference.c (analyze_variable): Simplify. + (static_execute): Use FOR_EACH_STATIC_INITIALIZER. + * ipa-type-escape.c (type_escape_execute): Use FOR_EACH_STATIC_VARIABLE. + 2006-12-19 Andrew Pinski <pinskia@gmail.com> PR tree-opt/30045 diff --git a/gcc/cgraph.h b/gcc/cgraph.h index b60239c3662..8d4fe750b05 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -342,6 +342,42 @@ bool varpool_analyze_pending_decls (void); void varpool_output_debug_info (void); void varpool_remove_unreferenced_decls (void); +/* Walk all reachable static variables. */ +#define FOR_EACH_STATIC_VARIABLE(node) \ + for ((node) = varpool_nodes_queue; (node); (node) = (node)->next_needed) + +/* Return first reachable static variable with initializer. */ +static inline struct varpool_node * +varpool_first_static_initializer (void) +{ + struct varpool_node *node; + for (node = varpool_nodes_queue; node; node = node->next_needed) + { + gcc_assert (TREE_CODE (node->decl) == VAR_DECL); + if (DECL_INITIAL (node->decl)) + return node; + } + return NULL; +} + +/* Return next reachable static variable with initializer after NODE. */ +static inline struct varpool_node * +varpool_next_static_initializer (struct varpool_node *node) +{ + for (node = node->next_needed; node; node = node->next_needed) + { + gcc_assert (TREE_CODE (node->decl) == VAR_DECL); + if (DECL_INITIAL (node->decl)) + return node; + } + return NULL; +} + +/* Walk all static variables with initializer set. */ +#define FOR_EACH_STATIC_INITIALIZER(node) \ + for ((node) = varpool_first_static_initializer (); (node); \ + (node) = varpool_next_static_initializer (node)) + /* In ipa-inline.c */ bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool); void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool); diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 521c84c6424..8602afda0b0 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -774,13 +774,8 @@ static void analyze_variable (struct varpool_node *vnode) { tree global = vnode->decl; - if (TREE_CODE (global) == VAR_DECL) - { - if (DECL_INITIAL (global)) - walk_tree (&DECL_INITIAL (global), scan_for_static_refs, - NULL, visited_nodes); - } - else gcc_unreachable (); + walk_tree (&DECL_INITIAL (global), scan_for_static_refs, + NULL, visited_nodes); } /* This is the main routine for finding the reference patterns for @@ -903,7 +898,7 @@ static_execute (void) ipa_init (); /* Process all of the variables first. */ - for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed) + FOR_EACH_STATIC_INITIALIZER (vnode) analyze_variable (vnode); /* Process all of the functions next. diff --git a/gcc/ipa-type-escape.c b/gcc/ipa-type-escape.c index faddb7754cd..a7749f46a27 100644 --- a/gcc/ipa-type-escape.c +++ b/gcc/ipa-type-escape.c @@ -1682,7 +1682,7 @@ type_escape_execute (void) ipa_init (); /* Process all of the variables first. */ - for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed) + FOR_EACH_STATIC_VARIABLE (vnode) analyze_variable (vnode); /* Process all of the functions. next |