http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55889
--- Comment #22 from David Edelsohn <dje at gcc dot gnu.org> 2013-01-24 02:35:33 UTC --- I don't understand your analysis. Prior to sched1, the pr50907.c.205r.asmcons RTL dump looks like: (insn 15 14 16 2 (set (reg:SI 3 3) (mem/u/c:SI (unspec:SI [ (symbol_ref:SI ("*LCM..0") [flags 0x2]) (reg:SI 2 2) ] UNSPEC_TOCREL) [0 S4 A8])) /nasfarm/dje/src/src/gcc/testsuite/ gcc.dg/tree-prof/pr50907.c:5 346 {*movsi_internal1} (nil)) (insn 16 15 17 2 (set (reg:SI 4 4) (mem/u/c:SI (unspec:SI [ (symbol_ref/u:SI ("*LC..0") [flags 0x2]) (reg:SI 2 2) ] UNSPEC_TOCREL) [0 S4 A8])) /nasfarm/dje/src/src/gcc/testsuite/ gcc.dg/tree-prof/pr50907.c:5 346 {*movsi_internal1} (nil)) (insn 17 16 18 2 (parallel [ (set (reg:SI 3 3) (unspec:SI [ (reg:SI 3 3) (reg:SI 4 4) ] UNSPEC_TLSTLS)) (clobber (reg:SI 0 0)) (clobber (reg:SI 4 4)) (clobber (reg:SI 5 5)) (clobber (reg:SI 11 11)) (clobber (reg:CC 68 0)) (clobber (reg:SI 65 lr)) ]) /nasfarm/dje/src/src/gcc/testsuite/gcc.dg/tree-prof/pr50907.c:5 443 { tls_get_addr_internalsi} (expr_list:REG_DEAD (reg:SI 4 4) (expr_list:REG_UNUSED (reg:CC 68 0) (expr_list:REG_UNUSED (reg:SI 65 lr) (expr_list:REG_UNUSED (reg:SI 11 11) (expr_list:REG_UNUSED (reg:SI 5 5) (expr_list:REG_UNUSED (reg:SI 4 4) (expr_list:REG_UNUSED (reg:SI 0 0) (nil))))))))) (insn 20 18 21 2 (set (reg/f:SI 144 [ __gcov_indirect_call_counters ]) (mem/u/f/c:SI (reg:SI 3 3) [0 __gcov_indirect_call_counters+0 S4 A32])) 346 {*movsi_internal1} (expr_list:REG_DEAD (reg:SI 3 3) (nil))) (insn 23 22 24 2 (set (reg:SI 148) (mem/u/c:SI (unspec:SI [ (symbol_ref/u:SI ("*LC..2") [flags 0x2]) (reg:SI 2 2) ] UNSPEC_TOCREL) [0 S4 A8])) /nasfarm/dje/src/src/gcc/testsuite/ gcc.dg/tree-prof/pr50907.c:5 346 {*movsi_internal1} (nil)) (insn 24 23 25 2 (set (reg:SI 3 3) (mem/u/c:SI (unspec:SI [ (symbol_ref:SI ("*LCM..2") [flags 0x2]) (reg:SI 2 2) ] UNSPEC_TOCREL) [0 S4 A8])) /nasfarm/dje/src/src/gcc/testsuite/ gcc.dg/tree-prof/pr50907.c:5 346 {*movsi_internal1} (nil)) (insn 25 24 26 2 (set (reg:SI 4 4) (reg:SI 148)) /nasfarm/dje/src/src/gcc/testsuite/gcc.dg/tree-prof/pr5090 7.c:5 346 {*movsi_internal1} (nil)) (insn 26 25 27 2 (parallel [ (set (reg:SI 3 3) (unspec:SI [ (reg:SI 3 3) (reg:SI 4 4) ] UNSPEC_TLSTLS)) (clobber (reg:SI 0 0)) (clobber (reg:SI 4 4)) (clobber (reg:SI 5 5)) (clobber (reg:SI 11 11)) (clobber (reg:CC 68 0)) (clobber (reg:SI 65 lr)) ]) /nasfarm/dje/src/src/gcc/testsuite/gcc.dg/tree-prof/pr50907.c:5 443 { tls_get_addr_internalsi} (expr_list:REG_DEAD (reg:SI 4 4) (expr_list:REG_UNUSED (reg:CC 68 0) (expr_list:REG_UNUSED (reg:SI 65 lr) (expr_list:REG_UNUSED (reg:SI 11 11) (expr_list:REG_UNUSED (reg:SI 5 5) (expr_list:REG_UNUSED (reg:SI 4 4) (expr_list:REG_UNUSED (reg:SI 0 0) (nil))))))))) (insn 29 27 30 2 (set (reg/f:SI 150 [ __gcov_indirect_call_callee ]) (mem/f/c:SI (reg:SI 3 3) [0 __gcov_indirect_call_callee+0 S4 A32])) 346 {*movsi_internal1} (expr_list:REG_DEAD (reg:SI 3 3) (nil))) (insn 30 29 31 2 (set (reg:SI 3 3) (reg/f:SI 144 [ __gcov_indirect_call_counters ])) 346 {*movsi_internal1} (expr_list:REG_DEAD (reg/f:SI 144 [ __gcov_indirect_call_counters ]) (nil))) (insn 31 30 32 2 (set (reg:DI 4 4) (const_int 0 [0])) 367 {*movdi_internal32} (nil)) Insns 15 and 16 feed into the TLS call of insn 17. Insns 23 an 24 feed into the TLS call of insn 26. The combine pass converted the original pseudos of insns 13, 14 and 21 into hard registers. It also combined insns 22 and 24, but left the result in pseudo r148. Insn 25 moves pseudo r148 into hard register r4, which is used in insn 26. I do not understand why r65 (LR) is involved or critical, and I do not understand how the selective scheduler thinks it can move any of those instructions past one another with the clear control and data dependencies.