re PR middle-end/37730 (gcc.c-torture/compile/pr37713.c ICEs at -O3 -msse2)
authorJakub Jelinek <jakub@redhat.com>
Thu, 30 Oct 2008 12:49:31 +0000 (13:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 30 Oct 2008 12:49:31 +0000 (13:49 +0100)
PR middle-end/37730
* expr.c (store_constructor): For vectors, if target is a MEM, use
target's MEM_ALIAS_SET instead of elttype alias set.

* gcc.dg/vect/pr37730.c: New test.

From-SVN: r141461

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr37730.c [new file with mode: 0644]

index 725df9dfdc9a4788b93a14fa4c6fe15049abc2eb..b7b85230ae3542fc3a19993dd4a7964c5de5c11d 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/37730
+       * expr.c (store_constructor): For vectors, if target is a MEM, use
+       target's MEM_ALIAS_SET instead of elttype alias set.
+
 2008-10-29  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        PR target/37909
index 11902b832b2823fbdc243dd5a19119f1456292e2..6db637e53bf8536fc53c0bb65ab5bd15baf2eb04 100644 (file)
@@ -5579,6 +5579,7 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
        HOST_WIDE_INT bitpos;
        rtvec vector = NULL;
        unsigned n_elts;
+       alias_set_type alias;
 
        gcc_assert (eltmode != BLKmode);
 
@@ -5630,7 +5631,7 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
        if (need_to_clear && size > 0 && !vector)
          {
            if (REG_P (target))
-             emit_move_insn (target,  CONST0_RTX (GET_MODE (target)));
+             emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
            else
              clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
            cleared = 1;
@@ -5640,6 +5641,11 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
        if (!cleared && !vector && REG_P (target))
          emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
 
+        if (MEM_P (target))
+         alias = MEM_ALIAS_SET (target);
+       else
+         alias = get_alias_set (elttype);
+
         /* Store each element of the constructor into the corresponding
           element of TARGET, determined by counting the elements.  */
        for (idx = 0, i = 0;
@@ -5675,7 +5681,7 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
                bitpos = eltpos * elt_size;
                store_constructor_field (target, bitsize, bitpos,
                                         value_mode, value, type,
-                                        cleared, get_alias_set (elttype));
+                                        cleared, alias);
              }
          }
 
index 295f8dee00f6a12c027ce6ce143797086fdf850c..bd10cc9d97282bb4ac76339c61de0caf90d46caf 100644 (file)
@@ -1,5 +1,8 @@
 2008-10-30  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/37730
+       * gcc.dg/vect/pr37730.c: New test.
+
        PR debug/36668
        * g++.dg/other/PR23205.C: Allow foobar to be defined as variable.
        * g++.dg/other/pr23205-2.C: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/pr37730.c b/gcc/testsuite/gcc.dg/vect/pr37730.c
new file mode 100644 (file)
index 0000000..876f549
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR middle-end/37730 */
+/* { dg-do compile } */
+
+void
+add_opush (void)
+{
+  unsigned char formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
+  void *dtds[sizeof (formats)];
+  unsigned int i;
+  unsigned char dtd = 0x08;
+  for (i = 0; i < sizeof (formats); i++)
+    dtds[i] = &dtd;
+  sdp_seq_alloc (dtds);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */