[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