This corresponds to:
  [PATCH 52/89] Make gimple_phi_arg_edge require a gimple_phi
  https://gcc.gnu.org/ml/gcc-patches/2014-04/msg01228.html
from the original 89-patch kit

That earlier patch was approved by Jeff:
> Fine once prereqs go in.
in https://gcc.gnu.org/ml/gcc-patches/2014-05/msg00877.html

gcc/
        * gimple.h (gimple_phi_arg_edge): Require a gimple_phi rather
        than a plain gimple.

        * gimple-ssa-strength-reduction.c (ncd_with_phi): Strengthen
        param "phi" from gimple to gimple_phi.  Add a checked cast.
        (ncd_of_cand_and_phis): Add a checked cast.

        * graphite-sese-to-poly.c (rewrite_phi_out_of_ssa): Require a
        gimple_phi_iterator; strengthen local "phi" from gimple to a
        gimple_phi.
        (rewrite_cross_bb_scalar_deps): Strengthen local "psi" from
        a gimple_stmt_iterator to a gimple_phi_iterator.
        (edge_initial_value_for_loop_phi): Require a gimple phi.
        (initial_value_for_loop_phi): Likewise.

        * ipa-split.c (consider_split): Convert "bsi" to a
        gimple_phi_iterator and "stmt" to a gimple_phi.

        * predict.c (predict_extra_loop_exits): Convert "phi_stmt" to be
        a gimple_phi; introduce "lhs_def_stmt" as plain gimple.
        (apply_return_prediction): Convert "phi" to be a gimple_phi.

        * tree-cfg.c (replace_uses_by): Add checked cast to gimple_phi.
        (verify_gimple_in_cfg): Introduce gimple_phi_iterator "gpi" and use
        it to convert "phi" to a gimple_phi.

        * tree-eh.c (cleanup_empty_eh_merge_phis): Convert "ngsi", "ogsi"
        to be gimple_phi_iterators.  Convert "ophi", "nphi" to be
        gimple_phi.

        * tree-into-ssa.c (prepare_use_sites_for): Add checked cast to
        gimple_phi.

        * tree-ssa-coalesce.c (create_outofssa_var_map): Introduce
        gimple_phi_iterator "gpi" and use it to convert "phi" to a
        gimple_phi.

        * tree-ssa-dce.c (propagate_necessity): Introduce local "phi",
        from checked cast to gimple_phi.

        * tree-ssa-live.c (set_var_live_on_entry): Add checked cast to
        gimple_phi.

        * tree-ssa-propagate.c (replace_phi_args_in): Require a gimple_phi
        rather than a plain gimple.
        (substitute_and_fold_dom_walker::before_dom_children): Introduce
        gimple_phi_iterator "gpi".

        * tree-ssa-sink.c (find_bb_for_arg): Require a gimple_phi rather
        than a plain gimple.
        (nearest_common_dominator_of_uses): Replace check of code against
        GIMPLE_PHI with a dyn_cast<gimple_phi>, introducing a new local.
        (statement_sink_location): Add checked cast to gimple_phi.

        * tree-ssa-uninit.c (compute_uninit_opnds_pos): Require a
        gimple_phi rather than a plain gimple.
        (collect_phi_def_edges): Likewise.  Add a checked cast.
        (find_def_preds): Strengthen param "phi" from gimple to
        gimple_phi.
        (prune_uninit_phi_opnds_in_unrealizable_paths): Likewise for
        params "phi" and "flag_def".  Strenghen param "visited_phis" from
        hash_set<gimple> * to hash_set<gimple_phi> *.  Convert
        "flag_arg_def", "phi_arg_def" to gimple_phi using
        dyn_cast<gimple_phi>.  Similarly, introduce new local
        "opnd_def_phi".
        (use_pred_not_overlap_with_undef_path_pred): Strengthen param
        "phi" from gimple to gimple_phi, and param "visited_phis" from
        hash_set<gimple> * to hash_set<gimple_phi> *.  Add a checked cast.
        (is_use_properly_guarded): Likewise for params.
        (find_uninit_use): Replace check of code against GIMPLE_PHI with
        a dyn_cast<gimple_phi>, introducing a new local "use_phi".
        Strengthen local "visited_phis" from hash_set<gimple> to
        hash_set<gimple_phi>.
