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.

Reply via email to