https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115406
--- Comment #7 from Hongtao Liu <liuhongt at gcc dot gnu.org> --- > > BTW, when assign -1 to vector(1) <signed-boolean:8>, should the upper bit be > cleared? Look like only 1 element boolean vector is cleared, but not > vector(2) <signed-boolean:8>. > If the upper bits are not cleared, both 2 cases are equal. diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index 710d697c021..0f045f851d1 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -8077,7 +8077,7 @@ native_encode_vector_part (const_tree expr, unsigned char *ptr, int len, { tree itype = TREE_TYPE (TREE_TYPE (expr)); if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (expr)) - && TYPE_PRECISION (itype) <= BITS_PER_UNIT) + && TYPE_PRECISION (itype) < BITS_PER_UNIT) { /* This is the only case in which elements can be smaller than a byte. Element 0 is always in the lsb of the containing byte. */ Can fix this. It looks like it supposed to handle for itype *less than* but not *less equal* BITS_PER_UNIT?