---
 gcc/ChangeLog.gimple-classes        | 78 +++++++++++++++++++++++++++++++++++++
 gcc/gimple-ssa-strength-reduction.c |  8 ++--
 gcc/gimple.h                        |  6 +--
 gcc/graphite-sese-to-poly.c         | 10 ++---
 gcc/ipa-split.c                     |  4 +-
 gcc/predict.c                       | 15 ++++---
 gcc/tree-cfg.c                      |  9 +++--
 gcc/tree-eh.c                       |  6 +--
 gcc/tree-into-ssa.c                 |  2 +-
 gcc/tree-ssa-coalesce.c             |  6 ++-
 gcc/tree-ssa-dce.c                  |  3 +-
 gcc/tree-ssa-live.c                 |  2 +-
 gcc/tree-ssa-propagate.c            | 14 ++++---
 gcc/tree-ssa-sink.c                 |  8 ++--
 gcc/tree-ssa-uninit.c               | 50 ++++++++++++------------
 15 files changed, 157 insertions(+), 64 deletions(-)

diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes
index abee412..4a78ca0 100644
--- a/gcc/ChangeLog.gimple-classes
+++ b/gcc/ChangeLog.gimple-classes
@@ -1,5 +1,83 @@
 2014-10-24  David Malcolm  <dmalc...@redhat.com>
 
+       Make gimple_phi_arg_edge require a gimple_phi
+
+       * gimple.h (gimple_phi_arg_edge): Require a gimple_phi rather
+       than a plain gimple.
+
+       * gimple-ssa-strength-reduction.c (ncd_with_phi): Strengthen
+       param "phi" from gimple to gimple_phi.  Add a checked cast.
+       (ncd_of_cand_and_phis): Add a checked cast.
+
+       * graphite-sese-to-poly.c (rewrite_phi_out_of_ssa): Require a
+       gimple_phi_iterator; strengthen local "phi" from gimple to a
+       gimple_phi.
+       (rewrite_cross_bb_scalar_deps): Strengthen local "psi" from
+       a gimple_stmt_iterator to a gimple_phi_iterator.
+       (edge_initial_value_for_loop_phi): Require a gimple phi.
+       (initial_value_for_loop_phi): Likewise.
+
+       * ipa-split.c (consider_split): Convert "bsi" to a
+       gimple_phi_iterator and "stmt" to a gimple_phi.
+
+       * predict.c (predict_extra_loop_exits): Convert "phi_stmt" to be
+       a gimple_phi; introduce "lhs_def_stmt" as plain gimple.
+       (apply_return_prediction): Convert "phi" to be a gimple_phi.
+
+       * tree-cfg.c (replace_uses_by): Add checked cast to gimple_phi.
+       (verify_gimple_in_cfg): Introduce gimple_phi_iterator "gpi" and use
+       it to convert "phi" to a gimple_phi.
+
+       * tree-eh.c (cleanup_empty_eh_merge_phis): Convert "ngsi", "ogsi"
+       to be gimple_phi_iterators.  Convert "ophi", "nphi" to be
+       gimple_phi.
+
+       * tree-into-ssa.c (prepare_use_sites_for): Add checked cast to
+       gimple_phi.
+
+       * tree-ssa-coalesce.c (create_outofssa_var_map): Introduce
+       gimple_phi_iterator "gpi" and use it to convert "phi" to a
+       gimple_phi.
+
+       * tree-ssa-dce.c (propagate_necessity): Introduce local "phi",
+       from checked cast to gimple_phi.
+
+       * tree-ssa-live.c (set_var_live_on_entry): Add checked cast to
+       gimple_phi.
+
+       * tree-ssa-propagate.c (replace_phi_args_in): Require a gimple_phi
+       rather than a plain gimple.
+       (substitute_and_fold_dom_walker::before_dom_children): Introduce
+       gimple_phi_iterator "gpi".
+
+       * tree-ssa-sink.c (find_bb_for_arg): Require a gimple_phi rather
+       than a plain gimple.
+       (nearest_common_dominator_of_uses): Replace check of code against
+       GIMPLE_PHI with a dyn_cast<gimple_phi>, introducing a new local.
+       (statement_sink_location): Add checked cast to gimple_phi.
+
+       * tree-ssa-uninit.c (compute_uninit_opnds_pos): Require a
+       gimple_phi rather than a plain gimple.
+       (collect_phi_def_edges): Likewise.  Add a checked cast.
+       (find_def_preds): Strengthen param "phi" from gimple to
+       gimple_phi.
+       (prune_uninit_phi_opnds_in_unrealizable_paths): Likewise for
+       params "phi" and "flag_def".  Strenghen param "visited_phis" from
+       hash_set<gimple> * to hash_set<gimple_phi> *.  Convert
+       "flag_arg_def", "phi_arg_def" to gimple_phi using
+       dyn_cast<gimple_phi>.  Similarly, introduce new local
+       "opnd_def_phi".
+       (use_pred_not_overlap_with_undef_path_pred): Strengthen param
+       "phi" from gimple to gimple_phi, and param "visited_phis" from
+       hash_set<gimple> * to hash_set<gimple_phi> *.  Add a checked cast.
+       (is_use_properly_guarded): Likewise for params.
+       (find_uninit_use): Replace check of code against GIMPLE_PHI with
+       a dyn_cast<gimple_phi>, introducing a new local "use_phi".
+       Strengthen local "visited_phis" from hash_set<gimple> to
+       hash_set<gimple_phi>.
+
+2014-10-24  David Malcolm  <dmalc...@redhat.com>
+
        Update GRAPHITE to use more concrete gimple statement classes
 
        * graphite-scop-detection.c (canonicalize_loop_closed_ssa):
