]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ifcvt: Add zero maskload else value.
authorRobin Dapp <rdapp@ventanamicro.com>
Thu, 8 Aug 2024 10:54:36 +0000 (12:54 +0200)
committerRobin Dapp <rdapp@ventanamicro.com>
Mon, 18 Nov 2024 10:48:41 +0000 (11:48 +0100)
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.

gcc/tree-if-conv.cc

index eb981642bae1f3c340f9fd911dfcdd7c2134befc..f1a1f8fd0d3513f6e0bbe9090e04ccd6fc98344f 100644 (file)
@@ -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));
     }