aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-patterns.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-vect-patterns.cc')
-rw-r--r--gcc/tree-vect-patterns.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 555986b..af64cb8 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -1914,6 +1914,9 @@ vect_recog_ctz_ffs_pattern (vec_info *vinfo, stmt_vec_info stmt_vinfo,
&& val_new == prec)
|| (ifnnew == IFN_POPCOUNT && ifn == IFN_CTZ))
{
+ if (vect_is_reduction (stmt_vinfo))
+ return NULL;
+
/* .CTZ (X) = PREC - .CLZ ((X - 1) & ~X)
.CTZ (X) = .POPCOUNT ((X - 1) & ~X). */
if (ifnnew == IFN_CLZ)
@@ -1952,6 +1955,9 @@ vect_recog_ctz_ffs_pattern (vec_info *vinfo, stmt_vec_info stmt_vinfo,
}
else if (ifnnew == IFN_CLZ)
{
+ if (vect_is_reduction (stmt_vinfo))
+ return NULL;
+
/* .CTZ (X) = (PREC - 1) - .CLZ (X & -X)
.FFS (X) = PREC - .CLZ (X & -X). */
sub = prec - (ifn == IFN_CTZ);
@@ -1971,6 +1977,9 @@ vect_recog_ctz_ffs_pattern (vec_info *vinfo, stmt_vec_info stmt_vinfo,
}
else if (ifnnew == IFN_POPCOUNT)
{
+ if (vect_is_reduction (stmt_vinfo))
+ return NULL;
+
/* .CTZ (X) = PREC - .POPCOUNT (X | -X)
.FFS (X) = (PREC + 1) - .POPCOUNT (X | -X). */
sub = prec + (ifn == IFN_FFS);
@@ -1993,6 +2002,11 @@ vect_recog_ctz_ffs_pattern (vec_info *vinfo, stmt_vec_info stmt_vinfo,
/* .FFS (X) = .CTZ (X) + 1. */
add = 1;
val_cmp++;
+
+ if (vect_is_reduction (stmt_vinfo)
+ && defined_at_zero
+ && (!defined_at_zero_new || val != val_cmp))
+ return NULL;
}
/* Create B = .IFNNEW (A). */