[gcc(refs/users/marxin/heads/vect_cond_expr-rework)] Force SSA_NAMEs in VEC_COND_EXPR after vector lowering.

Martin Liska marxin@gcc.gnu.org
Wed Mar 4 10:20:00 GMT 2020


https://gcc.gnu.org/g:d220641bba66b266e82d8c150ee9daeefe2a093e

commit d220641bba66b266e82d8c150ee9daeefe2a093e
Author: Martin Liska <mliska@suse.cz>
Date:   Tue Mar 3 14:43:03 2020 +0100

    Force SSA_NAMEs in VEC_COND_EXPR after vector lowering.

Diff:
---
 gcc/internal-fn.c       | 38 ++++++++++++++++++++++++++++++++++++++
 gcc/internal-fn.def     |  6 ++++++
 gcc/optabs.c            |  2 ++
 gcc/tree-ssa-forwprop.c |  6 ++++++
 gcc/tree-vect-generic.c | 11 ++++++++++-
 5 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index 52d1638..f323e2b 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -2584,6 +2584,44 @@ expand_VEC_CONVERT (internal_fn, gcall *)
   gcc_unreachable ();
 }
 
+// TODO: write comments
+
+static void
+expand_VEC_COND_LT (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
+static void
+expand_VEC_COND_LE (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
+static void
+expand_VEC_COND_GT (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
+static void
+expand_VEC_COND_GE (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
+static void
+expand_VEC_COND_EQ (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
+static void
+expand_VEC_COND_NE (internal_fn, gcall *)
+{
+  gcc_unreachable ();
+}
+
 /* Expand the IFN_UNIQUE function according to its first argument.  */
 
 static void
diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def
index 1d190d4..07a6d95 100644
--- a/gcc/internal-fn.def
+++ b/gcc/internal-fn.def
@@ -318,6 +318,12 @@ DEF_INTERNAL_FN (MUL_OVERFLOW, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (TSAN_FUNC_EXIT, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW, NULL)
 DEF_INTERNAL_FN (VA_ARG, ECF_NOTHROW | ECF_LEAF, NULL)
 DEF_INTERNAL_FN (VEC_CONVERT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
+DEF_INTERNAL_FN (VEC_COND_LT, ECF_LEAF, NULL)
+DEF_INTERNAL_FN (VEC_COND_LE, ECF_LEAF, NULL)
+DEF_INTERNAL_FN (VEC_COND_GT, ECF_LEAF, NULL)
+DEF_INTERNAL_FN (VEC_COND_GE, ECF_LEAF, NULL)
+DEF_INTERNAL_FN (VEC_COND_EQ, ECF_LEAF, NULL)
+DEF_INTERNAL_FN (VEC_COND_NE, ECF_LEAF, NULL)
 
 /* An unduplicable, uncombinable function.  Generally used to preserve
    a CFG property in the face of jump threading, tail merging or
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 3f47dee6..2cc6a9f 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5852,6 +5852,8 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
   tree op0a, op0b;
   enum tree_code tcode;
 
+  gcc_assert (TREE_CODE (op0) == SSA_NAME || TREE_CODE (op0) == VECTOR_CST);
+
   if (COMPARISON_CLASS_P (op0))
     {
       op0a = TREE_OPERAND (op0, 0);
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index f65216d..43e745a 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -3055,6 +3055,12 @@ pass_forwprop::execute (function *fun)
 		    if (code == COND_EXPR
 			|| code == VEC_COND_EXPR)
 		      {
+			/* Do not propagate into VEC_COND_EXPRs after they are
+			   vector lowering pass.  */
+			if (code == VEC_COND_EXPR
+			    && (fun->curr_properties & PROP_gimple_lvec))
+			  break;
+
 			/* In this case the entire COND_EXPR is in rhs1. */
 			if (forward_propagate_into_cond (&gsi))
 			  {
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 2f6fd5e..deff523 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -944,7 +944,16 @@ expand_vector_condition (gimple_stmt_iterator *gsi)
     }
 
   if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), TREE_CODE (a)))
-    return;
+    {
+      if (a_is_comparison)
+	{
+	  a = gimplify_build2 (gsi, TREE_CODE (a), TREE_TYPE (a), a1, a2);
+	  gimple_assign_set_rhs1 (stmt, a);
+	  update_stmt (stmt);
+	  return;
+	}
+      gcc_assert (TREE_CODE (a) == SSA_NAME);
+    }
 
   /* Handle vector boolean types with bitmasks.  If there is a comparison
      and we can expand the comparison into the vector boolean bitmask,



More information about the Gcc-cvs mailing list