http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50764

--- Comment #4 from vries at gcc dot gnu.org 2011-10-27 15:29:10 UTC ---
Created attachment 25634
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25634
sdiff between 209r.split4 and 210r.sched2 with -ftree-tail-merge

The effect of -fsched2-use-superblocks (with -ftree-tail-merge) is that note 59
and insn 51 are moved from block 4 to block 3.
...
(note 59 27 51 3 NOTE_INSN_EPILOGUE_BEG)

(insn/f 51 50 52 4 (set (reg:DI 39 r10)
        (mem/c:DI (plus:DI (reg/f:DI 6 bp)
                (const_int -8 [0xfffffffffffffff8])) [3 S8 A8])) pr50764.c:13
62 {*movdi_internal_rex64}
     (expr_list:REG_CFA_DEF_CFA (reg:DI 39 r10)
        (nil)))
...

block 4 contains a return, and block 3 jumps either to block 4 or block 5,
which calls abort.

           2
          bar
           |
    -------+-----
   /             \
  *               *
  5 *------------ 3
abort            bar
                  |
                  |
                  *
                  4
                return

The move looks ok, bp and memory are not modified in between the original and
new position, and r10 does not overwrite a value in block 3 or 5. 

Possibly the dead label at the start of block 4 prevents this move in case of
-fno-tree-tail-merge.

Reply via email to