[gcc(refs/users/marxin/heads/vect_cond_expr-rework-v3)] Implement usage of .VCOND_MASK based on # of operand uses.

Martin Liska marxin@gcc.gnu.org
Tue Mar 24 13:57:15 GMT 2020


https://gcc.gnu.org/g:928855f71923bb4647ec80f12bb20546573e3c7a

commit 928855f71923bb4647ec80f12bb20546573e3c7a
Author: Martin Liska <mliska@suse.cz>
Date:   Tue Mar 24 14:56:10 2020 +0100

    Implement usage of .VCOND_MASK based on # of operand uses.

Diff:
---
 gcc/tree-vect-generic.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 66692d2fb5e..bec9ca41a82 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -2248,6 +2248,7 @@ gimple_expand_vec_cond_expr (gimple_stmt_iterator *gsi)
   machine_mode cmp_op_mode;
   bool unsignedp;
   enum insn_code icode;
+  imm_use_iterator imm_iter;
 
   /* Only consider code == GIMPLE_ASSIGN. */
   gassign *stmt = dyn_cast <gassign *> (gsi_stmt (*gsi));
@@ -2267,10 +2268,31 @@ gimple_expand_vec_cond_expr (gimple_stmt_iterator *gsi)
   gcc_assert (!COMPARISON_CLASS_P (op0));
   if (TREE_CODE (op0) == SSA_NAME)
     {
+      unsigned int used_vec_cond_exprs = 0;
+      gimple *use_stmt;
+      FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, op0)
+	{
+	  gassign *assign = dyn_cast<gassign *> (use_stmt);
+	  if (assign != NULL
+	      && gimple_assign_rhs_code (assign) == VEC_COND_EXPR
+	      && gimple_assign_rhs1 (assign) == op0)
+	    used_vec_cond_exprs++;
+	}
+
       gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
       op0a = gimple_assign_rhs1 (def_stmt);
       op0b = gimple_assign_rhs2 (def_stmt);
       tcode = gimple_assign_rhs_code (def_stmt);
+
+      tree op0a_type = TREE_TYPE (op0a);
+      if (used_vec_cond_exprs >= 2
+	  && (get_vcond_mask_icode (mode, TYPE_MODE (op0a_type))
+	      != CODE_FOR_nothing)
+	  && expand_vec_cmp_expr_p (op0a_type, TREE_TYPE (lhs), tcode))
+	{
+	  /* Keep the SSA name and use vcond_mask.  */
+	  tcode = TREE_CODE (op0);
+	}
     }
   else
     tcode = TREE_CODE (op0);


More information about the Gcc-cvs mailing list