diff mbox

[52/89] Make gimple_phi_arg_edge require a gimple_phi

Message ID 1398099480-49147-53-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm April 21, 2014, 4:57 p.m. UTC
gcc/
	* gimple.h (gimple_phi_arg_edge): Require a gimple_phi rather
	than a plain gimple.

	* 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): 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.
	(find_def_preds): Likewise.
	(is_use_properly_guarded): Likewise.
	(prune_uninit_phi_opnds_in_unrealizable_paths): Likewise.  Also,
	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): Require a
	gimple_phi rather than a plain gimple; add a checked cast.
	(find_uninit_use): Replace check of code against GIMPLE_PHI with
	a dyn_cast_gimple_phi, introducing a new local.
---
 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    |  6 +++---
 gcc/tree-ssa-sink.c         |  8 ++++----
 gcc/tree-ssa-uninit.c       | 41 +++++++++++++++++++++--------------------
 13 files changed, 65 insertions(+), 53 deletions(-)

Comments

Jeff Law May 12, 2014, 8:33 p.m. UTC | #1
On 04/21/14 10:57, David Malcolm wrote:
> gcc/
> 	* gimple.h (gimple_phi_arg_edge): Require a gimple_phi rather
> 	than a plain gimple.
>
> 	* 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): 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.
> 	(find_def_preds): Likewise.
> 	(is_use_properly_guarded): Likewise.
> 	(prune_uninit_phi_opnds_in_unrealizable_paths): Likewise.  Also,
> 	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): Require a
> 	gimple_phi rather than a plain gimple; add a checked cast.
> 	(find_uninit_use): Replace check of code against GIMPLE_PHI with
> 	a dyn_cast_gimple_phi, introducing a new local.
Fine once prereqs go in.

jeff
diff mbox

Patch

diff --git a/gcc/gimple.h b/gcc/gimple.h
index 6007516..72f67ce 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -4251,12 +4251,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 8dca109..11ea1d3 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2234,10 +2234,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");
@@ -2447,7 +2447,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);
@@ -2739,7 +2739,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;
 
@@ -2759,7 +2759,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 e294dc3..0797abff 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -383,7 +383,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;
@@ -440,7 +440,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 249433f..7b4bb12 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -1462,7 +1462,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);
 
@@ -1483,8 +1484,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 = lhs_def_stmt->dyn_cast_gimple_phi ();
+  if (!phi_stmt)
     return;
 
   for (i = 0; i < gimple_phi_num_args (phi_stmt); i++)
@@ -2215,7 +2220,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;
@@ -2237,7 +2242,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 = SSA_NAME_DEF_STMT (return_val)->as_a_gimple_phi ();
   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 347b6b3..9efb01c 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1692,7 +1692,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 (stmt->as_a_gimple_phi (),
+				       PHI_ARG_INDEX_FROM_USE (use));
 	      if (e->flags & EDGE_ABNORMAL)
 		{
 		  /* This can only occur for virtual operands, since
@@ -4804,9 +4805,11 @@  verify_gimple_in_cfg (struct function *fn)
     {
       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 70a284b..928d397 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -4156,7 +4156,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;
@@ -4186,7 +4186,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);
@@ -4197,7 +4197,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 dfe9108..217adeb 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -2604,7 +2604,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 (stmt->as_a_gimple_phi (), 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 fa1c3cf..cd4f5a1 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -933,9 +933,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 294fc33..2953a1b 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -657,6 +657,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 = stmt->as_a_gimple_phi ();
 	  size_t k;
 
 	  for (k = 0; k < gimple_phi_num_args (stmt); k++)
@@ -739,7 +740,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 2c431e7..3223a71 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -1108,7 +1108,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 (use_stmt->as_a_gimple_phi (), 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 a2afcdd..ad7f008 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -954,7 +954,7 @@  replace_uses_in (gimple stmt, ssa_prop_get_value_fn get_value)
    values from PROP_VALUE.  */
 
 static void
-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;
@@ -1103,8 +1103,8 @@  substitute_and_fold (ssa_prop_get_value_fn get_value_fn,
 
       /* Propagate known values into PHI nodes.  */
       if (get_value_fn)
-	for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
-	  replace_phi_args_in (gsi_stmt (i), get_value_fn);
+	for (gimple_phi_iterator gpi = gsi_start_phis (bb); !gsi_end_p (gpi); gsi_next (&gpi))
+	  replace_phi_args_in (gpi.phi (), get_value_fn);
 
       /* Propagate known values into stmts.  Do a backward walk if
          do_dce is true. In some case it exposes
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
index 6d02975..295cf48 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;
@@ -157,11 +157,11 @@  nearest_common_dominator_of_uses (gimple stmt, bool *debug_stmts)
 	  gimple usestmt = USE_STMT (use_p);
 	  basic_block useblock;
 
-	  if (gimple_code (usestmt) == GIMPLE_PHI)
+	  if (gimple_phi phi = usestmt->dyn_cast_gimple_phi ())
 	    {
 	      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))
 	    {
@@ -417,7 +417,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 (use->as_a_gimple_phi (), 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 43be808..60c9cad 100644
--- a/gcc/tree-ssa-uninit.c
+++ b/gcc/tree-ssa-uninit.c
@@ -284,7 +284,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;
@@ -636,7 +636,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,
                        pointer_set_t *visited_phis)
 {
@@ -669,7 +669,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 (def->as_a_gimple_phi (), cd_root, edges,
                                    visited_phis);
           else if (!uninit_undefined_value_p (opnd))
             {
@@ -689,7 +689,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];
@@ -930,7 +930,7 @@  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,
                          pointer_set_t *visited_phis);
 
@@ -969,9 +969,9 @@  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,
 					      pointer_set_t *visited_phis,
@@ -989,22 +989,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 = SSA_NAME_DEF_STMT (flag_arg)->dyn_cast_gimple_phi ();
+	  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 = SSA_NAME_DEF_STMT (phi_arg)->dyn_cast_gimple_phi ();
+	  if (!phi_arg_def)
             return false;
 
           if (gimple_bb (phi_arg_def) != gimple_bb (flag_arg_def))
@@ -1045,16 +1045,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 = opnd_def->dyn_cast_gimple_phi ())
             {
               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;
@@ -1143,7 +1143,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,
+				           gimple_phi phi,
+					   unsigned uninit_opnds,
 					   pointer_set_t *visited_phis)
 {
   unsigned int i, n;
@@ -1217,7 +1218,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,
+                                                             flag_def->as_a_gimple_phi (),
                                                              boundary_cst,
                                                              cmp_code,
                                                              visited_phis,
@@ -2101,7 +2102,7 @@  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,
                          pointer_set_t *visited_phis)
 {
@@ -2192,8 +2193,8 @@  find_uninit_use (gimple_phi phi, unsigned uninit_opnds,
 
       visited_phis = pointer_set_create ();
 
-      if (gimple_code (use_stmt) == GIMPLE_PHI)
-	use_bb = gimple_phi_arg_edge (use_stmt,
+      if (gimple_phi use_phi = use_stmt->dyn_cast_gimple_phi ())
+	use_bb = gimple_phi_arg_edge (use_phi,
 				      PHI_ARG_INDEX_FROM_USE (use_p))->src;
       else
 	use_bb = gimple_bb (use_stmt);