http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50176
--- Comment #7 from Igor Zamyatin <izamyatin at gmail dot com> 2011-09-14 14:30:35 UTC --- In RTL everythin is vice-versa, additional instruction appears: For the "bad" case couple instructions are responsible for cb load (asmcons dump): (insn 52 51 53 5 (set (reg:QI 83 [ D.2685 ]) (mem:QI (plus:SI (reg/v/f:SI 75 [ inptr1 ]) (reg/v:SI 117 [ col ])) [0 MEM[base: inptr1_19, index: col_90, offset: 0B]+0 S1 A8])) ../test_bad_4_6.c:42 66 {*movqi_internal} (nil)) and later (insn 62 61 122 5 (parallel [ (set (reg:SI 152 [ D.2685 ]) (zero_extend:SI (reg:QI 83 [ D.2685 ]))) (clobber (reg:CC 17 flags)) ]) ../test_bad_4_6.c:47 123 {*zero_extendqisi2_movzbl_and} (expr_list:REG_DEAD (reg:QI 83 [ D.2685 ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) while in "good" case only one: (insn 52 51 53 5 (parallel [ (set (reg/v:SI 84 [ cb ]) (zero_extend:SI (mem:QI (plus:SI (reg/v/f:SI 75 [ inptr1 ]) (reg/v:SI 119 [ col ])) [0 MEM[base: inptr1_19, index: col_90, offset: 0B]+0 S1 A8]))) (clobber (reg:CC 17 flags)) ]) ../test_good_4_6.c:42 123 {*zero_extendqisi2_movzbl_and} (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) And life ranges in "bad" case became splitted: a34(r152): [71..82] .... a38(r83): [83..92] And in "good" case only: a34(r84): [71..90]