aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/rs6000
diff options
context:
space:
mode:
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-24 00:00:59 +0000
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-24 00:00:59 +0000
commit269e327381bb6aa5a0f8d36a92a544f9037ef2c1 (patch)
tree3a58e050195a9cf608029a95f24e334d4fcd299a /gcc/config/rs6000
parent2a63d225d44591af46e84a67b722c745d2365d50 (diff)
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.c24
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;
}