This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/18628] [4.0 regression] miscompilation of switch statement in loop
- From: "steven at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Dec 2004 13:54:09 -0000
- Subject: [Bug middle-end/18628] [4.0 regression] miscompilation of switch statement in loop
- References: <20041123151338.18628.micis@gmx.de>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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