This simplifies vector_element_bits further, avoiding any mode dependence and instead relying on boolean vector construction to populate element precision accordingly.
Bootstrapped and tested on x86_64-unknown-linux-gnu (also with AVX512 with the help of SDE), pushed. 2021-01-25 Richard Biener <rguent...@suse.de> PR middle-end/98807 * tree.c (vector_element_bits): Always use precision of the element type for boolean vectors. * gcc.dg/pr98807.c: New testcase. --- gcc/testsuite/gcc.dg/pr98807.c | 35 ++++++++++++++++++++++++++++++++++ gcc/tree.c | 8 +------- 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr98807.c diff --git a/gcc/testsuite/gcc.dg/pr98807.c b/gcc/testsuite/gcc.dg/pr98807.c new file mode 100644 index 00000000000..eb8a8d1c23d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr98807.c @@ -0,0 +1,35 @@ +/* { dg-do run } */ +/* { dg-require-effective-target stdint_types } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-mno-sse2" { target x86_64-*-* i?86-*-* } } */ + +#include <stdint.h> + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef u64 __attribute__((__vector_size__ (16))) v128u64; +u16 foo0_u16_0; +v128u64 foo0_v64u32_0; +u64 foo0_u64_0; +v128u64 foo0_v128u64_2; + +v128u64 +foo0 (u8 u8_0, v128u64 v128u64_0) +{ + u32 u32_1 = u8_0 || (0, 0); + foo0_v128u64_2 - u8_0; + foo0_u16_0 |= foo0_u64_0 && u8_0 > foo0_u64_0 <= u32_1; + v128u64 v128u64_4 = v128u64_0 >= u8_0; + return v128u64_4 + foo0_v64u32_0; +} + +int +main () +{ + v128u64 x = foo0 (3, (v128u64) { 0, 12 }); + if (x[0] != 0) __builtin_abort(); + if (x[1] != 0xffffffffffffffff) __builtin_abort(); + return 0; +} diff --git a/gcc/tree.c b/gcc/tree.c index 87862be9273..287e5001dc3 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -14027,13 +14027,7 @@ vector_element_bits (const_tree type) { gcc_checking_assert (VECTOR_TYPE_P (type)); if (VECTOR_BOOLEAN_TYPE_P (type)) - { - if (SCALAR_INT_MODE_P (TYPE_MODE (type))) - return 1; - else - return vector_element_size (tree_to_poly_uint64 (TYPE_SIZE (type)), - TYPE_VECTOR_SUBPARTS (type)); - } + return TYPE_PRECISION (TREE_TYPE (type)); return tree_to_uhwi (TYPE_SIZE (TREE_TYPE (type))); } -- 2.26.2