gcc/
        * ipa-prop.c (detect_type_change): Require a gimple_call rather
        than a plain gimple.
        (detect_type_change_ssa): Likewise.
        (compute_complex_assign_jump_func): Likewise.
        (compute_complex_ancestor_jump_func): Likewise.
        (compute_known_type_jump_func): Likewise.
        (determine_known_aggregate_parts): Likewise.
        (ipa_compute_jump_functions_for_edge): Strengthen local "call" to
        a gimple_call; add checked cast to gimple_phi.
        (ipa_note_param_call): Require a gimple_call rather than a plain
        gimple.
        (ipa_analyze_indirect_call_uses): Likewise.
        (ipa_analyze_virtual_call_uses): Likewise.
        (ipa_analyze_call_uses): Likewise.
        (ipa_analyze_stmt_uses):Add checked cast to gimple_call.
        (ipa_intraprocedural_devirtualization): Require a gimple_call
        rather than a plain gimple.

        * ipa-prop.h (ipa_intraprocedural_devirtualization): Require a
        gimple_call rather than a plain gimple.

        * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
        Replace use of is_gimple_call with dyn_cast_gimple_call and a
        new local "call_stmt".
---
 gcc/ipa-prop.c     | 33 +++++++++++++++++++--------------
 gcc/ipa-prop.h     |  2 +-
 gcc/tree-ssa-pre.c | 10 +++++-----
 3 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 45d540e..5f2f02f 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -679,7 +679,7 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, 
tree vdef, void *data)
    returned by get_ref_base_and_extent, as is the offset.  */
 
 static bool
