	PR target/50181
	Backported from mainline

gcc/
	2012-01-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	PR rtl-optimization/51856
	* reload.c (find_reloads_subreg_address): Set the address_reloaded
	flag to reloaded.

	2011-03-24  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	* reload.c (find_reloads_subreg_address): Add address_reloaded
	parameter and return true there if the full address has been
	reloaded.
	(find_reloads_toplev): Pass address_reloaded flag.
	(find_reloads_address_1): Don't use address_reloaded parameter.

--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -285,7 +285,7 @@ static void find_reloads_address_part (r
 				       enum machine_mode, int,
 				       enum reload_type, int);
 static rtx find_reloads_subreg_address (rtx, int, int, enum reload_type,
-					int, rtx);
+					int, rtx, int *);
 static void copy_replacements_1 (rtx *, rtx *, int);
 static int find_inc_amount (rtx, rtx);
 static int refers_to_mem_for_reload_p (rtx);
@@ -4759,7 +4759,7 @@ find_reloads_toplev (rtx x, int opnum, e
 			   || ! offsettable_memref_p (reg_equiv_mem[regno])
 			   || num_not_at_initial_offset))))
 	x = find_reloads_subreg_address (x, 1, opnum, type, ind_levels,
-					 insn);
+					   insn, address_reloaded);
     }
 
   for (copied = 0, i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
@@ -5997,7 +5997,7 @@ find_reloads_address_1 (enum machine_mod
 		{
 		  x = find_reloads_subreg_address (x, 0, opnum,
 						   ADDR_TYPE (type),
-						   ind_levels, insn);
+						   ind_levels, insn, NULL);
 		  push_reload (x, NULL_RTX, loc, (rtx*) 0, rclass,
 			       GET_MODE (x), VOIDmode, 0, 0, opnum, type);
 		  return 1;
@@ -6099,9 +6099,11 @@ find_reloads_address_part (rtx x, rtx *l
 
 static rtx
 find_reloads_subreg_address (rtx x, int force_replace, int opnum,
-			     enum reload_type type, int ind_levels, rtx insn)
+			     enum reload_type type, int ind_levels, rtx insn,
+			     int *address_reloaded)
 {
   int regno = REGNO (SUBREG_REG (x));
+  int reloaded = 0;
 
   if (reg_equiv_memory_loc[regno])
     {
@@ -6125,7 +6127,6 @@ find_reloads_subreg_address (rtx x, int
 	      unsigned inner_size = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)));
 	      int offset;
 	      rtx orig = tem;
-	      int reloaded;
 
 	      /* For big-endian paradoxical subregs, SUBREG_BYTE does not
 		 hold the correct (negative) byte offset.  */
@@ -6194,11 +6195,13 @@ find_reloads_subreg_address (rtx x, int
 		  && !strict_memory_address_addr_space_p
 			(GET_MODE (x), XEXP (reg_equiv_mem[regno], 0),
 			 MEM_ADDR_SPACE (reg_equiv_mem[regno])))
-		push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,
-			     base_reg_class (GET_MODE (tem), MEM, SCRATCH),
-			     GET_MODE (XEXP (tem, 0)), VOIDmode, 0, 0,
-			     opnum, type);
-
+		{
+		  push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,
+			       base_reg_class (GET_MODE (tem), MEM, SCRATCH),
+			       GET_MODE (XEXP (tem, 0)), VOIDmode, 0, 0,
+			       opnum, type);
+		  reloaded = 1;
+		}
 	      /* If this is not a toplevel operand, find_reloads doesn't see
 		 this substitution.  We have to emit a USE of the pseudo so
 		 that delete_output_reload can see it.  */
@@ -6213,6 +6216,9 @@ find_reloads_subreg_address (rtx x, int
 	    }
 	}
     }
+  if (address_reloaded)
+    *address_reloaded = reloaded;
+
   return x;
 }
 
