From 4c0283b9ad75b128b79c507d78d678123fe9f471 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 12 May 2020 09:01:13 +0100 Subject: [PATCH] tree-vect-generic: Fix bitfield widths [PR94980 3/3] This third patch of three actually fixes the PR. We were using 8-bit BIT_FIELD_REFs to access single-bit elements, and multiplying the vector index by 8 bits rather than 1 bit. 2020-05-12 Richard Sandiford gcc/ PR tree-optimization/94980 * tree-vect-generic.c (expand_vector_comparison): Use vector_element_bits_tree to get the element size in bits, rather than using TYPE_SIZE. (expand_vector_condition, vector_element): Likewise. gcc/testsuite/ PR tree-optimization/94980 * gcc.target/i386/pr94980.c: New test. --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr94980.c | 10 ++++++++++ gcc/tree-vect-generic.c | 8 ++++---- 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr94980.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcaad02166c..751b71d5710 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-05-12 Richard Sandiford + + PR tree-optimization/94980 + * tree-vect-generic.c (expand_vector_comparison): Use + vector_element_bits_tree to get the element size in bits, + rather than using TYPE_SIZE. + (expand_vector_condition, vector_element): Likewise. + 2020-05-12 Richard Sandiford PR tree-optimization/94980 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5064e684b6b..dc7eb3141a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-12 Richard Sandiford + + PR tree-optimization/94980 + * gcc.target/i386/pr94980.c: New test. + 2020-05-11 Kelvin Nilsen * gcc.target/powerpc/vec-clzm-0.c: Rename to... diff --git a/gcc/testsuite/gcc.target/i386/pr94980.c b/gcc/testsuite/gcc.target/i386/pr94980.c new file mode 100644 index 00000000000..488f94abec9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr94980.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mavx512vl" } */ + +int __attribute__((__vector_size__(16))) v; + +void +foo(void) +{ + 0 <= (0 != v) >= 0; +} diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index adea9337a97..a7fe83da0e3 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -390,7 +390,7 @@ expand_vector_comparison (gimple_stmt_iterator *gsi, tree type, tree op0, (TREE_TYPE (type))))) { tree inner_type = TREE_TYPE (TREE_TYPE (op0)); - tree part_width = TYPE_SIZE (inner_type); + tree part_width = vector_element_bits_tree (TREE_TYPE (op0)); tree index = bitsize_int (0); int nunits = nunits_for_known_piecewise_op (TREE_TYPE (op0)); int prec = GET_MODE_PRECISION (SCALAR_TYPE_MODE (type)); @@ -944,9 +944,9 @@ expand_vector_condition (gimple_stmt_iterator *gsi) vec *v; tree constr; tree inner_type = TREE_TYPE (type); + tree width = vector_element_bits_tree (type); tree cond_type = TREE_TYPE (TREE_TYPE (a)); tree comp_inner_type = cond_type; - tree width = TYPE_SIZE (inner_type); tree index = bitsize_int (0); tree comp_width = width; tree comp_index = index; @@ -960,7 +960,7 @@ expand_vector_condition (gimple_stmt_iterator *gsi) a1 = TREE_OPERAND (a, 0); a2 = TREE_OPERAND (a, 1); comp_inner_type = TREE_TYPE (TREE_TYPE (a1)); - comp_width = TYPE_SIZE (comp_inner_type); + comp_width = vector_element_bits_tree (TREE_TYPE (a1)); } if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), TREE_CODE (a))) @@ -1333,7 +1333,7 @@ vector_element (gimple_stmt_iterator *gsi, tree vect, tree idx, tree *ptmpvec) } else { - tree size = TYPE_SIZE (vect_elt_type); + tree size = vector_element_bits_tree (vect_type); tree pos = fold_build2 (MULT_EXPR, bitsizetype, bitsize_int (index), size); return fold_build3 (BIT_FIELD_REF, vect_elt_type, vect, size, pos); -- 2.30.2