[PATCH] SCCVN TLC
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
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); +