tree-flow.h (gimple_check_call_matching_types): Add new argument.
authorDehao Chen <dehao@google.com>
Sat, 15 Jun 2013 16:56:01 +0000 (16:56 +0000)
committerDehao Chen <dehao@gcc.gnu.org>
Sat, 15 Jun 2013 16:56:01 +0000 (16:56 +0000)
2013-06-15  Dehao Chen  <dehao@google.com>

* tree-flow.h (gimple_check_call_matching_types): Add new argument.
* gimple-low.c (gimple_check_call_matching_types): Likewise.
(gimple_check_call_args): Likewise.
* value-prof.c (check_ic_target): Likewise.
* ipa-inline.c (early_inliner): Likewise.
* ipa-prop.c (update_indirect_edges_after_inlining): Likewise.
* cgraph.c (cgraph_create_edge_1): Likewise.
(cgraph_make_edge_direct): Likewise.

From-SVN: r200125

gcc/ChangeLog
gcc/cgraph.c
gcc/gimple-low.c
gcc/ipa-inline.c
gcc/ipa-prop.c
gcc/tree-flow.h
gcc/value-prof.c

index 66903b453b3c6db1b39b1af1579aecd9e10a9346..d4a354623844c496a3d13b666ab7804342f35cbe 100644 (file)
@@ -1,3 +1,14 @@
+2013-06-15  Dehao Chen  <dehao@google.com>
+
+       * tree-flow.h (gimple_check_call_matching_types): Add new argument.
+       * gimple-low.c (gimple_check_call_matching_types): Likewise.
+       (gimple_check_call_args): Likewise.
+       * value-prof.c (check_ic_target): Likewise.
+       * ipa-inline.c (early_inliner): Likewise.
+       * ipa-prop.c (update_indirect_edges_after_inlining): Likewise.
+       * cgraph.c (cgraph_create_edge_1): Likewise.
+       (cgraph_make_edge_direct): Likewise.
+
 2013-06-14  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/57615
index 797d58a00200297ca811ba477dab043dd74d1963..a2ec60221e9b1d85feb644e1ee8de4c59adb88b3 100644 (file)
@@ -818,7 +818,8 @@ cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
   pop_cfun ();
   if (call_stmt
       && callee && callee->symbol.decl
-      && !gimple_check_call_matching_types (call_stmt, callee->symbol.decl))
+      && !gimple_check_call_matching_types (call_stmt, callee->symbol.decl,
+                                           false))
     edge->call_stmt_cannot_inline_p = true;
   else
     edge->call_stmt_cannot_inline_p = false;
@@ -1018,7 +1019,8 @@ cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
 
   if (edge->call_stmt)
     edge->call_stmt_cannot_inline_p
-      = !gimple_check_call_matching_types (edge->call_stmt, callee->symbol.decl);
+      = !gimple_check_call_matching_types (edge->call_stmt, callee->symbol.decl,
+                                          false);
 
   /* We need to re-determine the inlining status of the edge.  */
   initialize_inline_failed (edge);
index b06d194da657cc371cc84dc6892c2ef30f978697..64cc031785d3722246252eb4d80b98319b6d6d3a 100644 (file)
@@ -204,7 +204,7 @@ struct gimple_opt_pass pass_lower_cf =
    return false.  */
 
 static bool
-gimple_check_call_args (gimple stmt, tree fndecl)
+gimple_check_call_args (gimple stmt, tree fndecl, bool args_count_match)
 {
   tree parms, p;
   unsigned int i, nargs;
@@ -243,6 +243,8 @@ gimple_check_call_args (gimple stmt, tree fndecl)
                  && !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
             return false;
        }
+      if (args_count_match && p)
+       return false;
     }
   else if (parms)
     {
@@ -271,11 +273,13 @@ gimple_check_call_args (gimple stmt, tree fndecl)
 }
 
 /* Verify if the type of the argument and lhs of CALL_STMT matches
-   that of the function declaration CALLEE.
+   that of the function declaration CALLEE. If ARGS_COUNT_MATCH is
+   true, the arg count needs to be the same.
    If we cannot verify this or there is a mismatch, return false.  */
 
 bool
-gimple_check_call_matching_types (gimple call_stmt, tree callee)
+gimple_check_call_matching_types (gimple call_stmt, tree callee,
+                                 bool args_count_match)
 {
   tree lhs;
 
@@ -285,7 +289,7 @@ gimple_check_call_matching_types (gimple call_stmt, tree callee)
        && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
                                       TREE_TYPE (lhs))
        && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs))
-      || !gimple_check_call_args (call_stmt, callee))
+      || !gimple_check_call_args (call_stmt, callee, args_count_match))
     return false;
   return true;
 }
index 283e517c6dc3f0c2b4ee1c5c5b3bf6d26ba28f90..5d50bb436048011fab812e969b2cf3cf16cb705d 100644 (file)
@@ -2054,8 +2054,8 @@ early_inliner (void)
              es->call_stmt_time
                = estimate_num_insns (edge->call_stmt, &eni_time_weights);
              if (edge->callee->symbol.decl
-                 && !gimple_check_call_matching_types (edge->call_stmt,
-                                                       edge->callee->symbol.decl))
+                 && !gimple_check_call_matching_types (
+                     edge->call_stmt, edge->callee->symbol.decl, false))
                edge->call_stmt_cannot_inline_p = true;
            }
          timevar_pop (TV_INTEGRATION);
index 8918c5b3bf5b6159376c71f3d4a9531eaf7a18e1..a65adbbe331ca6d0ad8585c4d26edc8bf821a341 100644 (file)
@@ -2468,8 +2468,9 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
          new_direct_edge->indirect_inlining_edge = 1;
          if (new_direct_edge->call_stmt)
            new_direct_edge->call_stmt_cannot_inline_p
-             = !gimple_check_call_matching_types (new_direct_edge->call_stmt,
-                                                  new_direct_edge->callee->symbol.decl);
+             = !gimple_check_call_matching_types (
+                 new_direct_edge->call_stmt,
+                 new_direct_edge->callee->symbol.decl, false);
          if (new_edges)
            {
              new_edges->safe_push (new_direct_edge);
index 24fcfbfe92089692ca301b1db9faeb6e2750ca24..caa8d7457fbf54eb0b582c42e5bf21e21619cf3c 100644 (file)
@@ -464,7 +464,7 @@ extern void record_vars_into (tree, tree);
 extern void record_vars (tree);
 extern bool gimple_seq_may_fallthru (gimple_seq);
 extern bool gimple_stmt_may_fallthru (gimple);
-extern bool gimple_check_call_matching_types (gimple, tree);
+extern bool gimple_check_call_matching_types (gimple, tree, bool);
 
 
 /* In tree-ssa.c  */
index b665b1c390496ccfc2fff2cd00647c9747e21d24..67bc2c8ea8e86423ed877d435280d724c3fa418a 100644 (file)
@@ -1231,7 +1231,7 @@ static bool
 check_ic_target (gimple call_stmt, struct cgraph_node *target)
 {
    location_t locus;
-   if (gimple_check_call_matching_types (call_stmt, target->symbol.decl))
+   if (gimple_check_call_matching_types (call_stmt, target->symbol.decl, true))
      return true;
 
    locus =  gimple_location (call_stmt);