[PATCH] SCCVN TLC

2015-10-02 Thread Richard Biener

This removes some more dead code and refactors visit_use a bit.

Bootstrapped & tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-10-01  Richard Biener  

* tree-ssa-sccvn.c (has_VN_INFO): New function.
(free_scc_vn): Use it.
(visit_use): Remove dead code and refactor to use gassign
and use less indentation.

Index: gcc/tree-ssa-sccvn.c
===
--- gcc/tree-ssa-sccvn.c(revision 228320)
+++ gcc/tree-ssa-sccvn.c(working copy)
@@ -365,6 +365,16 @@ static vec sccstack;
 static vec vn_ssa_aux_table;
 static struct obstack vn_ssa_aux_obstack;
 
+/* Return whether there is value numbering information for a given SSA name.  
*/
+
+bool
+has_VN_INFO (tree name)
+{
+  if (SSA_NAME_VERSION (name) < vn_ssa_aux_table.length ())
+return vn_ssa_aux_table[SSA_NAME_VERSION (name)] != NULL;
+  return false;
+}
+
 /* Return the value numbering information for a given SSA name.  */
 
 vn_ssa_aux_t
@@ -3316,34 +3371,118 @@ visit_use (tree use)
   /* Handle uninitialized uses.  */
   if (SSA_NAME_IS_DEFAULT_DEF (use))
 changed = set_ssa_val_to (use, use);
