On Sat, 2 Nov 2024, Robin Dapp wrote: > From: Robin Dapp <rd...@ventanamicro.com> > > 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.
This version is OK. Thanks, Richard. > gcc/ChangeLog: > > * tree-if-conv.cc (predicate_load_or_store): Add zero else > operand and comment. > --- > gcc/tree-if-conv.cc | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc > index eb981642bae..f1a1f8fd0d3 100644 > --- a/gcc/tree-if-conv.cc > +++ b/gcc/tree-if-conv.cc > @@ -2555,9 +2555,17 @@ predicate_load_or_store (gimple_stmt_iterator *gsi, > gassign *stmt, tree mask) > ref); > 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 > - = gimple_build_call_internal (IFN_MASK_LOAD, 3, addr, > - ptr, mask); > + = gimple_build_call_internal (IFN_MASK_LOAD, 4, addr, > + ptr, mask, els); > + > gimple_call_set_lhs (new_stmt, lhs); > gimple_set_vuse (new_stmt, gimple_vuse (stmt)); > } > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)