From 02143d0b6908776548919ce96dd131e7fdcf6555 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sat, 2 Jan 2010 15:18:41 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 16 +++++++++---- gcc/config/alpha/alpha.c | 4 ++++ gcc/config/alpha/predicates.md | 8 +++++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.target/alpha/pr42448-1.c | 27 ++++++++++++++++++++++ gcc/testsuite/gcc.target/alpha/pr42448-2.c | 27 ++++++++++++++++++++++ 6 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/alpha/pr42448-1.c create mode 100644 gcc/testsuite/gcc.target/alpha/pr42448-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2898134585ed..3db4b5cabbd1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,7 +1,16 @@ +2010-01-02 Uros Bizjak + + 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 - * 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 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 diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 6dece1019ac7..450300050ae1 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 ec11eaa3d1f3..b52d9dce028e 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 b649072989ac..3b9c43caa4d2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-01-02 Uros Bizjak + + PR target/42448 + * gcc.target/alpha/pr42448-1.c: New test. + * gcc.target/alpha/pr42448-2.c: Ditto. + 2010-01-01 Joseph Myers 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 000000000000..4e2c376e39dc --- /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 000000000000..aeebad2809b4 --- /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; +} -- 2.43.5