This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gimple-classes, committed 02/17] tree-complex.c: Use gassign


gcc/ChangeLog.gimple-classes:
	* tree-complex.c (init_dont_simulate_again): Within case
	GIMPLE_ASSIGN, introduce local gassign *"assign_stmt" and use it
	in place of "stmt".
	(complex_visit_stmt): Add checked casts to gassign *.
	(expand_complex_move): Replace is_gimple_assign with a dyn_cast,
	introducing local gassign * "assign_stmt", using it in place of
	"stmt" for typesafety.  Within the non-call branch, introduce
	local gassign * "assign_stmt", using it in place of "stmt" for
	typesafety.  Add checked casts.
	(expand_complex_libcall): Strengthen local "old_stmt" from gimple
	to gassign *.
	(expand_complex_div_wide): Split local "stmt" into local gassign *
	"stmt1" and gcond * "stmt2".
	(expand_complex_comparison): Within case GIMPLE_ASSIGN, add a
	checked cast.
	(expand_complex_operations_1): In two places, replace an
	is_gimple_assign with a dyn_cast, introducing locals named
	"assign_stmt" and using them in place of "stmt" for typesafety.
	The first of these requires breaking an if into two if statements
	and reindenting.
---
 gcc/ChangeLog.gimple-classes |  23 ++++++++
 gcc/tree-complex.c           | 122 ++++++++++++++++++++++++-------------------
 2 files changed, 92 insertions(+), 53 deletions(-)

diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes
index 31f999d..9deefda 100644
--- a/gcc/ChangeLog.gimple-classes
+++ b/gcc/ChangeLog.gimple-classes
@@ -1,5 +1,28 @@
 2014-11-06  David Malcolm  <dmalcolm@redhat.com>
 
+	* tree-complex.c (init_dont_simulate_again): Within case
+	GIMPLE_ASSIGN, introduce local gassign *"assign_stmt" and use it
+	in place of "stmt".
+	(complex_visit_stmt): Add checked casts to gassign *.
+	(expand_complex_move): Replace is_gimple_assign with a dyn_cast,
+	introducing local gassign * "assign_stmt", using it in place of
+	"stmt" for typesafety.  Within the non-call branch, introduce
+	local gassign * "assign_stmt", using it in place of "stmt" for
+	typesafety.  Add checked casts.
+	(expand_complex_libcall): Strengthen local "old_stmt" from gimple
+	to gassign *.
+	(expand_complex_div_wide): Split local "stmt" into local gassign *
+	"stmt1" and gcond * "stmt2".
+	(expand_complex_comparison): Within case GIMPLE_ASSIGN, add a
+	checked cast.
+	(expand_complex_operations_1): In two places, replace an
+	is_gimple_assign with a dyn_cast, introducing locals named
+	"assign_stmt" and using them in place of "stmt" for typesafety.
+	The first of these requires breaking an if into two if statements
+	and reindenting.
+
+2014-11-06  David Malcolm  <dmalcolm@redhat.com>
+
 	* tree-vrp.c (stmt_overflow_infinity): Replace is_gimple_assign
 	with a dyn_cast, introducing local "assign_stmt" and using it in
 	place of "stmt" for typesafety.
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index dbc01f4..d8ec287 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -245,14 +245,17 @@ init_dont_simulate_again (void)
 	      break;
 
 	    case GIMPLE_ASSIGN:
