------- Additional Comments From steven at gcc dot gnu dot org 2004-12-15 13:54 ------- Just so everyone knows, the label disappears in the call to cleanup_cfg from rest_of_handle_if_conversion. The CFG just before looks like this: Basic block 0 (dirty) Predecessors: ENTRY [100.0%] (fallthru) Successors: 7 [100.0%] Basic block 1 Predecessors: 2 [25.0%] (loop_exit) 7 [50.0%] Successors: 7 [100.0%] (fallthru,dfs_back) Basic block 7 (new) Predecessors: 1 [100.0%] (fallthru,dfs_back) 0 [100.0%] Successors: 1 [50.0%] 2 [50.0%] (fallthru) Basic block 2 Predecessors: 7 [50.0%] (fallthru) 4 [100.0%] (dfs_back) Successors: 4 [25.0%] 1 [25.0%] (loop_exit) 5 [25.0%] (loop_exit) 3 [25.0%] (loop_exit) Basic block 3 Predecessors: 2 [25.0%] (loop_exit) Successors: 6 [100.0%] Basic block 4 Predecessors: 2 [25.0%] Successors: 2 [100.0%] (dfs_back) Basic block 5 Predecessors: 2 [25.0%] (loop_exit) Successors: 6 [100.0%] (fallthru) Basic block 6 Predecessors: 3 [100.0%] 5 [100.0%] (fallthru) Successors: EXIT [100.0%] (fallthru) and the RTL looks like this: (gdb) p debug_rtx_list (get_insns (), max_uid) (note 2 0 20 NOTE_INSN_DELETED) (note 20 2 6 0 [bb 0] NOTE_INSN_BASIC_BLOCK) (insn 6 20 9 0 (set (reg/v:SI 61 [ i ]) (mem/i:SI (reg/f:SI 16 argp) [3 i+0 S4 A32])) 42 {*movsi_1_nointernunit} (nil) (expr_list:REG_EQUIV (mem/i:SI (reg/f:SI 16 argp) [3 i+0 S4 A32]) (nil))) (insn 9 6 15 0 (parallel [ (set (reg/f:SI 7 sp) (and:SI (reg/f:SI 7 sp) (const_int -16 [0xfffffffffffffff0]))) (clobber (reg:CC 17 flags)) ]) 289 {*andsi_1} (nil) (nil)) (insn 15 9 7 0 (parallel [ (set (reg/f:SI 7 sp) (plus:SI (reg/f:SI 7 sp) (const_int -16 [0xfffffffffffffff0]))) (clobber (reg:CC 17 flags)) ]) 199 {*addsi_1} (nil) (nil)) (note 7 15 22 0 NOTE_INSN_FUNCTION_BEG) (insn 22 7 73 0 (set (reg/v:SI 59 [ lsm_tmp1 ]) (reg/v:SI 61 [ i ])) 42 {*movsi_1_nointernunit} (nil) (nil)) (note 73 22 78 0 NOTE_INSN_LOOP_BEG) (insn 78 73 84 0 (set (reg:SI 75) (mem/u/c:SI (plus:SI (mult:SI (reg/v:SI 61 [ i ]) (const_int 4 [0x4])) (label_ref:SI 32)) [0 S4 A8])) 42 {*movsi_1_nointernunit} (nil) (insn_list:REG_LABEL 32 (nil))) (jump_insn 84 78 85 0 (set (pc) (label_ref 83)) -1 (nil) (nil)) (barrier 85 84 70) (code_label 70 85 69 1 9 "" [3 uses]) (note 69 70 83 1 [bb 1] NOTE_INSN_BASIC_BLOCK) (code_label 83 69 82 7 11 "" [1 uses]) (note 82 83 26 7 [bb 7] NOTE_INSN_BASIC_BLOCK) (insn 26 82 27 7 (set (reg:CC 17 flags) (compare:CC (reg/v:SI 59 [ lsm_tmp1 ]) (const_int 5 [0x5]))) 5 {*cmpsi_1_insn} (nil) (nil)) (jump_insn 27 26 80 7 (set (pc) (if_then_else (gtu (reg:CC 17 flags) (const_int 0 [0x0])) (label_ref 70) (pc))) 486 {*jcc_1} (nil) (expr_list:REG_BR_PROB (const_int 5000 [0x1388]) (nil))) (code_label 80 27 66 2 10 "" [1 uses]) (note 66 80 30 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (jump_insn 30 66 31 2 (parallel [ (set (pc) (reg:SI 75)) (use (label_ref 32)) ]) 503 {*tablejump_1} (nil) (nil)) (barrier 31 30 32) (code_label 32 31 33 6 "" [2 uses]) (jump_insn 33 32 34 (addr_vec:SI [ (label_ref:SI 35) (label_ref:SI 35) (label_ref/s:SI 46) (label_ref/s:SI 46) (label_ref:SI 70) (label_ref:SI 40) ]) -1 (nil) (nil)) (barrier 34 33 35) (code_label 35 34 36 3 3 "" [2 uses]) (note 36 35 37 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 37 36 38 3 (set (reg/v:SI 58 [ D1127 ]) (const_int 1 [0x1])) 42 {*movsi_1_nointernunit} (nil) (nil)) (jump_insn 38 37 39 3 (set (pc) (label_ref/s 50)) -1 (nil) (nil)) (barrier 39 38 40) (code_label 40 39 41 4 5 "" [1 uses]) (note 41 40 42 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 42 41 79 4 (set (reg/v:SI 59 [ lsm_tmp1 ]) (const_int 4 [0x4])) 42 {*movsi_1_nointernunit} (nil) (nil)) (insn 79 42 81 4 (set (reg:SI 75) (label_ref:SI 70)) 42 {*movsi_1_nointernunit} (nil) (insn_list:REG_LABEL 70 (nil))) (insn 81 79 43 4 (set (reg:CC 17 flags) (compare:CC (reg/v:SI 59 [ lsm_tmp1 ]) (const_int 5 [0x5]))) -1 (nil) (nil)) (jump_insn 43 81 44 4 (set (pc) (label_ref 80)) 500 {jump} (nil) (nil)) (barrier 44 43 74) (note 74 44 46 NOTE_INSN_LOOP_END) (code_label 46 74 47 5 4 ("L3") [2 uses]) (note 47 46 48 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 48 47 50 5 (set (reg/v:SI 58 [ D1127 ]) (const_int 0 [0x0])) 42 {*movsi_1_nointernunit} (nil) (nil)) (code_label 50 48 51 6 7 ("L7") [1 uses]) (note 51 50 55 6 [bb 6] NOTE_INSN_BASIC_BLOCK) (note 55 51 58 6 NOTE_INSN_FUNCTION_END) (insn 58 55 64 6 (set (reg/i:SI 0 ax [ <result> ]) (reg/v:SI 58 [ D1127 ])) 42 {*movsi_1_nointernunit} (nil) (nil)) (insn 64 58 0 6 (use (reg/i:SI 0 ax [ <result> ])) -1 (nil) (nil)) $15 = void The code_label that disappears is: (gdb) p debug_rtx_find (get_insns (), 70) (code_label 70 85 69 1 9 "" [3 uses]) The three references to the label are: (jump_insn 27 26 80 7 (set (pc) (if_then_else (gtu (reg:CC 17 flags) (const_int 0 [0x0])) (label_ref 70) (pc))) 486 {*jcc_1} (nil) (expr_list:REG_BR_PROB (const_int 5000 [0x1388]) (nil))) (jump_insn 33 32 34 (addr_vec:SI [ (label_ref:SI 35) (label_ref:SI 35) (label_ref/s:SI 46) (label_ref/s:SI 46) (label_ref:SI 70) (label_ref:SI 40) ]) -1 (nil) (nil)) (insn 79 42 81 4 (set (reg:SI 75) (label_ref:SI 70)) 42 {*movsi_1_nointernunit} (nil) (insn_list:REG_LABEL 70 (nil)))
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18628