diff options
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr101159.c | 10 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.c | 8 |
2 files changed, 14 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr101159.c b/gcc/testsuite/gcc.c-torture/compile/pr101159.c new file mode 100644 index 0000000..81b2d2c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr101159.c @@ -0,0 +1,10 @@ +/* PR tree-optimization/101159 */ + +unsigned long a; +long b; + +void +foo (void) +{ + a += __builtin_popcountl (b); +} diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index d0a5c71..b2e7fc2 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -1300,7 +1300,7 @@ vect_recog_widen_minus_pattern (vec_info *vinfo, stmt_vec_info last_stmt_info, TYPE1 B; UTYPE2 temp_in; TYPE3 temp_out; - temp_in = (TYPE2)A; + temp_in = (UTYPE2)A; temp_out = __builtin_popcount{,l,ll} (temp_in); B = (TYPE1) temp_out; @@ -1372,8 +1372,8 @@ vect_recog_popcount_pattern (vec_info *vinfo, if (!rhs_origin) return NULL; - /* Input and outout of .POPCOUNT should be same-precision integer. - Also A should be unsigned or same presion as temp_in, + /* Input and output of .POPCOUNT should be same-precision integer. + Also A should be unsigned or same precision as temp_in, otherwise there would be sign_extend from A to temp_in. */ if (TYPE_PRECISION (unprom_diff.type) != TYPE_PRECISION (lhs_type) || (!TYPE_UNSIGNED (unprom_diff.type) @@ -1384,7 +1384,7 @@ vect_recog_popcount_pattern (vec_info *vinfo, vect_pattern_detected ("vec_regcog_popcount_pattern", popcount_stmt); vec_type = get_vectype_for_scalar_type (vinfo, lhs_type); - /* Do it only the backend existed popcount<vector_mode>2. */ + /* Do it only if the backend has popcount<vector_mode>2 pattern. */ if (!vec_type || !direct_internal_fn_supported_p (IFN_POPCOUNT, vec_type, OPTIMIZE_FOR_SPEED)) |