http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57032
--- Comment #1 from Uros Bizjak <ubizjak at gmail dot com> 2013-04-22 15:20:38 UTC --- For some reason, LRA does not fix-up (insn 12): (insn 12 11 13 2 (set (reg/v:DI 72 [ hi ]) (unsigned_fix:DI (reg:DF 83 [ D.5360 ]))) ../../../gcc-svn/trunk/libgcc/libgcc2.c:1334 138 {*fix_truncdfdi2} (expr_list:REG_DEAD (reg:DF 83 [ D.5360 ]) (nil))) with a spill to memory via *movdi combo (as is the case with reload): cvttq/c $f10,$f10 # 12 *fix_truncdfdi2 [length = 4] stt $f10,0($30) # 60 *movdi/12 [length = 4] ldq $1,0($30) # 61 *movdi/8 [length = 4] But ignores the above alternative and goes with: 12: r108:DI=uns_fix(r83:DF) REG_DEAD r83:DF Inserting insn reload after: 58: r72:DI=r108:DI Creating newreg=109, assigning class NO_REGS to secondary r109 58: r109:DI=r108:DI Inserting the sec. move after: 59: r72:DI=r109:DI Choosing alt 7 in insn 59: (0) r (1) m Choosing alt 0 in insn 13: (2) rJ Choosing alt 0 in insn 14: (0) =f (1) f Creating newreg=110 from oldreg=72, assigning class FLOAT_REGS to r110 14: r87:DF=float(r110:DI) Inserting insn reload before: 60: r110:DI=r72:DI Creating newreg=111, assigning class NO_REGS to secondary r111 60: r111:DI=r72:DI Inserting the sec. move after: 61: r110:DI=r111:DI Choosing alt 9 in insn 61: (0) *f (1) *fJ Creating newreg=112 from oldreg=111, assigning class FLOAT_REGS to r112 61: r110:DI=r112:DI Inserting insn reload before: 62: r112:DI=r111:DI Choosing alt 9 in insn 62: (0) *f (1) *fJ Creating newreg=113 from oldreg=111, assigning class FLOAT_REGS to r113 62: r112:DI=r113:DI Inserting insn reload before: 63: r113:DI=r111:DI ... This creates a reload loop.