------- Comment #4 from jakub at gcc dot gnu dot org 2009-12-19 18:40 ------- After sched1 we have:
(insn 6094 6056 6069 83 u4.c:511 (set (reg:QI 5621) (mem/s/u/j:QI (plus:SI (reg/f:SI 5441) (reg:SI 5619)) [0 q1 S1 A8])) 73 {*movqi} (expr_list:REG_DEAD (reg:SI 5619) (expr_list:REG_EQUAL (mem/s/u/j:QI (plus:SI (reg:SI 5619) (symbol_ref:SI ("q1") [flags 0x402] <var_decl 0x7f2ced1c55a0 q1>)) [0 q1 S1 A8]) (nil)))) ... (insn 6096 6058 6071 83 u4.c:511 (parallel [ (set (subreg:SI (reg:QI 5620) 0) (xor:SI (subreg:SI (reg:QI 5621) 0) (subreg:SI (reg:QI 5622) 0))) (clobber (reg:CC 33 %cc)) ]) 392 {*xorsi3} (expr_list:REG_DEAD (reg:QI 5622) (expr_list:REG_DEAD (reg:QI 5621) (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))))) The register pressure is extremely high (unnecessarily so, but that's tree opt issue), so reg:QI 5621 is spilled: (insn 10902 6056 10903 83 u4.c:511 (set (reg:SI 14 %r14) (symbol_ref:SI ("q1") [flags 0x402] <var_decl 0x7f2ced1c55a0 q1>)) 65 {*movsi_larl} (nil)) (insn 10903 10902 10901 83 u4.c:511 (set (reg:QI 9 %r9) (mem/s/u/j:QI (plus:SI (reg:SI 14 %r14) (reg:SI 3 %r3 [5619])) [0 q1 S1 A8])) 73 {*movqi} (nil)) (insn 10901 10903 6094 83 u4.c:511 (set (reg:SI 14 %r14) (const_int 4096 [0x1000])) 67 {*movsi_esa} (nil)) (insn 6094 10901 10904 83 u4.c:511 (set (mem/c:QI (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 14 %r14)) (const_int 519 [0x207])) [7 %sfp+-137 S1 A8]) (reg:QI 9 %r9)) 73 {*movqi} (expr_list:REG_EQUAL (mem/s/u/j:QI (plus:SI (reg:SI 3 %r3 [5619]) (symbol_ref:SI ("q1") [flags 0x402] <var_decl 0x7f2ced1c55a0 q1>)) [0 q1 S1 A8]) (nil))) ... (insn 10912 10913 6096 83 u4.c:511 (set (reg:SI 4 %r4) (const_int 4096 [0x1000])) 67 {*movsi_esa} (nil)) (insn 6096 10912 10915 83 u4.c:511 (parallel [ (set (reg:SI 0 %r0) (xor:SI (reg:SI 0 %r0 [+-3 ]) (mem/c:SI (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 4 %r4)) (const_int 516 [0x204])) [7 %sfp+-140 S1 A8]))) (clobber (reg:CC 33 %cc)) ]) 392 {*xorsi3} (nil)) Note it is spilled as QImode and restored using SImode. But then DSE2 kills insn 6094: **scanning insn=6094 cselib lookup (reg:SI 14 %r14) => 8095 cselib lookup (reg/f:SI 15 %r15) => 1 cselib value 12760 0x254ba00 (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 14 %r14)) (const_int 519 [0x207])) ... **scanning insn=6096 cselib lookup (reg:SI 4 %r4) => 8095 cselib lookup (reg/f:SI 15 %r15) => 1 cselib lookup (reg/f:SI 15 %r15) => 1 cselib lookup (reg:SI 4 %r4) => 8095 cselib lookup (reg/f:SI 15 %r15) => 1 cselib lookup (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 4 %r4)) (const_int 516 [0x204])) => 12757 mem: (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 4 %r4)) (const_int 516 [0x204])) after canon_rtx address: (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 4 %r4)) (const_int 516 [0x204])) expanding: r4 into: (const_int 4096 [0x1000]) after cselib_expand address: (plus:SI (reg/f:SI 15 %r15) (const_int 4612 [0x1204])) after canon_rtx address: (plus:SI (reg/f:SI 15 %r15) (const_int 4612 [0x1204])) cselib lookup (reg/f:SI 15 %r15) => 1 varying cselib base=1 offset = 4612 processing cselib load mem:(mem/c:SI (plus:SI (plus:SI (reg/f:SI 15 %r15) (reg:SI 4 %r4)) (const_int 516 [0x204])) [7 %sfp+-140 S1 A8]) processing cselib load against insn 6094 processing cselib load against insn 10898 mems_found = 0, cannot_delete = true ... cselib lookup (reg/f:SI 15 %r15) => 1 varying cselib base=1 offset = 4612 processing cselib store [4612..4616) trying store in insn=6094 gid=-1[4615..4616) Locally deleting insn 6094 deferring deletion of insn with uid = 6094. trying store in insn=10898 gid=-1[1223..1224) ... deleting insn with uid = 6094. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42429