-detect_type_change (tree arg, tree base, tree comp_type, gimple call,
+detect_type_change (tree arg, tree base, tree comp_type, gimple_call call,
                    struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
 {
   struct type_change_info tci;
@@ -744,7 +744,7 @@ detect_type_change (tree arg, tree base, tree comp_type, 
gimple call,
 
 static bool
 detect_type_change_ssa (tree arg, tree comp_type,
-                       gimple call, struct ipa_jump_func *jfunc)
+                       gimple_call call, struct ipa_jump_func *jfunc)
 {
   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
   if (!flag_devirtualize
@@ -1034,7 +1034,7 @@ static void
 compute_complex_assign_jump_func (struct ipa_node_params *info,
                                  struct param_analysis_info *parms_ainfo,
                                  struct ipa_jump_func *jfunc,
-                                 gimple call, gimple stmt, tree name,
+                                 gimple_call call, gimple stmt, tree name,
                                  tree param_type)
 {
   HOST_WIDE_INT offset, size, max_size;
@@ -1190,7 +1190,8 @@ static void
 compute_complex_ancestor_jump_func (struct ipa_node_params *info,
                                    struct param_analysis_info *parms_ainfo,
                                    struct ipa_jump_func *jfunc,
-                                   gimple call, gimple phi, tree param_type)
+                                   gimple_call call, gimple_phi phi,
+                                   tree param_type)
 {
   HOST_WIDE_INT offset;
   gimple assign, cond;
@@ -1259,7 +1260,7 @@ compute_complex_ancestor_jump_func (struct 
ipa_node_params *info,
 
 static void
 compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
-                             gimple call, tree expected_type)
+                             gimple_call call, tree expected_type)
 {
   HOST_WIDE_INT offset, size, max_size;
   tree base;
@@ -1363,7 +1364,7 @@ struct ipa_known_agg_contents_list
    JFUNC is the jump function into which the constants are subsequently 
stored.  */
 
 static void
-determine_known_aggregate_parts (gimple call, tree arg, tree arg_type,
+determine_known_aggregate_parts (gimple_call call, tree arg, tree arg_type,
                                 struct ipa_jump_func *jfunc)
 {
   struct ipa_known_agg_contents_list *list = NULL;
@@ -1599,7 +1600,7 @@ ipa_compute_jump_functions_for_edge (struct 
param_analysis_info *parms_ainfo,
 {
   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
   struct ipa_edge_args *args = IPA_EDGE_REF (cs);
-  gimple call = cs->call_stmt;
+  gimple_call call = cs->call_stmt;
   int n, arg_num = gimple_call_num_args (call);
 
   if (arg_num == 0 || args->jump_functions)
@@ -1662,7 +1663,9 @@ ipa_compute_jump_functions_for_edge (struct 
param_analysis_info *parms_ainfo,
                                                  call, stmt, arg, param_type);
              else if (gimple_code (stmt) == GIMPLE_PHI)
                compute_complex_ancestor_jump_func (info, parms_ainfo, jfunc,
-                                                   call, stmt, param_type);
+                                                   call,
+                                                   stmt->as_a_gimple_phi (),
+                                                   param_type);
            }
        }
       else
@@ -1784,7 +1787,8 @@ ipa_is_ssa_with_stmt_def (tree t)
    indirect call graph edge.  */
 
 static struct cgraph_edge *
-ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
+ipa_note_param_call (struct cgraph_node *node, int param_index,
+                    gimple_call stmt)
 {
   struct cgraph_edge *cs;
 
@@ -1858,7 +1862,7 @@ static void
 ipa_analyze_indirect_call_uses (struct cgraph_node *node,
                                struct ipa_node_params *info,
                                struct param_analysis_info *parms_ainfo,
-                               gimple call, tree target)
+                               gimple_call call, tree target)
 {
   gimple def;
   tree n1, n2;
@@ -2001,7 +2005,7 @@ ipa_analyze_indirect_call_uses (struct cgraph_node *node,
 
 static void
 ipa_analyze_virtual_call_uses (struct cgraph_node *node,
-                              struct ipa_node_params *info, gimple call,
+                              struct ipa_node_params *info, gimple_call call,
                               tree target)
 {
   struct cgraph_edge *cs;
@@ -2060,7 +2064,8 @@ ipa_analyze_virtual_call_uses (struct cgraph_node *node,
 static void
 ipa_analyze_call_uses (struct cgraph_node *node,
                       struct ipa_node_params *info,
-                      struct param_analysis_info *parms_ainfo, gimple call)
+                      struct param_analysis_info *parms_ainfo,
+                      gimple_call call)
 {
   tree target = gimple_call_fn (call);
   struct cgraph_edge *cs;
@@ -2092,7 +2097,7 @@ ipa_analyze_stmt_uses (struct cgraph_node *node, struct 
ipa_node_params *info,
                       struct param_analysis_info *parms_ainfo, gimple stmt)
 {
   if (is_gimple_call (stmt))
-    ipa_analyze_call_uses (node, info, parms_ainfo, stmt);
+    ipa_analyze_call_uses (node, info, parms_ainfo, stmt->as_a_gimple_call ());
 }
 
 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
@@ -2256,7 +2261,7 @@ ipa_analyze_node (struct cgraph_node *node)
    target function declaration, otherwise return NULL.  */
 
 tree
-ipa_intraprocedural_devirtualization (gimple call)
+ipa_intraprocedural_devirtualization (gimple_call call)
 {
   tree binfo, token, fndecl;
   struct ipa_jump_func jfunc;
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 8fdd92c..bf3602c 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -584,7 +584,7 @@ tree ipa_get_indirect_edge_target (struct cgraph_edge *ie,
                                   vec<ipa_agg_jump_function_p> );
 struct cgraph_edge *ipa_make_edge_direct_to_target (struct cgraph_edge *, 
tree);
 tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *);
-tree ipa_intraprocedural_devirtualization (gimple);
+tree ipa_intraprocedural_devirtualization (gimple_call);
 
 /* Functions related to both.  */
 void ipa_analyze_node (struct cgraph_node *);
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 41fe055..f081349 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4339,9 +4339,9 @@ eliminate_dom_walker::before_dom_children (basic_block b)
        }
       /* Visit indirect calls and turn them into direct calls if
         possible.  */
-      if (is_gimple_call (stmt))
+      if (gimple_call call_stmt = stmt->dyn_cast_gimple_call ())
        {
-         tree orig_fn = gimple_call_fn (stmt);
+         tree orig_fn = gimple_call_fn (call_stmt);
          tree fn;
          if (!orig_fn)
            continue;
@@ -4353,7 +4353,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
              fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum;
              if (!gimple_call_addr_fndecl (fn))
                {
-                 fn = ipa_intraprocedural_devirtualization (stmt);
+                 fn = ipa_intraprocedural_devirtualization (call_stmt);
                  if (fn)
                    fn = build_fold_addr_expr (fn);
                }
@@ -4376,12 +4376,12 @@ eliminate_dom_walker::before_dom_children (basic_block 
b)
                  print_gimple_stmt (dump_file, stmt, 0, 0);
                }
 
-             gimple_call_set_fn (stmt, fn);
+             gimple_call_set_fn (call_stmt, fn);
              el_to_update.safe_push (stmt);
 
              /* When changing a call into a noreturn call, cfg cleanup
                 is needed to fix up the noreturn call.  */
-             if (!was_noreturn && gimple_call_noreturn_p (stmt))
+             if (!was_noreturn && gimple_call_noreturn_p (call_stmt))
                el_todo |= TODO_cleanup_cfg;
 
              /* If we removed EH side-effects from the statement, clean
-- 
1.8.5.3

Reply via email to