-	      sim_again_p = is_complex_reg (gimple_assign_lhs (stmt));
-	      if (gimple_assign_rhs_code (stmt) == REALPART_EXPR
-		  || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
-		op0 = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
-	      else
-		op0 = gimple_assign_rhs1 (stmt);
-	      if (gimple_num_ops (stmt) > 2)
-		op1 = gimple_assign_rhs2 (stmt);
+	      {
+		gassign *assign_stmt = as_a <gassign *> (stmt);
+		sim_again_p = is_complex_reg (gimple_assign_lhs (assign_stmt));
+		if (gimple_assign_rhs_code (assign_stmt) == REALPART_EXPR
+		    || gimple_assign_rhs_code (assign_stmt) == IMAGPART_EXPR)
+		  op0 = TREE_OPERAND (gimple_assign_rhs1 (assign_stmt), 0);
+		else
+		  op0 = gimple_assign_rhs1 (assign_stmt);
+		if (gimple_num_ops (assign_stmt) > 2)
+		  op1 = gimple_assign_rhs2 (assign_stmt);
+	      }
 	      break;
 
 	    case GIMPLE_COND:
@@ -339,18 +342,23 @@ complex_visit_stmt (gimple stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
     {
     case SSA_NAME:
     case COMPLEX_CST:
-      new_l = find_lattice_value (gimple_assign_rhs1 (stmt));
+      new_l = find_lattice_value (gimple_assign_rhs1 (
+				    as_a <gassign *> (stmt)));
       break;
 
     case COMPLEX_EXPR:
-      new_l = find_lattice_value_parts (gimple_assign_rhs1 (stmt),
-				        gimple_assign_rhs2 (stmt));
+      new_l = find_lattice_value_parts (gimple_assign_rhs1 (
+					  as_a <gassign *> (stmt)),
+				        gimple_assign_rhs2 (
+					  as_a <gassign *> (stmt)));
       break;
 
     case PLUS_EXPR:
     case MINUS_EXPR:
-      op1_l = find_lattice_value (gimple_assign_rhs1 (stmt));
-      op2_l = find_lattice_value (gimple_assign_rhs2 (stmt));
+      op1_l = find_lattice_value (gimple_assign_rhs1 (
+				    as_a <gassign *> (stmt)));
+      op2_l = find_lattice_value (gimple_assign_rhs2 (
+				    as_a <gassign *> (stmt)));
 
       /* We've set up the lattice values such that IOR neatly
 	 models addition.  */
@@ -363,8 +371,10 @@ complex_visit_stmt (gimple stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
     case CEIL_DIV_EXPR:
     case FLOOR_DIV_EXPR:
     case ROUND_DIV_EXPR:
-      op1_l = find_lattice_value (gimple_assign_rhs1 (stmt));
-      op2_l = find_lattice_value (gimple_assign_rhs2 (stmt));
+      op1_l = find_lattice_value (gimple_assign_rhs1 (
+				    as_a <gassign *> (stmt)));
+      op2_l = find_lattice_value (gimple_assign_rhs2 (
+				    as_a <gassign *> (stmt)));
 
       /* Obviously, if either varies, so does the result.  */
       if (op1_l == VARYING || op2_l == VARYING)
@@ -390,7 +400,8 @@ complex_visit_stmt (gimple stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
 
     case NEGATE_EXPR:
     case CONJ_EXPR:
-      new_l = find_lattice_value (gimple_assign_rhs1 (stmt));
+      new_l = find_lattice_value (gimple_assign_rhs1 (
+				    as_a <gassign *> (stmt)));
       break;
 
     default:
@@ -779,11 +790,11 @@ expand_complex_move (gimple_stmt_iterator *gsi, tree type)
   tree r, i, lhs, rhs;
   gimple stmt = gsi_stmt (*gsi);
 
-  if (is_gimple_assign (stmt))
+  if (gassign *assign_stmt = dyn_cast <gassign *> (stmt))
     {
-      lhs = gimple_assign_lhs (stmt);
+      lhs = gimple_assign_lhs (assign_stmt);
       if (gimple_num_ops (stmt) == 2)
-	rhs = gimple_assign_rhs1 (stmt);
+	rhs = gimple_assign_rhs1 (assign_stmt);
       else
 	rhs = NULL_TREE;
     }
@@ -814,7 +825,8 @@ expand_complex_move (gimple_stmt_iterator *gsi, tree type)
 	}
       else if (is_gimple_call (stmt)
 	       || gimple_has_side_effects (stmt)
-	       || gimple_assign_rhs_code (stmt) == PAREN_EXPR)
+	       || (gimple_assign_rhs_code (as_a <gassign *> (stmt))
+		   == PAREN_EXPR))
 	{
 	  r = build1 (REALPART_EXPR, inner_type, lhs);
 	  i = build1 (IMAGPART_EXPR, inner_type, lhs);
@@ -822,15 +834,16 @@ expand_complex_move (gimple_stmt_iterator *gsi, tree type)
 	}
       else
 	{
-	  if (gimple_assign_rhs_code (stmt) != COMPLEX_EXPR)
+	  gassign *assign_stmt = as_a <gassign *> (stmt);
+	  if (gimple_assign_rhs_code (assign_stmt) != COMPLEX_EXPR)
 	    {
 	      r = extract_component (gsi, rhs, 0, true);
 	      i = extract_component (gsi, rhs, 1, true);
 	    }
 	  else
 	    {
-	      r = gimple_assign_rhs1 (stmt);
-	      i = gimple_assign_rhs2 (stmt);
+	      r = gimple_assign_rhs1 (assign_stmt);
+	      i = gimple_assign_rhs2 (assign_stmt);
 	    }
 	  update_complex_assignment (gsi, r, i);
 	}
@@ -853,8 +866,8 @@ expand_complex_move (gimple_stmt_iterator *gsi, tree type)
       if (stmt == gsi_stmt (*gsi))
 	{
 	  x = build1 (IMAGPART_EXPR, inner_type, unshare_expr (lhs));
-	  gimple_assign_set_lhs (stmt, x);
-	  gimple_assign_set_rhs1 (stmt, i);
+	  gimple_assign_set_lhs (as_a <gassign *> (stmt), x);
+	  gimple_assign_set_rhs1 (as_a <gassign *> (stmt), i);
 	}
       else
 	{
@@ -960,10 +973,10 @@ expand_complex_libcall (gimple_stmt_iterator *gsi, tree ar, tree ai,
   enum machine_mode mode;
   enum built_in_function bcode;
   tree fn, type, lhs;
-  gimple old_stmt;
+  gassign *old_stmt;
   gcall *stmt;
 
-  old_stmt = gsi_stmt (*gsi);
+  old_stmt = as_a <gassign *> (gsi_stmt (*gsi));
   lhs = gimple_assign_lhs (old_stmt);
   type = TREE_TYPE (lhs);
 
@@ -1140,26 +1153,27 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type,
   if (TREE_CODE (compare) != INTEGER_CST)
     {
       edge e;
-      gimple stmt;
+      gassign *stmt1;
+      gcond *stmt2;
       tree cond, tmp;
 
       tmp = create_tmp_var (boolean_type_node, NULL);
-      stmt = gimple_build_assign (tmp, compare);
+      stmt1 = gimple_build_assign (tmp, compare);
       if (gimple_in_ssa_p (cfun))
 	{
-	  tmp = make_ssa_name (tmp,  stmt);
-	  gimple_assign_set_lhs (stmt, tmp);
+	  tmp = make_ssa_name (tmp,  stmt1);
+	  gimple_assign_set_lhs (stmt1, tmp);
 	}
 
-      gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
+      gsi_insert_before (gsi, stmt1, GSI_SAME_STMT);
 
-      cond = fold_build2_loc (gimple_location (stmt),
+      cond = fold_build2_loc (gimple_location (stmt1),
 			  EQ_EXPR, boolean_type_node, tmp, boolean_true_node);
-      stmt = gimple_build_cond_from_tree (cond, NULL_TREE, NULL_TREE);
-      gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
+      stmt2 = gimple_build_cond_from_tree (cond, NULL_TREE, NULL_TREE);
+      gsi_insert_before (gsi, stmt2, GSI_SAME_STMT);
 
       /* Split the original block, and create the TRUE and FALSE blocks.  */
-      e = split_block (gsi_bb (*gsi), stmt);
+      e = split_block (gsi_bb (*gsi), stmt2);
       bb_cond = e->src;
       bb_join = e->dest;
       bb_true = create_empty_bb (bb_cond);
@@ -1409,7 +1423,7 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai,
       break;
 
     case GIMPLE_ASSIGN:
-      type = TREE_TYPE (gimple_assign_lhs (stmt));
+      type = TREE_TYPE (gimple_assign_lhs (as_a <gassign *> (stmt)));
       gimple_assign_set_rhs_from_tree (gsi, fold_convert (type, cc));
       stmt = gsi_stmt (*gsi);
       break;
@@ -1523,30 +1537,32 @@ expand_complex_operations_1 (gimple_stmt_iterator *gsi)
 
 	if (TREE_CODE (type) == COMPLEX_TYPE)
 	  expand_complex_move (gsi, type);
-	else if (is_gimple_assign (stmt)
-		 && (gimple_assign_rhs_code (stmt) == REALPART_EXPR
-		     || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
-		 && TREE_CODE (lhs) == SSA_NAME)
-	  {
-	    rhs = gimple_assign_rhs1 (stmt);
-	    rhs = extract_component (gsi, TREE_OPERAND (rhs, 0),
-		                     gimple_assign_rhs_code (stmt)
+	else if (gassign *assign_stmt = dyn_cast <gassign *> (stmt))
+	  if ((gimple_assign_rhs_code (assign_stmt) == REALPART_EXPR
+	       || gimple_assign_rhs_code (assign_stmt) == IMAGPART_EXPR)
+	      && TREE_CODE (lhs) == SSA_NAME)
+	    {
+	      rhs = gimple_assign_rhs1 (assign_stmt);
+	      rhs = extract_component (gsi, TREE_OPERAND (rhs, 0),
+				       gimple_assign_rhs_code (assign_stmt)
 				       == IMAGPART_EXPR,
-				     false);
-	    gimple_assign_set_rhs_from_tree (gsi, rhs);
-	    stmt = gsi_stmt (*gsi);
-	    update_stmt (stmt);
-	  }
+				       false);
+	      gimple_assign_set_rhs_from_tree (gsi, rhs);
+	      stmt = gsi_stmt (*gsi);
+	      update_stmt (stmt);
+	    }
       }
       return;
     }
 
   /* Extract the components of the two complex values.  Make sure and
      handle the common case of the same value used twice specially.  */
-  if (is_gimple_assign (stmt))
+  if (gassign *assign_stmt = dyn_cast <gassign *> (stmt))
     {
-      ac = gimple_assign_rhs1 (stmt);
-      bc = (gimple_num_ops (stmt) > 2) ? gimple_assign_rhs2 (stmt) : NULL;
+      ac = gimple_assign_rhs1 (assign_stmt);
+      bc = ((gimple_num_ops (stmt) > 2)
+	    ? gimple_assign_rhs2 (assign_stmt)
+	    : NULL);
     }
   /* GIMPLE_CALL can not get here.  */
   else
-- 
1.7.11.7


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]