]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/78643 (ICE in convert_move, at expr.c:230)
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 16:57:13 +0000 (18:57 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 16:57:13 +0000 (18:57 +0200)
Backported from mainline
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.

* gcc.target/i386/pr80583.c: New test.

From-SVN: r262041

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr80583.c [new file with mode: 0644]

index 6c4eb62597a021dd99392beca9d203c5d79760ff..310eda8082d809bb2e045e68556a44cddd31952b 100644 (file)
@@ -1,6 +1,14 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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.
+
        2017-11-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/80819
index 21ee43a205e062735c54da9e261b9181938019bf..236db059ca3874b7599ee3aba9882b7704e7418f 100644 (file)
@@ -6886,7 +6886,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;
 
index 4c07baf52b5b7ee5bbef1e842028d31cf1861bb5..204fea0c8f8a66cedf396784d1c6bb7a01e8fc4d 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/78643
+       PR target/80583
+       * gcc.target/i386/pr80583.c: New test.
+
        2017-11-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/80819
diff --git a/gcc/testsuite/gcc.target/i386/pr80583.c b/gcc/testsuite/gcc.target/i386/pr80583.c
new file mode 100644 (file)
index 0000000..6fe3212
--- /dev/null
@@ -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;
+}