83 lines
2.9 KiB
Diff
83 lines
2.9 KiB
Diff
From fe61a1c365661a717220d0917e034899559aafbb Mon Sep 17 00:00:00 2001
|
|
From: Richard Sandiford <richard.sandiford@arm.com>
|
|
Date: Tue, 12 May 2020 09:01:13 +0100
|
|
Subject: [PATCH 10/26] 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.
|
|
|
|
Reference commit in GCC: 4c0283b9ad75b128b79c507d78d678123fe9f471
|
|
Signed-off-by: Pronin Alexander 00812787 <pronin.alexander@huawei.com>
|
|
---
|
|
gcc/testsuite/gcc.target/i386/pr94980.c | 10 ++++++++++
|
|
gcc/tree-vect-generic.c | 6 +++---
|
|
2 files changed, 13 insertions(+), 3 deletions(-)
|
|
create mode 100644 gcc/testsuite/gcc.target/i386/pr94980.c
|
|
|
|
diff --git a/gcc/testsuite/gcc.target/i386/pr94980.c b/gcc/testsuite/gcc.target/i386/pr94980.c
|
|
new file mode 100644
|
|
index 000000000..488f94abe
|
|
--- /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 82fb0ae7c..f0c28c97a 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));
|
|
@@ -946,9 +946,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;
|
|
@@ -1342,7 +1342,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.27.0
|
|
|