OSDN Git Service

PR target/42448
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Jan 2010 14:18:41 +0000 (14:18 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Jan 2010 14:18:41 +0000 (14:18 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155566 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/alpha/pr42448-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/alpha/pr42448-2.c [new file with mode: 0644]

index 2898134..3db4b5c 100644 (file)
@@ -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>
 
index 6dece10..4503000 100644 (file)
@@ -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);
 
index ec11eaa..b52d9dc 100644 (file)
 
   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)
 
   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)
index b649072..3b9c43c 100644 (file)
@@ -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 (file)
index 0000000..4e2c376
--- /dev/null
@@ -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 (file)
index 0000000..aeebad2
--- /dev/null
@@ -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;
+}