aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2010-01-02 15:18:41 +0100
committerUros Bizjak <uros@gcc.gnu.org>2010-01-02 15:18:41 +0100
commit02143d0b6908776548919ce96dd131e7fdcf6555 (patch)
treecbed5b334013f0146fca8c239a700bb068a84127 /gcc
parent7413962d04a4f1864db684a2d9a49d043322f299 (diff)
downloadgcc-02143d0b6908776548919ce96dd131e7fdcf6555.zip
gcc-02143d0b6908776548919ce96dd131e7fdcf6555.tar.gz
gcc-02143d0b6908776548919ce96dd131e7fdcf6555.tar.bz2
re PR target/42448 (Wrong code with _Complex char in structure)
PR target/42448 * config/alpha/predicates.md (aligned_memory_operand): Return false for CQImode. (unaligned_memory_operand): Return true for CQImode. * config/alpha/alpha.c (get_aligned_mem): Assert that location doesn not cross aligned SImode word boundary. testsuite/ChangeLog: PR target/42448 * gcc.target/alpha/pr42448-1.c: New test. * gcc.target/alpha/pr42448-2.c: Ditto. From-SVN: r155566
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/config/alpha/alpha.c4
-rw-r--r--gcc/config/alpha/predicates.md8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/alpha/pr42448-1.c27
-rw-r--r--gcc/testsuite/gcc.target/alpha/pr42448-2.c27
6 files changed, 84 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2898134..3db4b5c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,7 +1,16 @@
+2010-01-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/42448
+ * config/alpha/predicates.md (aligned_memory_operand): Return false
+ for CQImode.
+ (unaligned_memory_operand): Return true for CQImode.
+ * config/alpha/alpha.c (get_aligned_mem): Assert that location
+ doesn not cross aligned SImode word boundary.
+
2010-01-02 Anatoly Sokolov <aesok@post.ru>
- * config/avr/avr.h (REG_OK_FOR_BASE_P, REG_OK_FOR_INDEX_P,
- XEXP_) : Remove.
+ * config/avr/avr.h (REG_OK_FOR_BASE_P, REG_OK_FOR_INDEX_P, XEXP_):
+ Remove.
* config/avr/avr-protos.h (avr_init_once, avr_optimization_options,
avr_change_section, avr_reg_class_from_letter) : Remove declaration.
@@ -15,8 +24,7 @@
2010-01-01 Richard Guenther <rguenther@suse.de>
PR debug/42455
- * tree-sra.c (analyze_all_variable_accesses): Work in DECL_UID
- order.
+ * tree-sra.c (analyze_all_variable_accesses): Work in DECL_UID order.
2010-01-01 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 6dece10..4503000 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -1475,6 +1475,10 @@ get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum)
else
offset = disp & 3;
+ /* The location should not cross aligned word boundary. */
+ gcc_assert (offset + GET_MODE_SIZE (GET_MODE (ref))
+ <= GET_MODE_SIZE (SImode));
+
/* Access the entire aligned word. */
*paligned_mem = widen_memory_access (ref, SImode, -offset);
diff --git a/gcc/config/alpha/predicates.md b/gcc/config/alpha/predicates.md
index ec11eaa..b52d9dc 100644
--- a/gcc/config/alpha/predicates.md
+++ b/gcc/config/alpha/predicates.md
@@ -442,6 +442,10 @@
if (MEM_ALIGN (op) >= 32)
return 1;
+
+ if (mode == CQImode)
+ return 0;
+
op = XEXP (op, 0);
/* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
@@ -470,6 +474,10 @@
if (MEM_ALIGN (op) >= 32)
return 0;
+
+ if (mode == CQImode)
+ return 1;
+
op = XEXP (op, 0);
/* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b649072..3b9c43c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/42448
+ * gcc.target/alpha/pr42448-1.c: New test.
+ * gcc.target/alpha/pr42448-2.c: Ditto.
+
2010-01-01 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/41947
diff --git a/gcc/testsuite/gcc.target/alpha/pr42448-1.c b/gcc/testsuite/gcc.target/alpha/pr42448-1.c
new file mode 100644
index 0000000..4e2c376
--- /dev/null
+++ b/gcc/testsuite/gcc.target/alpha/pr42448-1.c
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-mcpu=21064 -O0" } */
+
+extern void abort (void);
+
+struct S2180
+{
+ char t;
+ _Complex char u[2];
+};
+
+struct S2180 s2180;
+
+int
+main (void)
+{
+ volatile struct S2180 x;
+
+ s2180.u[1] = 3 + 4i;
+
+ x.u[1] = s2180.u[1];
+
+ if (x.u[1] != s2180.u[1])
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/alpha/pr42448-2.c b/gcc/testsuite/gcc.target/alpha/pr42448-2.c
new file mode 100644
index 0000000..aeebad2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/alpha/pr42448-2.c
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-mcpu=21064 -O0" } */
+
+extern void abort (void);
+
+struct S2180
+{
+ char t;
+ _Complex char u[4];
+};
+
+struct S2180 s2180;
+
+int
+main (void)
+{
+ volatile struct S2180 x;
+
+ s2180.u[3] = 3 + 4i;
+
+ x.u[3] = s2180.u[3];
+
+ if (x.u[3] != s2180.u[3])
+ abort ();
+
+ return 0;
+}