From e06d1367cbf38964f6338ae969782032dd09b2ba Mon Sep 17 00:00:00 2001 From: amodra Date: Fri, 4 Mar 2011 22:59:07 +0000 Subject: [PATCH] PR target/47986 * config/rs6000/rs6000.c (rs6000_delegitimize_address): Handle full cmodel medium/large lo_sum + high addresses. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170687 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 20 +++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 76a2bd2..9cb86c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-05 Alan Modra + + PR target/47986 + * config/rs6000/rs6000.c (rs6000_delegitimize_address): Handle + full cmodel medium/large lo_sum + high addresses. + 2011-03-04 Andreas Krebbel * config/s390/s390.c (s390_decompose_address): Reject non-literal diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index df02bef..fd80f8b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -6248,17 +6248,23 @@ rs6000_delegitimize_address (rtx orig_x) if (MEM_P (x)) x = XEXP (x, 0); - if ((GET_CODE (x) == PLUS - || GET_CODE (x) == LO_SUM) - && GET_CODE (XEXP (x, 0)) == REG - && (REGNO (XEXP (x, 0)) == TOC_REGISTER - || TARGET_MINIMAL_TOC - || TARGET_CMODEL != CMODEL_SMALL) + if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS) && GET_CODE (XEXP (x, 1)) == CONST) { y = XEXP (XEXP (x, 1), 0); if (GET_CODE (y) == UNSPEC - && XINT (y, 1) == UNSPEC_TOCREL) + && XINT (y, 1) == UNSPEC_TOCREL + && ((GET_CODE (XEXP (x, 0)) == REG + && (REGNO (XEXP (x, 0)) == TOC_REGISTER + || TARGET_MINIMAL_TOC + || TARGET_CMODEL != CMODEL_SMALL)) + || (TARGET_CMODEL != CMODEL_SMALL + && GET_CODE (XEXP (x, 0)) == PLUS + && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG + && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER + && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH + && rtx_equal_p (XEXP (x, 1), + XEXP (XEXP (XEXP (x, 0), 1), 0))))) { y = XVECEXP (y, 0, 0); if (!MEM_P (orig_x)) -- 2.7.4