I've got a number of test cases that are all failing in the same place: #1 0x081cf498 in purge_dead_edges (bb=0xb7f67834) at ../../gcc/gcc/cfgrtl.c:2332 2332 gcc_assert (single_succ_p (bb));
(similar to http://gcc.gnu.org/ml/gcc/2008-04/msg00473.html but I'm using trunk) What's up here? I don't see these types of crashes in the 4.3 branch. Example: Executing on host: /sata/dj/gnu/gcc/m32c-elf/gcc/xgcc -B/sata/dj/gnu/gcc/m32c-elf/gcc/ /sata/dj/gnu/gcc/gcc/gcc/testsuite/gcc.dg/duff-1.c -O2 -DSTACK_SIZE=4096 -DNO_TRAMPOLINES -fno-show-column -msim -lm -mcpu=m16c -o ./duff-1.exe (timeout = 30) /sata/dj/gnu/gcc/gcc/gcc/testsuite/gcc.dg/duff-1.c: In function 'duffcpy': /sata/dj/gnu/gcc/gcc/gcc/testsuite/gcc.dg/duff-1.c:36: internal compiler error: in purge_dead_edges, at cfgrtl.c:2332 The BB looks like this: ;; basic block 20, loop depth 0, count 0 ;; prev block 19, next block 3 ;; pred: ;; succ: (code_label 31 30 83 20 8 "" [2 uses]) (note 83 31 32 20 [bb 20] NOTE_INSN_BASIC_BLOCK) and the insns look like this (full listing also attached): (note 82 28 29 19 [bb 19] NOTE_INSN_BASIC_BLOCK) (jump_insn 29 82 30 19 dj.c:19 (set (pc) (label_ref 32)) -1 (nil)) (barrier 30 29 31) (code_label 31 30 83 20 8 "" [2 uses]) (note 83 31 32 20 [bb 20] NOTE_INSN_BASIC_BLOCK) (code_label 32 83 33 3 5 "" [2 uses]) (note 33 32 34 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 34 33 35 3 dj.c:25 (set (reg:QI 30) ------------------------------------------------------------------------------ (note 1 0 6 NOTE_INSN_DELETED) (note 6 1 2 9 [bb 9] NOTE_INSN_BASIC_BLOCK) (insn 2 6 3 9 dj.c:18 (set (reg/v/f:HI 25 [ dst ]) (reg:HI 2 r1 [ dst ])) -1 (nil)) (insn 3 2 4 9 dj.c:18 (set (reg/v/f:HI 26 [ src ]) (reg:HI 1 r2 [ src ])) -1 (nil)) (insn 4 3 5 9 dj.c:18 (set (reg/v:SI 27 [ size ]) (mem/c/i:SI (reg/f:HI 20 virtual-incoming-args) [2 size+0 S4 A8])) -1 (expr_list:REG_EQUIV (mem/c/i:SI (reg/f:HI 20 virtual-incoming-args) [2 size+0 S4 A8]) (nil))) (note 5 4 7 9 NOTE_INSN_FUNCTION_BEG) (note 7 5 8 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 8 7 9 2 dj.c:19 (set (reg:SI 28) (and:SI (reg/v:SI 27 [ size ]) (const_int 3 [0x3]))) -1 (nil)) (jump_insn 9 8 74 2 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 0) (const_int 1 [0x1])) (label_ref 13) (pc))) -1 (nil)) (note 74 9 10 11 [bb 11] NOTE_INSN_BASIC_BLOCK) (jump_insn 10 74 75 11 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 2) (const_int 0 [0x0])) (label_ref 13) (pc))) -1 (nil)) (note 75 10 11 12 [bb 12] NOTE_INSN_BASIC_BLOCK) (jump_insn 11 75 12 12 dj.c:19 (set (pc) (label_ref 44)) -1 (nil)) (barrier 12 11 13) (code_label 13 12 76 13 6 "" [2 uses]) (note 76 13 14 13 [bb 13] NOTE_INSN_BASIC_BLOCK) (insn 14 76 15 13 dj.c:19 (set (mem:HI (pre_dec:HI (reg/f:HI 8 sp)) [0 S2 A8]) (const_int 0 [0x0])) -1 (nil)) (insn 15 14 16 13 dj.c:19 (set (mem:HI (pre_dec:HI (reg/f:HI 8 sp)) [0 S2 A8]) (const_int 1 [0x1])) -1 (nil)) (insn 16 15 17 13 dj.c:19 (set (mem:HI (pre_dec:HI (reg/f:HI 8 sp)) [0 S2 A8]) (subreg:HI (reg:SI 28) 2)) -1 (nil)) (insn 17 16 18 13 dj.c:19 (set (mem:HI (pre_dec:HI (reg/f:HI 8 sp)) [0 S2 A8]) (subreg:HI (reg:SI 28) 0)) -1 (nil)) (insn 18 17 19 13 dj.c:19 (set (reg/f:HI 29) (symbol_ref:HI ("__ucmpsi2") [flags 0x41])) -1 (nil)) (call_insn/u 19 18 20 13 dj.c:19 (parallel [ (set (reg:HI 0 r0) (call (mem:QI (reg/f:HI 29) [0 S1 A8]) (const_int 8 [0x8]))) (use (const_int 0 [0x0])) ]) -1 (expr_list:REG_EH_REGION (const_int 0 [0x0]) (nil)) (expr_list:REG_DEP_TRUE (use (mem:SI (plus:HI (reg/f:HI 23 virtual-outgoing-args) (scratch:HI)) [0 S4 A8])) (expr_list:REG_DEP_TRUE (use (mem:SI (plus:HI (reg/f:HI 23 virtual-outgoing-args) (scratch:HI)) [0 S4 A8])) (nil)))) (insn 20 19 21 13 dj.c:19 (set (reg/f:HI 8 sp) (plus:HI (reg/f:HI 8 sp) (const_int 8 [0x8]))) -1 (nil)) (jump_insn 21 20 77 13 dj.c:19 (set (pc) (if_then_else (ltu (reg:HI 0 r0) (const_int 1 [0x1])) (label_ref 50) (pc))) -1 (nil)) (note 77 21 22 14 [bb 14] NOTE_INSN_BASIC_BLOCK) (jump_insn 22 77 78 14 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 0) (const_int 2 [0x2])) (label_ref 26) (pc))) -1 (nil)) (note 78 22 23 15 [bb 15] NOTE_INSN_BASIC_BLOCK) (jump_insn 23 78 79 15 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 2) (const_int 0 [0x0])) (label_ref 26) (pc))) -1 (nil)) (note 79 23 24 16 [bb 16] NOTE_INSN_BASIC_BLOCK) (jump_insn 24 79 25 16 dj.c:19 (set (pc) (label_ref 38)) -1 (nil)) (barrier 25 24 26) (code_label 26 25 80 17 7 "" [2 uses]) (note 80 26 27 17 [bb 17] NOTE_INSN_BASIC_BLOCK) (jump_insn 27 80 81 17 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 0) (const_int 3 [0x3])) (label_ref 31) (pc))) -1 (nil)) (note 81 27 28 18 [bb 18] NOTE_INSN_BASIC_BLOCK) (jump_insn 28 81 82 18 dj.c:19 (set (pc) (if_then_else (ne (subreg:HI (reg:SI 28) 2) (const_int 0 [0x0])) (label_ref 31) (pc))) -1 (nil)) (note 82 28 29 19 [bb 19] NOTE_INSN_BASIC_BLOCK) (jump_insn 29 82 30 19 dj.c:19 (set (pc) (label_ref 32)) -1 (nil)) (barrier 30 29 31) (code_label 31 30 83 20 8 "" [2 uses]) (note 83 31 32 20 [bb 20] NOTE_INSN_BASIC_BLOCK) (code_label 32 83 33 3 5 "" [2 uses]) (note 33 32 34 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 34 33 35 3 dj.c:25 (set (reg:QI 30) (mem:QI (reg/v/f:HI 26 [ src ]) [0 S1 A8])) -1 (nil)) (insn 35 34 36 3 dj.c:25 (set (mem:QI (reg/v/f:HI 25 [ dst ]) [0 S1 A8]) (reg:QI 30)) -1 (nil)) (insn 36 35 37 3 dj.c:25 (set (reg/v/f:HI 25 [ dst ]) (plus:HI (reg/v/f:HI 25 [ dst ]) (const_int 1 [0x1]))) -1 (nil)) (insn 37 36 38 3 dj.c:25 (set (reg/v/f:HI 26 [ src ]) (plus:HI (reg/v/f:HI 26 [ src ]) (const_int 1 [0x1]))) -1 (nil)) (code_label 38 37 39 4 4 "" [1 uses]) (note 39 38 40 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 40 39 41 4 dj.c:27 (set (reg:QI 31) (mem:QI (reg/v/f:HI 26 [ src ]) [0 S1 A8])) -1 (nil)) (insn 41 40 42 4 dj.c:27 (set (mem:QI (reg/v/f:HI 25 [ dst ]) [0 S1 A8]) (reg:QI 31)) -1 (nil)) (insn 42 41 43 4 dj.c:27 (set (reg/v/f:HI 25 [ dst ]) (plus:HI (reg/v/f:HI 25 [ dst ]) (const_int 1 [0x1]))) -1 (nil)) (insn 43 42 44 4 dj.c:27 (set (reg/v/f:HI 26 [ src ]) (plus:HI (reg/v/f:HI 26 [ src ]) (const_int 1 [0x1]))) -1 (nil)) (code_label 44 43 45 5 3 "" [1 uses]) (note 45 44 46 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 46 45 47 5 dj.c:29 (set (reg:QI 32) (mem:QI (reg/v/f:HI 26 [ src ]) [0 S1 A8])) -1 (nil)) (insn 47 46 48 5 dj.c:29 (set (mem:QI (reg/v/f:HI 25 [ dst ]) [0 S1 A8]) (reg:QI 32)) -1 (nil)) (insn 48 47 49 5 dj.c:29 (set (reg/v/f:HI 25 [ dst ]) (plus:HI (reg/v/f:HI 25 [ dst ]) (const_int 1 [0x1]))) -1 (nil)) (insn 49 48 50 5 dj.c:29 (set (reg/v/f:HI 26 [ src ]) (plus:HI (reg/v/f:HI 26 [ src ]) (const_int 1 [0x1]))) -1 (nil)) (code_label 50 49 51 6 2 "" [1 uses]) (note 51 50 52 6 [bb 6] NOTE_INSN_BASIC_BLOCK) (jump_insn 52 51 53 6 dj.c:31 (set (pc) (if_then_else (ne (subreg:HI (reg/v:SI 27 [ size ]) 2) (const_int 0 [0x0])) (label_ref 58) (pc))) -1 (nil)) (jump_insn 53 52 54 6 dj.c:31 (set (pc) (if_then_else (ne (subreg:HI (reg/v:SI 27 [ size ]) 2) (const_int 0 [0x0])) (label_ref 67) (pc))) -1 (nil)) (jump_insn 54 53 55 6 dj.c:31 (set (pc) (if_then_else (gtu (subreg:HI (reg/v:SI 27 [ size ]) 0) (const_int 3 [0x3])) (label_ref 58) (pc))) -1 (nil)) (jump_insn 55 54 56 6 dj.c:31 (set (pc) (if_then_else (ne (subreg:HI (reg/v:SI 27 [ size ]) 0) (const_int 3 [0x3])) (label_ref 67) (pc))) -1 (nil)) (jump_insn 56 55 57 6 dj.c:31 (set (pc) (label_ref 67)) -1 (nil)) (barrier 57 56 58) (code_label 58 57 59 6 10 "" [2 uses]) (note 59 58 60 7 [bb 7] NOTE_INSN_BASIC_BLOCK) (insn 60 59 61 7 dj.c:33 (set (reg/v:SI 27 [ size ]) (plus:SI (reg/v:SI 27 [ size ]) (const_int -4 [0xfffffffc]))) -1 (nil)) (insn 61 60 62 7 dj.c:23 (set (reg:QI 33) (mem:QI (reg/v/f:HI 26 [ src ]) [0 S1 A8])) -1 (nil)) (insn 62 61 63 7 dj.c:23 (set (mem:QI (reg/v/f:HI 25 [ dst ]) [0 S1 A8]) (reg:QI 33)) -1 (nil)) (insn 63 62 64 7 dj.c:23 (set (reg/v/f:HI 25 [ dst ]) (plus:HI (reg/v/f:HI 25 [ dst ]) (const_int 1 [0x1]))) -1 (nil)) (insn 64 63 65 7 dj.c:23 (set (reg/v/f:HI 26 [ src ]) (plus:HI (reg/v/f:HI 26 [ src ]) (const_int 1 [0x1]))) -1 (nil)) (jump_insn 65 64 66 7 dj.c:23 (set (pc) (label_ref 32)) -1 (nil)) (barrier 66 65 67) (code_label 67 66 68 8 9 "" [3 uses]) (note 68 67 73 8 [bb 8] NOTE_INSN_BASIC_BLOCK) (note 73 68 70 10 [bb 10] NOTE_INSN_BASIC_BLOCK) (jump_insn 70 73 71 10 dj.c:36 (set (pc) (label_ref 72)) -1 (nil)) (barrier 71 70 69) (code_label 69 71 72 10 1 "" [0 uses]) (code_label 72 69 0 10 11 "" [1 uses]) (nil)