aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-01-22 10:20:00 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-01-22 10:20:00 +0000
commitd0b042c68a4d689a3dbc865b2588469b2efaabfa (patch)
treea1d91798c2d570d07003a22b8765dec9bd3dba5b
parenta14e30837f2e90ea075a850609c7076d9615b83a (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/sparc/sparc.c28
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;