diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2019-01-22 10:20:00 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2019-01-22 10:20:00 +0000 |
commit | d0b042c68a4d689a3dbc865b2588469b2efaabfa (patch) | |
tree | a1d91798c2d570d07003a22b8765dec9bd3dba5b | |
parent | a14e30837f2e90ea075a850609c7076d9615b83a (diff) | |
download | gcc-d0b042c68a4d689a3dbc865b2588469b2efaabfa.zip gcc-d0b042c68a4d689a3dbc865b2588469b2efaabfa.tar.gz gcc-d0b042c68a4d689a3dbc865b2588469b2efaabfa.tar.bz2 |
sparc.c (parc_delegitimize_address): Recognize the GOT register and decoded HIGH/LO_SUM combinations for labels in...
* config/sparc/sparc.c (parc_delegitimize_address): Recognize the GOT
register and decoded HIGH/LO_SUM combinations for labels in PIC mode.
From-SVN: r268145
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 28 |
2 files changed, 22 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index feda772..e45075c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-01-22 Eric Botcazou <ebotcazou@adacore.com> + + * config/sparc/sparc.c (parc_delegitimize_address): Recognize the GOT + register and decoded HIGH/LO_SUM combinations for labels in PIC mode. + 2019-01-22 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/88044 diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index dc6f94d..da909c0 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4995,17 +4995,23 @@ sparc_delegitimize_address (rtx x) /* This is generated by mov{si,di}_pic_label_ref in PIC mode. */ if (GET_CODE (x) == MINUS - && sparc_pic_register_p (XEXP (x, 0)) - && GET_CODE (XEXP (x, 1)) == LO_SUM - && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC - && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL) - { - x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0); - gcc_assert (GET_CODE (x) == LABEL_REF - || (GET_CODE (x) == CONST - && GET_CODE (XEXP (x, 0)) == PLUS - && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF - && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)); + && (XEXP (x, 0) == global_offset_table_rtx + || sparc_pic_register_p (XEXP (x, 0)))) + { + rtx y = XEXP (x, 1); + + if (GET_CODE (y) == LO_SUM) + y = XEXP (y, 1); + + if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_MOVE_PIC_LABEL) + { + x = XVECEXP (y, 0, 0); + gcc_assert (GET_CODE (x) == LABEL_REF + || (GET_CODE (x) == CONST + && GET_CODE (XEXP (x, 0)) == PLUS + && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF + && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)); + } } return x; |