aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-05-12 09:01:13 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2020-05-12 09:01:13 +0100
commit4c0283b9ad75b128b79c507d78d678123fe9f471 (patch)
tree577ba5e88c800118e7a7ebdf085ad2639c61ffe4
parent14605b6bd8c37fffd8065c5c3fe6b1b9d7b2a294 (diff)
downloadgcc-4c0283b9ad75b128b79c507d78d678123fe9f471.zip
gcc-4c0283b9ad75b128b79c507d78d678123fe9f471.tar.gz
gcc-4c0283b9ad75b128b79c507d78d678123fe9f471.tar.bz2
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 <richard.sandiford@arm.com> 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.
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr94980.c10
-rw-r--r--gcc/tree-vect-generic.c8
4 files changed, 27 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bcaad02..751b71d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,14 @@
2020-05-12 Richard Sandiford <richard.sandiford@arm.com>
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 <richard.sandiford@arm.com>
+
+ PR tree-optimization/94980
* tree-vect-generic.c (build_replicated_const): Take the number
of bits as a parameter, instead of the type of the elements.
(do_plus_minus): Update accordingly, using vector_element_bits
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5064e68..dc7eb31 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-12 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/94980
+ * gcc.target/i386/pr94980.c: New test.
+
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
* 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 0000000..488f94a
--- /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 adea933..a7fe83d 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<constructor_elt, va_gc> *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);