aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-10-30 13:49:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2008-10-30 13:49:31 +0100
commit723a7cedae9574c8158bcf9e0c563ebb72a6e28c (patch)
treed8370185571c475f94b776bd2fda5cbcb22ceca6 /gcc
parent8ec6daa568f5f3d0ded34dc69905e9ee9e241a3e (diff)
downloadgcc-723a7cedae9574c8158bcf9e0c563ebb72a6e28c.zip
gcc-723a7cedae9574c8158bcf9e0c563ebb72a6e28c.tar.gz
gcc-723a7cedae9574c8158bcf9e0c563ebb72a6e28c.tar.bz2
re PR middle-end/37730 (gcc.c-torture/compile/pr37713.c ICEs at -O3 -msse2)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c10
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr37730.c16
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 725df9d..b7b8523 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/expr.c b/gcc/expr.c
index 11902b83..6db637e 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 295f8de..bd10cc9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..876f549
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr37730.c
@@ -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" } } */