Hi,

r17-71-g3f6d37193c7987ee9362c073dd5da6f7419c87b3 adds the following
assert in vect_create_new_slp_node:

  gcc_assert (code == ERROR_MARK || code == VEC_PERM_EXPR);

which seems to suggest that SLP nodes should only ever have one of these
two codes.

Recently I have been studying how the recognition of complex add with
rotate works.  There is code in vect_build_slp_tree_2 which, in the
two_operators case, builds synthetic {PLUS,MINUS}_EXPR nodes which are
then packed together with a permutation.  This is later recognized by
the complex add slp pattern.

I noticed that this code sets the code fields of the synthetic nodes to
the relevant tree codes, e.g. {PLUS,MINUS}_EXPR, but this isn't actually
needed, since the pattern code just looks at the code of the
representative stmt for non-permutation nodes.  It's also at odds with
the recently-added assert above.

This patch therefore drops setting the codes on those nodes, and instead
leaves them set to ERROR_MARK (meaning that consumers should look at the
representative, as the patterns currently do).  It is intended to be a
non-functional cleanup.

Bootstrapped/regtested on aarch64-linux-gnu, arm-linux-gnueabihf, and
x86_64-linux-gnu.  OK for trunk?

Thanks,
Alex

gcc/ChangeLog:

        * tree-vect-slp.cc (vect_build_slp_tree_2): In the two_operators
        case, avoid setting the code field on the plus/minus nodes.
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 12b1abe3d78..142037ed008 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -3380,7 +3380,6 @@ fail:
       SLP_TREE_CHILDREN (node).quick_push (two);
       SLP_TREE_REPRESENTATIVE (node) = NULL;
       enum tree_code code0 = ERROR_MARK;
-      enum tree_code ocode = ERROR_MARK;
       if (gassign *stmt = dyn_cast <gassign *> (stmts[0]->stmt))
        code0 = gimple_assign_rhs_code (stmt);
       stmt_vec_info ostmt_info;
@@ -3388,28 +3387,17 @@ fail:
       FOR_EACH_VEC_ELT (stmts, i, ostmt_info)
        {
          int op = 0;
-         if (gassign *ostmt = dyn_cast <gassign *> (ostmt_info->stmt))
+         gassign *ostmt = dyn_cast<gassign *> (ostmt_info->stmt);
+         if ((ostmt && gimple_assign_rhs_code (ostmt) != code0)
+             || (!ostmt
+                 && gimple_call_combined_fn (stmts[0]->stmt)
+                    != gimple_call_combined_fn (ostmt_info->stmt)))
            {
-             if (gimple_assign_rhs_code (ostmt) != code0)
-               {
-                 ocode = gimple_assign_rhs_code (ostmt);
-                 op = 1;
-                 j = i;
-               }
-           }
-         else
-           {
-             if (gimple_call_combined_fn (stmts[0]->stmt)
-                 != gimple_call_combined_fn (ostmt_info->stmt))
-               {
-                 op = 1;
-                 j = i;
-               }
+             op = 1;
+             j = i;
            }
          SLP_TREE_LANE_PERMUTATION (node).safe_push (std::make_pair (op, i));
        }
-      SLP_TREE_CODE (one) = code0;
-      SLP_TREE_CODE (two) = ocode;
       SLP_TREE_LANES (one) = stmts.length ();
       SLP_TREE_LANES (two) = stmts.length ();
       SLP_TREE_REPRESENTATIVE (one) = stmts[0];

Reply via email to