mirror of git://gcc.gnu.org/git/gcc.git
match.pd: Add missing type check to reduc(ctor) pattern [PR121772]
In this PR we have a reduction of a vector constructor, where the type of the constructor is int16x8_t and the elements are int16x4_t; i.e. it is representing a concatenation of two vectors. This triggers a match.pd pattern which looks like it was written to handle reductions of vector constructors where the elements of the ctor are scalars, not vectors. There is no type check to enforce this property, which leads to the pattern replacing a reduction to scalar with an int16x4_t vector in this case, which of course is a type error, leading to an invalid GIMPLE ICE. This patch adds a type check to the pattern, only going ahead with the transformation if the element type of the ctor matches that of the reduction. gcc/ChangeLog: PR tree-optimization/121772 * match.pd: Add type check to reduc(ctor) pattern. gcc/testsuite/ChangeLog: PR tree-optimization/121772 * gcc.target/aarch64/torture/pr121772.c: New test.
This commit is contained in:
parent
45f605a74f
commit
a7a9b7badc
|
@ -11085,6 +11085,7 @@ and,
|
||||||
? gimple_assign_rhs1 (SSA_NAME_DEF_STMT (@0)) : @0);
|
? gimple_assign_rhs1 (SSA_NAME_DEF_STMT (@0)) : @0);
|
||||||
tree elt = ctor_single_nonzero_element (ctor); }
|
tree elt = ctor_single_nonzero_element (ctor); }
|
||||||
(if (elt
|
(if (elt
|
||||||
|
&& types_match (type, TREE_TYPE (elt))
|
||||||
&& !HONOR_SNANS (type)
|
&& !HONOR_SNANS (type)
|
||||||
&& !HONOR_SIGNED_ZEROS (type))
|
&& !HONOR_SIGNED_ZEROS (type))
|
||||||
{ elt; }))))
|
{ elt; }))))
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int16_t f(int16x4_t b) {
|
||||||
|
return vaddvq_s16(vcombine_s16(b, vdup_n_s16 (0)));
|
||||||
|
}
|
Loading…
Reference in New Issue