diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2010-01-02 15:18:41 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2010-01-02 15:18:41 +0100 |
commit | 02143d0b6908776548919ce96dd131e7fdcf6555 (patch) | |
tree | cbed5b334013f0146fca8c239a700bb068a84127 /gcc | |
parent | 7413962d04a4f1864db684a2d9a49d043322f299 (diff) | |
download | gcc-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/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.c | 4 | ||||
-rw-r--r-- | gcc/config/alpha/predicates.md | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/alpha/pr42448-1.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/alpha/pr42448-2.c | 27 |
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; +} |