aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-12-02 08:54:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-12-02 08:54:47 +0100
commite034c5c895722e0092d2239cd8c2991db77d6d39 (patch)
tree128171fc7beeba4de19df412d9d8a94d75ce0164 /gcc
parent3b5e1089fedddec6d8299ba1800705b65c574d32 (diff)
downloadgcc-e034c5c895722e0092d2239cd8c2991db77d6d39.zip
gcc-e034c5c895722e0092d2239cd8c2991db77d6d39.tar.gz
gcc-e034c5c895722e0092d2239cd8c2991db77d6d39.tar.bz2
re PR target/78643 (ICE in convert_move, at expr.c:230)
PR target/78643 PR target/80583 * expr.c (get_inner_reference): If DECL_MODE of a non-bitfield is BLKmode for vector field with vector raw mode, use TYPE_MODE instead of DECL_MODE. * gcc.target/i386/pr80583.c: New test. From-SVN: r255353
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c11
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr80583.c13
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de7335e..9536a88 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2017-12-02 Jakub Jelinek <jakub@redhat.com>
+ PR target/78643
+ PR target/80583
+ * expr.c (get_inner_reference): If DECL_MODE of a non-bitfield
+ is BLKmode for vector field with vector raw mode, use TYPE_MODE
+ instead of DECL_MODE.
+
* config/i386/i386-protos.h (standard_sse_constant_opcode): Change
last argument to rtx pointer.
* config/i386/i386.c (standard_sse_constant_opcode): Replace X argument
diff --git a/gcc/expr.c b/gcc/expr.c
index e9d8555..8011638 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7032,7 +7032,16 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
size. */
mode = TYPE_MODE (DECL_BIT_FIELD_TYPE (field));
else if (!DECL_BIT_FIELD (field))
- mode = DECL_MODE (field);
+ {
+ mode = DECL_MODE (field);
+ /* For vector fields re-check the target flags, as DECL_MODE
+ could have been set with different target flags than
+ the current function has. */
+ if (mode == BLKmode
+ && VECTOR_TYPE_P (TREE_TYPE (field))
+ && VECTOR_MODE_P (TYPE_MODE_RAW (TREE_TYPE (field))))
+ mode = TYPE_MODE (TREE_TYPE (field));
+ }
else if (DECL_MODE (field) == BLKmode)
blkmode_bitfield = true;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8133e8a..49f0409 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2017-12-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/78643
+ PR target/80583
+ * gcc.target/i386/pr80583.c: New test.
+
2017-12-01 Segher Boessenkool <segher@kernel.crashing.org>
* gcc.target/powerpc/fusion.c: Add -dp to options. Adjust the expected
diff --git a/gcc/testsuite/gcc.target/i386/pr80583.c b/gcc/testsuite/gcc.target/i386/pr80583.c
new file mode 100644
index 0000000..6fe3212
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr80583.c
@@ -0,0 +1,13 @@
+/* PR target/80583 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -mno-avx" } */
+
+typedef int V __attribute__((__vector_size__(32)));
+struct S { V a; };
+
+V __attribute__((target ("avx")))
+foo (struct S *b)
+{
+ V x = b->a;
+ return x;
+}