[RS6000] TOC refs generated during reload
authorAlan Modra <amodra@gmail.com>
Mon, 8 Aug 2016 12:05:11 +0000 (21:35 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Mon, 8 Aug 2016 12:05:11 +0000 (21:35 +0930)
The generic reload fix for pr72771 exposed a problem with recognizing
-mcmodel=medium/large TOC references generated during reload.

PR target/72771
* config/rs6000/rs6000.c (toc_relative_expr_p): Allow (lo_sum (high))
toc refs created during reload.  Update function comment.

From-SVN: r239240

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 083b61366392c73e1af18eae9ef2cebb7148dea4..66e4049915b584dc38fda72cb4b99c9f607a64ec 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-08  Alan Modra  <amodra@gmail.com>
+
+       PR target/72771
+       * config/rs6000/rs6000.c (toc_relative_expr_p): Allow (lo_sum (high))
+       toc refs created during reload.  Update function comment.
+
 2016-08-08  Alan Modra  <amodra@gmail.com>
 
        PR target/72802
index c59d07ac899636898eac511df3b72d3f0145a5d6..5aa056cb4c8c2fe90750de3d417ac6ac8928049c 100644 (file)
@@ -7937,8 +7937,8 @@ constant_pool_expr_p (rtx op)
 static const_rtx tocrel_base, tocrel_offset;
 
 /* Return true if OP is a toc pointer relative address (the output
-   of create_TOC_reference).  If STRICT, do not match high part or
-   non-split -mcmodel=large/medium toc pointer relative addresses.  */
+   of create_TOC_reference).  If STRICT, do not match non-split
+   -mcmodel=large/medium toc pointer relative addresses.  */
 
 bool
 toc_relative_expr_p (const_rtx op, bool strict)
@@ -7948,13 +7948,17 @@ toc_relative_expr_p (const_rtx op, bool strict)
 
   if (TARGET_CMODEL != CMODEL_SMALL)
     {
-      /* Only match the low part.  */
-      if (GET_CODE (op) == LO_SUM
-         && REG_P (XEXP (op, 0))
-         && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict))
-       op = XEXP (op, 1);
-      else if (strict)
+      /* When strict ensure we have everything tidy.  */
+      if (strict
+         && !(GET_CODE (op) == LO_SUM
+              && REG_P (XEXP (op, 0))
+              && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)))
        return false;
+
+      /* When not strict, allow non-split TOC addresses and also allow
+        (lo_sum (high ..)) TOC addresses created during reload.  */
+      if (GET_CODE (op) == LO_SUM)
+       op = XEXP (op, 1);
     }
 
   tocrel_base = op;