tree-ifcvt: Add zero maskload else value.

When predicating a load we implicitly assume that the else value is
zero.  This matters in case the loaded value is padded (like e.g.
a Bool) and we must ensure that the padding bytes are zero on targets
that don't implicitly zero inactive elements.

A former version of this patch still had this handling in ifcvt but
the latest version defers it to the vectorizer.

gcc/ChangeLog:

	* tree-if-conv.cc (predicate_load_or_store): Add zero else
	operand and comment.
This commit is contained in:
Robin Dapp 2024-08-08 12:54:36 +02:00
parent 8f68d9cb78
commit 6b6bd53619

View File

@ -2555,9 +2555,17 @@ predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask)
ref); ref);
if (TREE_CODE (lhs) == SSA_NAME) if (TREE_CODE (lhs) == SSA_NAME)
{ {
/* Get a zero else value. This might not be what a target actually uses
but we cannot be sure about which vector mode the vectorizer will
choose. Therefore, leave the decision whether we need to force the
inactive elements to zero to the vectorizer. */
tree els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
TREE_TYPE (lhs));
new_stmt new_stmt
= gimple_build_call_internal (IFN_MASK_LOAD, 3, addr, = gimple_build_call_internal (IFN_MASK_LOAD, 4, addr,
ptr, mask); ptr, mask, els);
gimple_call_set_lhs (new_stmt, lhs); gimple_call_set_lhs (new_stmt, lhs);
gimple_set_vuse (new_stmt, gimple_vuse (stmt)); gimple_set_vuse (new_stmt, gimple_vuse (stmt));
} }