[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