------- Comment #2 from steven at gcc dot gnu dot org 2010-01-28 11:00 ------- The RTL .ce1 pass catches it in GCC 3.4.6. The codes goes from this:
;; Start of basic block 1, registers live: (nil) (note 36 13 17 1 [bb 1] NOTE_INSN_BASIC_BLOCK) (insn 17 36 18 1 (set (reg:SI 60 [ tui_refreshing_registers ]) (mem/f:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x63f012aee680 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32])) 43 {*movsi_ (nil)) (insn 18 17 19 1 (set (reg:CCZ 17 flags) (compare:CCZ (reg:SI 60 [ tui_refreshing_registers ]) (const_int 0 [0x0]))) 3 {*cmpsi_ccno_1} (nil) (nil)) (jump_insn 19 18 37 1 (set (pc) (if_then_else (ne (reg:CCZ 17 flags) (const_int 0 [0x0])) (label_ref 34) (pc))) 494 {*jcc_1} (nil) (expr_list:REG_BR_PROB (const_int 5000 [0x1388]) (nil))) ;; End of basic block 1, registers live: (nil) ;; Start of basic block 2, registers live: (nil) (note 37 19 25 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 25 37 32 2 (set (mem/f:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x63f012aee680 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32] (const_int 0 [0x0])) 43 {*movsi_1_nointernunit} (nil) (nil)) ;; End of basic block 2, registers live: (nil) ...to this...: note 36 13 17 1 [bb 1] NOTE_INSN_BASIC_BLOCK) (insn 17 36 18 1 (set (reg:SI 60 [ tui_refreshing_registers ]) (mem/f:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x63f012aee680 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32])) 43 {*movsi_ (nil)) (insn 18 17 42 1 (set (reg:CCZ 17 flags) (compare:CCZ (reg:SI 60 [ tui_refreshing_registers ]) (const_int 0 [0x0]))) 3 {*cmpsi_ccno_1} (nil) (nil)) (insn 42 18 44 1 (set (reg:SI 63 [ tui_refreshing_registers ]) (mem/f:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x63f012aee680 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32])) -1 (nil) (nil)) (insn 44 42 43 1 (set (reg:SI 64) (const_int 0 [0x0])) -1 (nil) (nil)) (insn 43 44 45 1 (set (reg:CCZ 17 flags) (compare:CCZ (reg:SI 60 [ tui_refreshing_registers ]) (const_int 0 [0x0]))) -1 (nil) (nil)) (insn 45 43 46 1 (set (reg:SI 62) (if_then_else:SI (ne (reg:CCZ 17 flags) (const_int 0 [0x0])) (reg:SI 63 [ tui_refreshing_registers ]) (reg:SI 64))) -1 (nil) (nil)) (insn 46 45 32 1 (set (mem/f:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x63f012aee680 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32] (reg:SI 62)) -1 (nil) (nil)) ;; End of basic block 1, registers live: (nil) This does not happen in GCC 4.5.0 (r156286) anymore because the constant 0 is stored directly to a MEM, instead of through a register: (note 7 6 8 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 8 7 9 3 t.c:13 (set (reg:CCZ 17 flags) (compare:CCZ (mem/c/i:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x20000000006080a0 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32]) (const_int 0 [0x0]))) 2 {*cmpsi_ccno_1} (nil)) (jump_insn 9 8 10 3 t.c:13 (set (pc) (if_then_else (ne (reg:CCZ 17 flags) (const_int 0 [0x0])) (label_ref:DI 14) (pc))) 615 {*jcc_1} (expr_list:REG_DEAD (reg:CCZ 17 flags) (expr_list:REG_BR_PROB (const_int 3900 [0xf3c]) (nil))) -> 14) (note 10 9 11 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 11 10 14 4 t.c:16 (set (mem/c/i:SI (symbol_ref:DI ("tui_refreshing_registers") [flags 0x2] <var_decl 0x20000000006080a0 tui_refreshing_registers>) [2 tui_refreshing_registers+0 S4 A32]) (const_int 0 [0x0])) 47 {*movsi_1} (nil)) (code_label 14 11 15 5 1 "" [2 uses]) -- steven at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2010-01-28 11:00:23 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42893