File s390-literalpool-cse of Package gcc43

Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** s390_decompose_address (rtx addr, struct
*** 1994,1999 ****
--- 1994,2009 ----
        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)
  	    {
openSUSE Build Service is sponsored by