ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to non-functions to built...
authorMartin Jambor <mjambor@suse.cz>
Wed, 15 May 2013 10:39:28 +0000 (12:39 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Wed, 15 May 2013 10:39:28 +0000 (12:39 +0200)
2013-05-15  Martin Jambor  <mjambor@suse.cz>

* ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to
non-functions to builtin_unreachable.
* ipa-inline-transform.c (inline_call): Do not assert estimates were
correct when new direct edges were discovered.

From-SVN: r198926

gcc/ChangeLog
gcc/ipa-inline-transform.c
gcc/ipa-prop.c

index c8ef004..8982717 100644 (file)
@@ -1,5 +1,12 @@
 2013-05-15  Martin Jambor  <mjambor@suse.cz>
 
+       * ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to
+       non-functions to builtin_unreachable.
+       * ipa-inline-transform.c (inline_call): Do not assert estimates were
+       correct when new direct edges were discovered.
+
+2013-05-15  Martin Jambor  <mjambor@suse.cz>
+
        * ipa-prop.c (ipa_print_node_jump_functions): Print symbol order in
        header, print symbol order instead of node uid, print more information
        about indirect edge targets.
index cac20fe..cb819d7 100644 (file)
@@ -260,7 +260,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
 #ifdef ENABLE_CHECKING
   /* Verify that estimated growth match real growth.  Allow off-by-one
      error due to INLINE_SIZE_SCALE roudoff errors.  */
-  gcc_assert (!update_overall_summary || !overall_size
+  gcc_assert (!update_overall_summary || !overall_size || new_edges_found
              || abs (estimated_growth - (new_size - old_size)) <= 1
              /* FIXME: a hack.  Edges with false predicate are accounted
                 wrong, we should remove them from callgraph.  */
index 9ae3d69..abf21c9 100644 (file)
@@ -2200,6 +2200,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
 {
   struct cgraph_node *callee;
   struct inline_edge_summary *es = inline_edge_summary (ie);
+  bool unreachable = false;
 
   if (TREE_CODE (target) == ADDR_EXPR)
     target = TREE_OPERAND (target, 0);
@@ -2210,12 +2211,17 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
        {
          if (dump_file)
            fprintf (dump_file, "ipa-prop: Discovered direct call to non-function"
-                               " in %s/%i.\n",
+                               " in %s/%i, making it unreachable.\n",
                     cgraph_node_name (ie->caller), ie->caller->symbol.order);
-         return NULL;
+         target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
+         callee = cgraph_get_create_node (target);
+         unreachable = true;
        }
+      else
+       callee = cgraph_get_node (target);
     }
-  callee = cgraph_get_node (target);
+  else
+    callee = cgraph_get_node (target);
 
   /* Because may-edges are not explicitely represented and vtable may be external,
      we may create the first reference to the object in the unit.  */
@@ -2252,7 +2258,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
                         - eni_size_weights.call_cost);
   es->call_stmt_time -= (eni_time_weights.indirect_call_cost
                         - eni_time_weights.call_cost);
-  if (dump_file)
+  if (dump_file && !unreachable)
     {
       fprintf (dump_file, "ipa-prop: Discovered %s call to a known target "
               "(%s/%i -> %s/%i), for stmt ",