[I ran gcov over the DOM pass + scoped tables to see if there was any
low hanging fruit to be removed.  This hardly anything, but this fell
out.]

Clean up some places where we're scanning for constants on the LHS of
a binary operation.  This never gets tickled as gimple keeps constants
on the RHS.  Don't touch the MINUS_EXPR case, as substraction is not
commutative.

Likewise for record_edge_info where we have an arm for a conditional
with the constant on the left, with a comment saying copy propagation
can produce one.  However, fold_stmt canonicalizes the operand order
of a GIMPLE_COND, so by the time record_edge_info gets it, the
constant is on the right.

Assembly is identical with and without this change over a corpus of
.ii files from a stage1 bootstrap and over the LAPACK Fortran sources,
and gcov shows the removed code never executes over those files nor
the C, C++ and Fortran testsuites.

OK?

gcc/ChangeLog:

        * tree-ssa-dom.cc (edge_info::derive_equivalences): Remove the
        constant-first arms of the PLUS_EXPR and EQ_EXPR cases.
        (record_edge_info): Remove the arm for a constant first operand.
---
 gcc/tree-ssa-dom.cc | 48 +++++++--------------------------------------
 1 file changed, 7 insertions(+), 41 deletions(-)

diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
index 1470d65f4e3..26c1d8dc120 100644
--- a/gcc/tree-ssa-dom.cc
+++ b/gcc/tree-ssa-dom.cc
@@ -237,16 +237,10 @@ edge_info::derive_equivalences (tree name, tree value, 
int recursion_limit)
            tree rhs1 = gimple_assign_rhs1 (def_stmt);
            tree rhs2 = gimple_assign_rhs2 (def_stmt);
 
-           /* If either argument is a constant, then we can compute
-              a constant value for the nonconstant argument.  */
-           if (TREE_CODE (rhs1) == INTEGER_CST
-               && TREE_CODE (rhs2) == SSA_NAME)
-             derive_equivalences (rhs2,
-                                  fold_binary (MINUS_EXPR, TREE_TYPE (rhs1),
-                                               value, rhs1),
-                                  recursion_limit - 1);
-           else if (TREE_CODE (rhs2) == INTEGER_CST
-                    && TREE_CODE (rhs1) == SSA_NAME)
+           /* If the second argument is a constant, then we can compute
+              a constant value for the first one.  */
+           if (TREE_CODE (rhs2) == INTEGER_CST
+               && TREE_CODE (rhs1) == SSA_NAME)
              derive_equivalences (rhs1,
                                   fold_binary (MINUS_EXPR, TREE_TYPE (rhs1),
                                                value, rhs2),
@@ -296,14 +290,12 @@ edge_info::derive_equivalences (tree name, tree value, 
int recursion_limit)
                tree rhs1 = gimple_assign_rhs1 (def_stmt);
                tree rhs2 = gimple_assign_rhs2 (def_stmt);
 
-               /* If either argument is a constant, then record the
-                  other argument as being the same as that constant.
+               /* If the second argument is a constant, then record the
+                  first argument as being the same as that constant.
 
                   If neither operand is a constant, then we have a
                   conditional name == name equivalence.  */
-               if (TREE_CODE (rhs1) == INTEGER_CST)
-                 derive_equivalences (rhs2, rhs1, recursion_limit - 1);
-               else if (TREE_CODE (rhs2) == INTEGER_CST)
+               if (TREE_CODE (rhs2) == INTEGER_CST)
                  derive_equivalences (rhs1, rhs2, recursion_limit - 1);
              }
            else
@@ -538,32 +530,6 @@ record_edge_info (basic_block bb)
                                                   ? false_val : true_val));
                 }
             }
-         /* This can show up in the IL as a result of copy propagation
-            it will eventually be canonicalized, but we have to cope
-            with this case within the pass.  */
-          else if (is_gimple_min_invariant (op0)
-                   && TREE_CODE (op1) == SSA_NAME)
-            {
-              tree cond = build2 (code, boolean_type_node, op0, op1);
-              tree inverted = invert_truthvalue_loc (loc, cond);
-             bool can_infer_simple_equiv
-               = !(HONOR_SIGNED_ZEROS (op0) && real_maybe_zerop (op0))
-                 && !DECIMAL_FLOAT_MODE_P (element_mode (TREE_TYPE (op0)));
-             class edge_info *edge_info;
-
-             edge_info = new class edge_info (true_edge);
-              record_conditions (&edge_info->cond_equivalences, cond, 
inverted);
-
-              if (can_infer_simple_equiv && code == EQ_EXPR)
-               edge_info->record_simple_equiv (op1, op0);
-
-             edge_info = new class edge_info (false_edge);
-              record_conditions (&edge_info->cond_equivalences, inverted, 
cond);
-
-              if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
-               edge_info->record_simple_equiv (op1, op0);
-            }
-
           else if (TREE_CODE (op0) == SSA_NAME
                    && (TREE_CODE (op1) == SSA_NAME
                        || is_gimple_min_invariant (op1)))
-- 
2.53.0

Reply via email to