diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ac5db9183f849b03b3a2557667034ccc2ab539c..587a627ce061cf533be22df2fe8fc0b29ccafb28 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-29  Oleg Endo  <oleg.endo@t-online.de>
+
+	PR target/51337
+	* config/sh/sh.c (sh_secondary_reload): Add case when FPUL
+	register is being loaded from a pseudo in memory.
+
 2011-11-29  DJ Delorie  <dj@redhat.com>
 
 	* config.gcc (rl78-*-elf): New case.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 2545a63e7244d4654542c0f7eb4a7447caef70b0..870c39f2602b3351a34ac64626adfba35689eea4 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -12432,6 +12432,14 @@ sh_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
   if (rclass != GENERAL_REGS && REG_P (x)
       && TARGET_REGISTER_P (REGNO (x)))
     return GENERAL_REGS;
+
+ /* If here fall back to loading FPUL register through general registers.
+    This case can happen when movsi_ie insn is picked initially to
+    load/store the FPUL register from/to another register, and then the
+    other register is allocated on the stack.  */
+  if (rclass == FPUL_REGS && true_regnum (x) == -1)
+    return GENERAL_REGS;
+
   return NO_REGS;
 }