diff options
author | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-24 00:00:59 +0000 |
---|---|---|
committer | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-24 00:00:59 +0000 |
commit | 269e327381bb6aa5a0f8d36a92a544f9037ef2c1 (patch) | |
tree | 3a58e050195a9cf608029a95f24e334d4fcd299a /gcc/config/rs6000 | |
parent | 2a63d225d44591af46e84a67b722c745d2365d50 (diff) | |
download | gcc-269e327381bb6aa5a0f8d36a92a544f9037ef2c1.tar.gz |
PR target/65182
* config/rs6000/rs6000.c (get_memref_parts): Only return true
when *base is a reg. Handle nested plus addresses. Simplify
pre_modify test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220924 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/rs6000')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index e482547aecc..6cef0f5a93c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -27172,25 +27172,21 @@ get_memref_parts (rtx mem, rtx *base, HOST_WIDE_INT *offset, else return false; - if (GET_CODE (XEXP (mem, 0)) == PRE_MODIFY) - addr_rtx = XEXP (XEXP (mem, 0), 1); - else - addr_rtx = (XEXP (mem, 0)); + addr_rtx = (XEXP (mem, 0)); + if (GET_CODE (addr_rtx) == PRE_MODIFY) + addr_rtx = XEXP (addr_rtx, 1); - if (GET_CODE (addr_rtx) == REG) - { - *base = addr_rtx; - *offset = 0; - } - else if (GET_CODE (addr_rtx) == PLUS - && CONST_INT_P (XEXP (addr_rtx, 1))) + *offset = 0; + while (GET_CODE (addr_rtx) == PLUS + && CONST_INT_P (XEXP (addr_rtx, 1))) { - *base = XEXP (addr_rtx, 0); - *offset = INTVAL (XEXP (addr_rtx, 1)); + *offset += INTVAL (XEXP (addr_rtx, 1)); + addr_rtx = XEXP (addr_rtx, 0); } - else + if (!REG_P (addr_rtx)) return false; + *base = addr_rtx; return true; } |