Hi,

I ran into issues caused by ipa_reduced_postorder not really
topologically sorting functions while compiling some part of the java
library (yes, this is the first time java has caught a bug for me).
The problem was that all the functions are apparently
AVAIL_OVERWRITABLE and even though I have instructed
ipa_reduced_postorder by its allow_overwritable parameter to include
such functions, it still blatantly ignores edges to such functions
which leads to all sorts of unexpectedly broken assumptions and weird
bugs.

Fixed thusly, bootstrapped and tested on x86_64-linux (and verified
that my problems caused by this went away too).

OK for trunk?

Thanks,

Martin


2011-05-30  Martin Jambor  <mjam...@suse.cz>

        * ipa-utils.c (searchc_env): New field allow_overwritable.
        (searchc): do not ignore edges to overwritable nodes if indicated
        by env->allow_overwritable.
        (ipa_reduced_postorder): Set env.allow_overwritable.

Index: src/gcc/ipa-utils.c
===================================================================
--- src.orig/gcc/ipa-utils.c
+++ src/gcc/ipa-utils.c
@@ -67,6 +67,7 @@ struct searchc_env {
   int order_pos;
   splay_tree nodes_marked_new;
   bool reduce;
+  bool allow_overwritable;
   int count;
 };
 
@@ -101,11 +102,14 @@ searchc (struct searchc_env* env, struct
     {
       struct ipa_dfs_info * w_info;
       struct cgraph_node *w = edge->callee;
+      enum availability avail = cgraph_function_body_availability (w);
 
       if (ignore_edge && ignore_edge (edge))
         continue;
 
-      if (w->aux && cgraph_function_body_availability (edge->callee) > 
AVAIL_OVERWRITABLE)
+      if (w->aux
+         && (avail > AVAIL_OVERWRITABLE
+             || (env->allow_overwritable && avail == AVAIL_OVERWRITABLE)))
        {
          w_info = (struct ipa_dfs_info *) w->aux;
          if (w_info->new_node)
@@ -171,6 +175,7 @@ ipa_reduced_postorder (struct cgraph_nod
   env.nodes_marked_new = splay_tree_new (splay_tree_compare_ints, 0, 0);
   env.count = 1;
   env.reduce = reduce;
+  env.allow_overwritable = allow_overwritable;
 
   for (node = cgraph_nodes; node; node = node->next)
     {

Reply via email to