OSDN Git Service

2011-03-04 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Mar 2011 20:47:11 +0000 (20:47 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Mar 2011 20:47:11 +0000 (20:47 +0000)
* config/s390/s390.c (s390_decompose_address): Reject non-literal
pool references in UNSPEC_LTREL_OFFSET.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170685 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.c

index 6b8dc64..76a2bd2 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-04  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_decompose_address): Reject non-literal
+       pool references in UNSPEC_LTREL_OFFSET.
+
 2011-03-04  Jan Hubicka  <jh@suse.cz>
 
        PR lto/47497
index f43b376..3e6edb7 100644 (file)
@@ -2065,6 +2065,16 @@ s390_decompose_address (rtx addr, struct s390_address *out)
       else if (GET_CODE (disp) == UNSPEC
               && XINT (disp, 1) == UNSPEC_LTREL_OFFSET)
         {
+         /* In case CSE pulled a non literal pool reference out of
+            the pool we have to reject the address.  This is
+            especially important when loading the GOT pointer on non
+            zarch CPUs.  In this case the literal pool contains an lt
+            relative offset to the _GLOBAL_OFFSET_TABLE_ label which
+            will most likely exceed the displacement.  */
+         if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
+             || !CONSTANT_POOL_ADDRESS_P (XVECEXP (disp, 0, 0)))
+           return false;
+
          orig_disp = gen_rtx_CONST (Pmode, disp);
          if (offset)
            {