From dbbdf5100221b47be5786a060e2414c44d07038e Mon Sep 17 00:00:00 2001 From: dj Date: Tue, 28 Sep 2010 22:01:54 +0000 Subject: [PATCH] PR target/45800 * config/m32c/m32c.c (m32c_subreg): Force adjustment of subregs of volatile MEMs. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164705 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/m32c/m32c.c | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2aded97..0fe8fbb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-09-28 DJ Delorie + + PR target/45800 + * config/m32c/m32c.c (m32c_subreg): Force adjustment of subregs of + volatile MEMs. + 2010-09-28 Iain Sandoe * c-parser.c (c_parser_declaration_or_fndef): Diagnose incorrect prefix diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c index 066d1a8..d62b4f2 100644 --- a/gcc/config/m32c/m32c.c +++ b/gcc/config/m32c/m32c.c @@ -3317,7 +3317,19 @@ m32c_subreg (enum machine_mode outer, return gen_rtx_MEM (outer, XEXP (XEXP (x, 0), 0)); if (GET_CODE (x) != REG) - return simplify_gen_subreg (outer, x, inner, byte); + { + rtx r = simplify_gen_subreg (outer, x, inner, byte); + if (GET_CODE (r) == SUBREG + && GET_CODE (x) == MEM + && MEM_VOLATILE_P (x)) + { + /* Volatile MEMs don't get simplified, but we need them to + be. We are little endian, so the subreg byte is the + offset. */ + r = adjust_address (x, outer, byte); + } + return r; + } r = REGNO (x); if (r >= FIRST_PSEUDO_REGISTER || r == AP_REGNO) -- 2.7.4