diff --git a/gcc/gimple-ssa-strength-reduction.c 
b/gcc/gimple-ssa-strength-reduction.c
index 4b4c213..1b6138f 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -2970,7 +2970,7 @@ ncd_for_two_cands (basic_block bb1, basic_block bb2,
    candidates, return the earliest candidate in the block in *WHERE.  */
 
 static basic_block
-ncd_with_phi (slsr_cand_t c, const widest_int &incr, gimple phi,
+ncd_with_phi (slsr_cand_t c, const widest_int &incr, gimple_phi phi,
              basic_block ncd, slsr_cand_t *where)
 {
   unsigned i;
@@ -2986,7 +2986,8 @@ ncd_with_phi (slsr_cand_t c, const widest_int &incr, 
gimple phi,
          gimple arg_def = SSA_NAME_DEF_STMT (arg);
 
          if (gimple_code (arg_def) == GIMPLE_PHI)
-           ncd = ncd_with_phi (c, incr, arg_def, ncd, where);
+           ncd = ncd_with_phi (c, incr, as_a <gimple_phi> (arg_def), ncd,
+                               where);
          else 
            {
              slsr_cand_t arg_cand = base_cand_from_table (arg);
@@ -3020,7 +3021,8 @@ ncd_of_cand_and_phis (slsr_cand_t c, const widest_int 
&incr, slsr_cand_t *where)
     }
   
   if (phi_dependent_cand_p (c))
-    ncd = ncd_with_phi (c, incr, lookup_cand (c->def_phi)->cand_stmt,
+    ncd = ncd_with_phi (c, incr,
+                       as_a <gimple_phi> (lookup_cand (c->def_phi)->cand_stmt),
                        ncd, where);
 
   return ncd;
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 5e49d97..96d9245 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -3979,12 +3979,12 @@ gimple_phi_arg_def_ptr (gimple_phi phi, size_t index)
   return &gimple_phi_arg (phi, index)->def;
 }
 
-/* Return the edge associated with argument I of phi node GS.  */
+/* Return the edge associated with argument I of phi node PHI.  */
 
 static inline edge
-gimple_phi_arg_edge (gimple gs, size_t i)
+gimple_phi_arg_edge (gimple_phi phi, size_t i)
 {
-  return EDGE_PRED (gimple_bb (gs), i);
+  return EDGE_PRED (gimple_bb (phi), i);
 }
 
 /* Return the source location of gimple argument I of phi node GS.  */
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index f58f750..33a661d 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2235,10 +2235,10 @@ rewrite_close_phi_out_of_ssa (scop_p scop, 
gimple_stmt_iterator *psi)
    dimension array for it.  */
 
 static void
-rewrite_phi_out_of_ssa (scop_p scop, gimple_stmt_iterator *psi)
+rewrite_phi_out_of_ssa (scop_p scop, gimple_phi_iterator *psi)
 {
   size_t i;
-  gimple phi = gsi_stmt (*psi);
+  gimple_phi phi = psi->phi ();
   basic_block bb = gimple_bb (phi);
   tree res = gimple_phi_result (phi);
   tree zero_dim_array = create_zero_dim_array (res, "phi_out_of_ssa");
@@ -2449,7 +2449,7 @@ rewrite_cross_bb_scalar_deps (scop_p scop, 
gimple_stmt_iterator *gsi)
     if (gimple_code (use_stmt) == GIMPLE_PHI
        && (res = true))
       {
-       gimple_stmt_iterator psi = gsi_for_stmt (use_stmt);
+       gimple_phi_iterator psi = gsi_start_phis (gimple_bb (use_stmt));
 
        if (scalar_close_phi_node_p (gsi_stmt (psi)))
          rewrite_close_phi_out_of_ssa (scop, &psi);
@@ -2741,7 +2741,7 @@ follow_inital_value_to_phi (tree arg, tree lhs)
    from outside the loop.  */
 
 static edge
-edge_initial_value_for_loop_phi (gimple phi)
+edge_initial_value_for_loop_phi (gimple_phi phi)
 {
   size_t i;
 
@@ -2761,7 +2761,7 @@ edge_initial_value_for_loop_phi (gimple phi)
    from outside the loop.  */
 
 static tree
-initial_value_for_loop_phi (gimple phi)
+initial_value_for_loop_phi (gimple_phi phi)
 {
   size_t i;
 
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index 94a0337..5678251 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -409,7 +409,7 @@ consider_split (struct split_point *current, bitmap 
non_ssa_vars,
   unsigned int call_overhead;
   edge e;
   edge_iterator ei;
-  gimple_stmt_iterator bsi;
+  gimple_phi_iterator bsi;
   unsigned int i;
   int incoming_freq = 0;
   tree retval;
@@ -466,7 +466,7 @@ consider_split (struct split_point *current, bitmap 
non_ssa_vars,
      incoming from header are the same.  */
   for (bsi = gsi_start_phis (current->entry_bb); !gsi_end_p (bsi); gsi_next 
(&bsi))
     {
-      gimple stmt = gsi_stmt (bsi);
+      gimple_phi stmt = bsi.phi ();
       tree val = NULL;
 
       if (virtual_operand_p (gimple_phi_result (stmt)))
diff --git a/gcc/predict.c b/gcc/predict.c
index b5556db..bd3f138 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -1442,7 +1442,8 @@ predict_extra_loop_exits (edge exit_edge)
 {
   unsigned i;
   bool check_value_one;
-  gimple phi_stmt;
+  gimple lhs_def_stmt;
+  gimple_phi phi_stmt;
   tree cmp_rhs, cmp_lhs;
   gimple cmp_stmt = last_stmt (exit_edge->src);
 
@@ -1463,8 +1464,12 @@ predict_extra_loop_exits (edge exit_edge)
                    ^ (gimple_cond_code (cmp_stmt) == EQ_EXPR))
                    ^ ((exit_edge->flags & EDGE_TRUE_VALUE) != 0));
 
-  phi_stmt = SSA_NAME_DEF_STMT (cmp_lhs);
-  if (!phi_stmt || gimple_code (phi_stmt) != GIMPLE_PHI)
+  lhs_def_stmt = SSA_NAME_DEF_STMT (cmp_lhs);
+  if (!lhs_def_stmt)
+    return;
+
+  phi_stmt = dyn_cast <gimple_phi> (lhs_def_stmt);
+  if (!phi_stmt)
     return;
 
   for (i = 0; i < gimple_phi_num_args (phi_stmt); i++)
@@ -2143,7 +2148,7 @@ apply_return_prediction (void)
   gimple return_stmt = NULL;
   tree return_val;
   edge e;
-  gimple phi;
+  gimple_phi phi;
   int phi_num_args, i;
   enum br_predictor pred;
   enum prediction direction;
@@ -2165,7 +2170,7 @@ apply_return_prediction (void)
       || !SSA_NAME_DEF_STMT (return_val)
       || gimple_code (SSA_NAME_DEF_STMT (return_val)) != GIMPLE_PHI)
     return;
-  phi = SSA_NAME_DEF_STMT (return_val);
+  phi = as_a <gimple_phi> (SSA_NAME_DEF_STMT (return_val));
   phi_num_args = gimple_phi_num_args (phi);
   pred = return_prediction (PHI_ARG_DEF (phi, 0), &direction);
 
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 038e3ef..697a3f1 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1736,7 +1736,8 @@ replace_uses_by (tree name, tree val)
 
          if (gimple_code (stmt) == GIMPLE_PHI)
            {
-             e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
+             e = gimple_phi_arg_edge (as_a <gimple_phi> (stmt),
+                                      PHI_ARG_INDEX_FROM_USE (use));
              if (e->flags & EDGE_ABNORMAL)
                {
                  /* This can only occur for virtual operands, since
@@ -4876,9 +4877,11 @@ verify_gimple_in_cfg (struct function *fn, bool 
verify_nothrow)
     {
       gimple_stmt_iterator gsi;
 
-      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+      for (gimple_phi_iterator gpi = gsi_start_phis (bb);
+          !gsi_end_p (gpi);
+          gsi_next (&gpi))
        {
-         gimple phi = gsi_stmt (gsi);
+         gimple_phi phi = gpi.phi ();
          bool err2 = false;
          unsigned i;
 
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index a593cc7..1138696 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -4093,7 +4093,7 @@ static bool
 cleanup_empty_eh_merge_phis (basic_block new_bb, basic_block old_bb,
                             edge old_bb_out, bool change_region)
 {
-  gimple_stmt_iterator ngsi, ogsi;
+  gimple_phi_iterator ngsi, ogsi;
   edge_iterator ei;
   edge e;
   bitmap ophi_handled;
@@ -4123,7 +4123,7 @@ cleanup_empty_eh_merge_phis (basic_block new_bb, 
basic_block old_bb,
      for the edges we're going to move.  */
   for (ngsi = gsi_start_phis (new_bb); !gsi_end_p (ngsi); gsi_next (&ngsi))
     {
-      gimple ophi, nphi = gsi_stmt (ngsi);
+      gimple_phi ophi, nphi = ngsi.phi ();
       tree nresult, nop;
 
       nresult = gimple_phi_result (nphi);
@@ -4134,7 +4134,7 @@ cleanup_empty_eh_merge_phis (basic_block new_bb, 
basic_block old_bb,
       ophi = NULL;
       for (ogsi = gsi_start_phis (old_bb); !gsi_end_p (ogsi); gsi_next (&ogsi))
        {
-         ophi = gsi_stmt (ogsi);
+         ophi = ogsi.phi ();
          if (gimple_phi_result (ophi) == nop)
            break;
          ophi = NULL;
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 3150f6b..9291105 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -2600,7 +2600,7 @@ prepare_use_sites_for (tree name, bool insert_phi_p)
       if (gimple_code (stmt) == GIMPLE_PHI)
        {
          int ix = PHI_ARG_INDEX_FROM_USE (use_p);
-         edge e = gimple_phi_arg_edge (stmt, ix);
+         edge e = gimple_phi_arg_edge (as_a <gimple_phi> (stmt), ix);
          mark_use_interesting (name, stmt, e->src, insert_phi_p);
        }
       else
diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c
index f043096..a21cea6 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -934,9 +934,11 @@ create_outofssa_var_map (coalesce_list_p cl, bitmap 
used_in_copy)
     {
       tree arg;
 
-      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+      for (gimple_phi_iterator gpi = gsi_start_phis (bb);
+          !gsi_end_p (gpi);
+          gsi_next (&gpi))
        {
-         gimple phi = gsi_stmt (gsi);
+         gimple_phi phi = gpi.phi ();
          size_t i;
          int ver;
          tree res;
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 5a10d18..f853512 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -659,6 +659,7 @@ propagate_necessity (bool aggressive)
             we also consider the control dependent edges leading to the
             predecessor block associated with each PHI alternative as
             necessary.  */
+         gimple_phi phi = as_a <gimple_phi> (stmt);
          size_t k;
 
          for (k = 0; k < gimple_phi_num_args (stmt); k++)
@@ -741,7 +742,7 @@ propagate_necessity (bool aggressive)
            {
              for (k = 0; k < gimple_phi_num_args (stmt); k++)
                {
-                 basic_block arg_bb = gimple_phi_arg_edge (stmt, k)->src;
+                 basic_block arg_bb = gimple_phi_arg_edge (phi, k)->src;
 
                  if (gimple_bb (stmt)
                      != get_immediate_dominator (CDI_POST_DOMINATORS, arg_bb))
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index 49ddc10..5157ff0 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -1106,7 +1106,7 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p 
live)
             as this is where a copy would be inserted.  Check to see if it is
             defined in that block, or whether its live on entry.  */
          int index = PHI_ARG_INDEX_FROM_USE (use);
-         edge e = gimple_phi_arg_edge (use_stmt, index);
+         edge e = gimple_phi_arg_edge (as_a <gimple_phi> (use_stmt), index);
          if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
            {
              if (e->src != def_bb)
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 20f7554..986829f 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -966,7 +966,7 @@ replace_uses_in (gimple stmt, ssa_prop_get_value_fn 
get_value)
    values from PROP_VALUE.  */
 
 static bool
-replace_phi_args_in (gimple phi, ssa_prop_get_value_fn get_value)
+replace_phi_args_in (gimple_phi phi, ssa_prop_get_value_fn get_value)
 {
   size_t i;
   bool replaced = false;
@@ -1054,12 +1054,12 @@ public:
 void
 substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
 {
-  gimple_stmt_iterator i;
-
   /* Propagate known values into PHI nodes.  */
-  for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
+  for (gimple_phi_iterator i = gsi_start_phis (bb);
+       !gsi_end_p (i);
+       gsi_next (&i))
     {
-      gimple phi = gsi_stmt (i);
+      gimple_phi phi = i.phi ();
       tree res = gimple_phi_result (phi);
       if (virtual_operand_p (res))
        continue;
@@ -1080,7 +1080,9 @@ substitute_and_fold_dom_walker::before_dom_children 
(basic_block bb)
 
   /* Propagate known values into stmts.  In some case it exposes
      more trivially deletable stmts to walk backward.  */
-  for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
+  for (gimple_stmt_iterator i = gsi_start_bb (bb);
+       !gsi_end_p (i);
+       gsi_next (&i))
     {
       bool did_replace;
       gimple stmt = gsi_stmt (i);
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
index d7fd159..325d9d9 100644
--- a/gcc/tree-ssa-sink.c
+++ b/gcc/tree-ssa-sink.c
@@ -85,7 +85,7 @@ static struct
    we return NULL.  */
 
 static basic_block
-find_bb_for_arg (gimple phi, tree def)
+find_bb_for_arg (gimple_phi phi, tree def)
 {
   size_t i;
   bool foundone = false;
@@ -149,11 +149,11 @@ nearest_common_dominator_of_uses (def_operand_p def_p, 
bool *debug_stmts)
       gimple usestmt = USE_STMT (use_p);
       basic_block useblock;
 
-      if (gimple_code (usestmt) == GIMPLE_PHI)
+      if (gimple_phi phi = dyn_cast <gimple_phi> (usestmt))
        {
          int idx = PHI_ARG_INDEX_FROM_USE (use_p);
 
-         useblock = gimple_phi_arg_edge (usestmt, idx)->src;
+         useblock = gimple_phi_arg_edge (phi, idx)->src;
        }
       else if (is_gimple_debug (usestmt))
        {
@@ -446,7 +446,7 @@ statement_sink_location (gimple stmt, basic_block frombb,
        }
     }
 
-  sinkbb = find_bb_for_arg (use, DEF_FROM_PTR (def_p));
+  sinkbb = find_bb_for_arg (as_a <gimple_phi> (use), DEF_FROM_PTR (def_p));
 
   /* This can happen if there are multiple uses in a PHI.  */
   if (!sinkbb)
diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c
index bae72ff..6822bc6 100644
--- a/gcc/tree-ssa-uninit.c
+++ b/gcc/tree-ssa-uninit.c
@@ -294,7 +294,7 @@ can_skip_redundant_opnd (tree opnd, gimple phi)
    that have empty (or possibly empty) definitions.  */
 
 static unsigned
-compute_uninit_opnds_pos (gimple phi)
+compute_uninit_opnds_pos (gimple_phi phi)
 {
   size_t i, n;
   unsigned uninit_opnds = 0;
@@ -646,7 +646,7 @@ find_predicates (pred_chain_union *preds,
    VISITED_PHIS is a pointer set for detecting cycles.  */
 
 static void
-collect_phi_def_edges (gimple phi, basic_block cd_root,
+collect_phi_def_edges (gimple_phi phi, basic_block cd_root,
                        vec<edge> *edges,
                        hash_set<gimple> *visited_phis)
 {
@@ -679,7 +679,7 @@ collect_phi_def_edges (gimple phi, basic_block cd_root,
           if (gimple_code (def) == GIMPLE_PHI
               && dominated_by_p (CDI_DOMINATORS,
                                  gimple_bb (def), cd_root))
-            collect_phi_def_edges (def, cd_root, edges,
+            collect_phi_def_edges (as_a <gimple_phi> (def), cd_root, edges,
                                    visited_phis);
           else if (!uninit_undefined_value_p (opnd))
             {
@@ -699,7 +699,7 @@ collect_phi_def_edges (gimple phi, basic_block cd_root,
    composite predicates pointed to by PREDS.  */
 
 static bool
-find_def_preds (pred_chain_union *preds, gimple phi)
+find_def_preds (pred_chain_union *preds, gimple_phi phi)
 {
   size_t num_chains = 0, i, n;
   vec<edge> dep_chains[MAX_NUM_CHAINS];
@@ -937,9 +937,9 @@ find_matching_predicate_in_rest_chains (pred_info pred,
 static bool
 is_use_properly_guarded (gimple use_stmt,
                          basic_block use_bb,
-                         gimple phi,
+                         gimple_phi phi,
                          unsigned uninit_opnds,
-                         hash_set<gimple> *visited_phis);
+                         hash_set<gimple_phi> *visited_phis);
 
 /* Returns true if all uninitialized opnds are pruned. Returns false
    otherwise. PHI is the phi node with uninitialized operands,
@@ -976,12 +976,12 @@ is_use_properly_guarded (gimple use_stmt,
 */
 
 static bool
-prune_uninit_phi_opnds_in_unrealizable_paths (gimple phi,
+prune_uninit_phi_opnds_in_unrealizable_paths (gimple_phi phi,
                                              unsigned uninit_opnds,
-                                             gimple flag_def,
+                                             gimple_phi flag_def,
                                              tree boundary_cst,
                                              enum tree_code cmp_code,
-                                             hash_set<gimple> *visited_phis,
+                                             hash_set<gimple_phi> 
*visited_phis,
                                              bitmap *visited_flag_phis)
 {
   unsigned i;
@@ -996,22 +996,22 @@ prune_uninit_phi_opnds_in_unrealizable_paths (gimple phi,
       flag_arg = gimple_phi_arg_def (flag_def, i);
       if (!is_gimple_constant (flag_arg))
         {
-          gimple flag_arg_def, phi_arg_def;
+          gimple_phi flag_arg_def, phi_arg_def;
           tree phi_arg;
           unsigned uninit_opnds_arg_phi;
 
           if (TREE_CODE (flag_arg) != SSA_NAME)
             return false;
-          flag_arg_def = SSA_NAME_DEF_STMT (flag_arg);
-          if (gimple_code (flag_arg_def) != GIMPLE_PHI)
+          flag_arg_def = dyn_cast <gimple_phi> (SSA_NAME_DEF_STMT (flag_arg));
+         if (!flag_arg_def)
             return false;
 
           phi_arg = gimple_phi_arg_def (phi, i);
           if (TREE_CODE (phi_arg) != SSA_NAME)
             return false;
 
-          phi_arg_def = SSA_NAME_DEF_STMT (phi_arg);
-          if (gimple_code (phi_arg_def) != GIMPLE_PHI)
+          phi_arg_def = dyn_cast <gimple_phi> (SSA_NAME_DEF_STMT (phi_arg));
+         if (!phi_arg_def)
             return false;
 
           if (gimple_bb (phi_arg_def) != gimple_bb (flag_arg_def))
@@ -1052,16 +1052,16 @@ prune_uninit_phi_opnds_in_unrealizable_paths (gimple 
phi,
 
           opnd = gimple_phi_arg_def (phi, i);
           opnd_def = SSA_NAME_DEF_STMT (opnd);
-          if (gimple_code (opnd_def) == GIMPLE_PHI)
+          if (gimple_phi opnd_def_phi = dyn_cast <gimple_phi> (opnd_def))
             {
               edge opnd_edge;
               unsigned uninit_opnds2
-                  = compute_uninit_opnds_pos (opnd_def);
+                  = compute_uninit_opnds_pos (opnd_def_phi);
               gcc_assert (!MASK_EMPTY (uninit_opnds2));
               opnd_edge = gimple_phi_arg_edge (phi, i);
               if (!is_use_properly_guarded (phi,
                                             opnd_edge->src,
-                                            opnd_def,
+                                            opnd_def_phi,
                                             uninit_opnds2,
                                             visited_phis))
                   return false;
@@ -1150,8 +1150,8 @@ prune_uninit_phi_opnds_in_unrealizable_paths (gimple phi,
 
 static bool
 use_pred_not_overlap_with_undef_path_pred (pred_chain_union preds,
-                                          gimple phi, unsigned uninit_opnds,
-                                          hash_set<gimple> *visited_phis)
+                                          gimple_phi phi, unsigned 
uninit_opnds,
+                                          hash_set<gimple_phi> *visited_phis)
 {
   unsigned int i, n;
   gimple flag_def = 0;
@@ -1224,7 +1224,7 @@ use_pred_not_overlap_with_undef_path_pred 
(pred_chain_union preds,
 
   all_pruned = prune_uninit_phi_opnds_in_unrealizable_paths (phi,
                                                              uninit_opnds,
-                                                             flag_def,
+                                                             as_a <gimple_phi> 
(flag_def),
                                                              boundary_cst,
                                                              cmp_code,
                                                              visited_phis,
@@ -2105,9 +2105,9 @@ normalize_preds (pred_chain_union preds, gimple 
use_or_def, bool is_use)
 static bool
 is_use_properly_guarded (gimple use_stmt,
                          basic_block use_bb,
-                         gimple phi,
+                         gimple_phi phi,
                          unsigned uninit_opnds,
-                         hash_set<gimple> *visited_phis)
+                         hash_set<gimple_phi> *visited_phis)
 {
   basic_block phi_bb;
   pred_chain_union preds = vNULL;
@@ -2193,13 +2193,13 @@ find_uninit_use (gimple_phi phi, unsigned uninit_opnds,
       if (is_gimple_debug (use_stmt))
        continue;
 
-      if (gimple_code (use_stmt) == GIMPLE_PHI)
-       use_bb = gimple_phi_arg_edge (use_stmt,
+      if (gimple_phi use_phi = dyn_cast <gimple_phi> (use_stmt))
+       use_bb = gimple_phi_arg_edge (use_phi,
                                      PHI_ARG_INDEX_FROM_USE (use_p))->src;
       else
        use_bb = gimple_bb (use_stmt);
 
-      hash_set<gimple> visited_phis;
+      hash_set<gimple_phi> visited_phis;
       if (is_use_properly_guarded (use_stmt, use_bb, phi, uninit_opnds,
                                    &visited_phis))
        continue;
-- 
1.8.5.3

Reply via email to