------- Comment #8 from uros at kss-loka dot si 2005-11-08 12:53 ------- > This patch fixes the failure for me, but...
... we actually gain nothing here. >From .loop2_done, we have following sequence, where mem->reg load is pushed out of the loop: (insn 21 16 39 0 (set (reg:DF 64) (mem/u/c/i:DF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0 S8 A64])) -1 (nil) (nil)) ;; End of basic block 0, registers live: (nil) (note 39 21 17 NOTE_INSN_LOOP_BEG) ;; Start of basic block 1, registers live: (nil) (code_label 17 39 18 1 2 "" [1 uses]) (note 18 17 47 1 [bb 1] NOTE_INSN_BASIC_BLOCK) (insn 47 18 22 1 (set (mem:DF (plus:SI (reg/f:SI 7 sp) (const_int 8 [0x8])) [0 S8 A32]) (reg:DF 64)) -1 (nil) (nil)) However, in .postreload, the insn 21 (now insn 53) is moved back _into_ the loop (why?): (note 21 16 39 0 NOTE_INSN_DELETED) ;; End of basic block 0, registers live: 6 [bp] 7 [sp] 16 [argp] 20 [frame] 60 64 (note 39 21 17 NOTE_INSN_LOOP_BEG) ;; Start of basic block 1, registers live: 6 [bp] 7 [sp] 59 60 64 (code_label 17 39 18 1 2 "" [1 uses]) (note 18 17 53 1 [bb 1] NOTE_INSN_BASIC_BLOCK) (insn 53 18 47 1 (set (reg:DF 8 st) (mem/u/c/i:DF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0 S8 A64])) 63 {*movdf_noin teger} (nil) (nil)) (insn 47 53 54 1 (set (mem:DF (plus:SI (reg/f:SI 7 sp) (const_int 8 [0x8])) [0 S8 A32]) (reg:DF 8 st)) 63 {*movdf_nointeger} (nil) (nil)) Proposed patch thus only fixes the damage. Otherwise, all this register moving/copying doesn't gain anything, as reload fixes something on its own. Also, REG_EQUAL notes are lost (before and after the patch). This results in following asm: ... movl $-1717986918, 8(%esp) movl $1070176665, 12(%esp) fldl -16(%ebp) fstpl (%esp) call dset movl $1, %ebx .L2: fldl .LC0 <<< reload moves this insn back into the loop fstpl 8(%esp) fldl -16(%ebp) fstpl (%esp) call dset incl %ebx cmpl $4, %ebx jne .L2 addl $36, %esp ... -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24265