]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
vect: Merge loop mask and cond_op mask in fold-left reduction [PR115382].
authorRobin Dapp <rdapp@ventanamicro.com>
Fri, 7 Jun 2024 12:36:41 +0000 (14:36 +0200)
committerRobin Dapp <rdapp@ventanamicro.com>
Tue, 11 Jun 2024 18:05:29 +0000 (20:05 +0200)
Currently we discard the cond-op mask when the loop is fully masked
which causes wrong code in
gcc.dg/vect/vect-cond-reduc-in-order-2-signed-zero.c
when compiled with
-O3 -march=cascadelake --param vect-partial-vector-usage=2.

This patch ANDs both masks.

gcc/ChangeLog:

PR tree-optimization/115382

* tree-vect-loop.cc (vectorize_fold_left_reduction): Use
prepare_vec_mask.
* tree-vect-stmts.cc (check_load_store_for_partial_vectors):
Remove static of prepare_vec_mask.
* tree-vectorizer.h (prepare_vec_mask): Export.

gcc/tree-vect-loop.cc
gcc/tree-vect-stmts.cc
gcc/tree-vectorizer.h

index c471f1564a72f019170f3cfab1270d6bbb70efd2..5b1ad06eca66c46e62ac052b8412d9902198baee 100644 (file)
@@ -7204,7 +7204,15 @@ vectorize_fold_left_reduction (loop_vec_info loop_vinfo,
       tree len = NULL_TREE;
       tree bias = NULL_TREE;
       if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo))
-       mask = vect_get_loop_mask (loop_vinfo, gsi, masks, vec_num, vectype_in, i);
+       {
+         tree loop_mask = vect_get_loop_mask (loop_vinfo, gsi, masks,
+                                              vec_num, vectype_in, i);
+         if (is_cond_op)
+           mask = prepare_vec_mask (loop_vinfo, TREE_TYPE (loop_mask),
+                                    loop_mask, vec_opmask[i], gsi);
+         else
+           mask = loop_mask;
+       }
       else if (is_cond_op)
        mask = vec_opmask[i];
       if (LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo))
index 05a169ecb2dd29e0e588058b132c723dbce5b3d6..831f18253765b6b6f0f3ad1eec8b4adaf38f3043 100644 (file)
@@ -1643,7 +1643,7 @@ check_load_store_for_partial_vectors (loop_vec_info loop_vinfo, tree vectype,
    MASK_TYPE is the type of both masks.  If new statements are needed,
    insert them before GSI.  */
 
-static tree
+tree
 prepare_vec_mask (loop_vec_info loop_vinfo, tree mask_type, tree loop_mask,
                  tree vec_mask, gimple_stmt_iterator *gsi)
 {
index 97ec9c341e7d081d60d930fee1e31429ef97d01a..6bb0f5c3a56f6e8afcb11b2799c75d0f8f4c4377 100644 (file)
@@ -2508,6 +2508,9 @@ extern void vect_free_slp_tree (slp_tree);
 extern bool compatible_calls_p (gcall *, gcall *);
 extern int vect_slp_child_index_for_operand (const gimple *, int op, bool);
 
+extern tree prepare_vec_mask (loop_vec_info, tree, tree, tree,
+                             gimple_stmt_iterator *);
+
 /* In tree-vect-patterns.cc.  */
 extern void
 vect_mark_pattern_stmts (vec_info *, stmt_vec_info, gimple *, tree);