-  else
-{
-  if (gimple_code (stmt) == GIMPLE_PHI)
-   changed = visit_phi (stmt);
-  else if (gimple_has_volatile_ops (stmt))
-   changed = defs_to_varying (stmt);
-  else if (is_gimple_assign (stmt))
-   {
- enum tree_code code = gimple_assign_rhs_code (stmt);
- tree lhs = gimple_assign_lhs (stmt);
- tree rhs1 = gimple_assign_rhs1 (stmt);
- tree simplified;
-
- /* Shortcut for copies. Simplifying copies is pointless,
-since we copy the expression and value they represent.  */
- if (code == SSA_NAME
- && TREE_CODE (lhs) == SSA_NAME)
+  else if (gimple_code (stmt) == GIMPLE_PHI)
+changed = visit_phi (stmt);
+  else if (gimple_has_volatile_ops (stmt))
+changed = defs_to_varying (stmt);
+  else if (gassign *ass = dyn_cast  (stmt))
+{
+  enum tree_code code = gimple_assign_rhs_code (ass);
+  tree lhs = gimple_assign_lhs (ass);
+  tree rhs1 = gimple_assign_rhs1 (ass);
+  tree simplified;
+
+  /* Shortcut for copies. Simplifying copies is pointless,
+since we copy the expression and value they represent.  */
+  if (code == SSA_NAME
+ && TREE_CODE (lhs) == SSA_NAME)
+   {
+ changed = visit_copy (lhs, rhs1);
+ goto done;
+   }
+  simplified = try_to_simplify (ass);
+  if (simplified)
+   {
+ if (dump_file && (dump_flags & TDF_DETAILS))
{
- changed = visit_copy (lhs, rhs1);
- goto done;
+ fprintf (dump_file, "RHS ");
+ print_gimple_expr (dump_file, ass, 0, 0);
+ fprintf (dump_file, " simplified to ");
+ print_generic_expr (dump_file, simplified, 0);
+ fprintf (dump_file, "\n");
+   }
+   }
+  /* Setting value numbers to constants will occasionally
+screw up phi congruence because constants are not
+uniquely associated with a single ssa name that can be
+looked up.  */
+  if (simplified
+ && is_gimple_min_invariant (simplified)
+ && TREE_CODE (lhs) == SSA_NAME)
+   {
+ changed = set_ssa_val_to (lhs, simplified);
+ goto done;
+   }
+  else if (simplified
+  && TREE_CODE (simplified) == SSA_NAME
+  && TREE_CODE (lhs) == SSA_NAME)
+   {
+ changed = visit_copy (lhs, simplified);
+ goto done;
+   }
+
+  if ((TREE_CODE (lhs) == SSA_NAME
+  /* We can substitute SSA_NAMEs that are live over
+ abnormal edges with their constant value.  */
+  && !(gimple_assign_copy_p (ass)
+   && is_gimple_min_invariant (rhs1))
+  && !(simplified
+   && is_gimple_min_invariant (simplified))
+  && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+ /* Stores or copies from SSA_NAMEs that are live over
+abnormal edges are a problem.  */
+ || (code == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1)))
+   changed = defs_to_varying (ass);
+  else if (REFERENCE_CLASS_P (lhs)
+  || DECL_P (lhs))
+   changed = visit_reference_op_store (lhs, rhs1, ass);
+  else if (TREE_CODE (lhs) == SSA_NAME)
+   {
+ if ((gimple_assign_copy_p (ass)
+  && is_gimple_min_invariant (rhs1))
+ || (simplified
+ && is_gimple_min_invariant (simplified)))
+   {
+ if (simplified)
+   changed = set_ssa_val_to (lhs, simplified);
+ else
+   changed = set_ssa_val_to (lhs, rhs1);
+   }
+ else
+   {
+ /* Visit the original statement.  */
+ switch (vn_get_stmt_kind (ass))
+   {
+ 

[PATCH] SCCVN TLC

2011-09-06 Thread Richard Guenther

Some cleanups before I touch this code.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-09-06  Richard Guenther  rguent...@suse.de

* tree-ssa-sccvn.c (visit_use): CSE stmt pieces and simplify
matching.

Index: gcc/tree-ssa-sccvn.c
===
--- gcc/tree-ssa-sccvn.c(revision 178570)
+++ gcc/tree-ssa-sccvn.c(working copy)
@@ -3043,16 +3043,17 @@ visit_use (tree use)
changed = defs_to_varying (stmt);
   else if (is_gimple_assign (stmt))
{
+ enum tree_code code = gimple_assign_rhs_code (stmt);
  tree lhs = gimple_assign_lhs (stmt);
+ tree rhs1 = gimple_assign_rhs1 (stmt);
  tree simplified;
 
  /* Shortcut for copies. Simplifying copies is pointless,
 since we copy the expression and value they represent.  */
- if (gimple_assign_copy_p (stmt)
-  TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
+ if (code == SSA_NAME
   TREE_CODE (lhs) == SSA_NAME)
{
- changed = visit_copy (lhs, gimple_assign_rhs1 (stmt));
+ changed = visit_copy (lhs, rhs1);
  goto done;
}
  simplified = try_to_simplify (stmt);
@@ -3119,24 +3120,22 @@ visit_use (tree use)
   /* We can substitute SSA_NAMEs that are live over
  abnormal edges with their constant value.  */
!(gimple_assign_copy_p (stmt)
-is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
+is_gimple_min_invariant (rhs1))
!(simplified
 is_gimple_min_invariant (simplified))
SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
  /* Stores or copies from SSA_NAMEs that are live over
 abnormal edges are a problem.  */
- || (gimple_assign_single_p (stmt)
-  TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
-  SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 
(stmt
+ || (code == SSA_NAME
+  SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1)))
changed = defs_to_varying (stmt);
- else if (REFERENCE_CLASS_P (lhs) || DECL_P (lhs))
-   {
- changed = visit_reference_op_store (lhs, gimple_assign_rhs1 
(stmt), stmt);
-   }
+ else if (REFERENCE_CLASS_P (lhs)
+  || DECL_P (lhs))
+   changed = visit_reference_op_store (lhs, rhs1, stmt);
  else if (TREE_CODE (lhs) == SSA_NAME)
{
  if ((gimple_assign_copy_p (stmt)
-   is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
+   is_gimple_min_invariant (rhs1))
  || (simplified
   is_gimple_min_invariant (simplified)))
{
@@ -3144,11 +3143,11 @@ visit_use (tree use)
  if (simplified)
changed = set_ssa_val_to (lhs, simplified);
  else
-   changed = set_ssa_val_to (lhs, gimple_assign_rhs1 (stmt));
+   changed = set_ssa_val_to (lhs, rhs1);
}
  else
{
- switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
+ switch (get_gimple_rhs_class (code))
{
case GIMPLE_UNARY_RHS:
case GIMPLE_BINARY_RHS:
@@ -3156,25 +3155,24 @@ visit_use (tree use)
  changed = visit_nary_op (lhs, stmt);
  break;
case GIMPLE_SINGLE_RHS:
- switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
+ switch (TREE_CODE_CLASS (code))
{
case tcc_reference:
  /* VOP-less references can go through unary case.  */
- if ((gimple_assign_rhs_code (stmt) == REALPART_EXPR
-  || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR
-  || gimple_assign_rhs_code (stmt) == 
VIEW_CONVERT_EXPR)
-  TREE_CODE (TREE_OPERAND (gimple_assign_rhs1 
(stmt), 0)) == SSA_NAME)
+ if ((code == REALPART_EXPR
+  || code == IMAGPART_EXPR
+  || code == VIEW_CONVERT_EXPR)
+  TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
{
  changed = visit_nary_op (lhs, stmt);
  break;
}
  /* Fallthrough.  */
case tcc_declaration:
- changed = visit_reference_op_load
- (lhs, gimple_assign_rhs1 (stmt), stmt);
+