This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: ICE in fixup_reorder_chain, at bb-reorder.c:633


> On Thu, Sep 07, 2000 at 01:47:51PM -0400, John David Anglin wrote:
> > #ifdef CASE_DROPS_THROUGH
> > 	      /* Except for VAX.  Since we didn't have predication for the
> > 		 tablejump, the fallthru block should not have moved.  */
> > 	      if (RBI (bb)->index + 1 == RBI (e_fall->dest)->index)
> > 		continue;
> > #endif
> > 	      abort ();
> > 	    }
> > 
> > On the vax, CASE_DROPS_THROUGH is defined.  The comment states that the
> > fallthru block can move on the vax and cause an abort.
> 
> Nay, the comment says *must* have moved such that it's now still
> contiguous.

After looking at this, it became apparent that the "fallthru" block is
the same as the block for the casesi insn.

> One possible fix is to add an additional jump after the case to go
> to the correct block.  You should, however, investigate where the
> block did wind up, and whether that choice made sense.  

The documentation says in describing the casesi insn:

   A label to jump to if the index has a value outside the bounds.
   (If the machine-description macro @code{CASE_DROPS_THROUGH} is defined,
   then an out-of-bounds index drops through to the code following
   the jump table instead of jumping to this label.  In that case,
   this label is not actually used by the @samp{casesi} instruction,
   but it is always provided as an operand.)

I think bb-reorder is confused here.  If a jump is required when the
block with casesi insn is moved, then fixup_reorder_chain should
provide for it.

I have appended the C code, and the relevant rtl output from the
preceding ce2 and the bb-reorder passes.

Dave
-- 
J. David Anglin                                  dave.anglin@nrc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6605)


The `switch (*cur++)' statement in cpplex.c is the one that causes the problem.

	case '?':
	  if (cur + 1 < buffer->rlimit && *cur == '?'
	      && _cpp_trigraph_map[cur[1]] && trigraph_ok (pfile, cur + 1))
	    {
	      /* Handle trigraph.  */
	      cur++;
	      switch (*cur++)
		{
		case '(': goto make_open_square;
		case ')': goto make_close_square;
		case '<': goto make_open_brace;
		case '>': goto make_close_brace;
		case '=': goto make_hash;
		case '!': goto make_or;
		case '-': goto make_complement;
		case '/': goto make_backslash;
		case '\'': goto make_xor;
		}
	    }
	  if (IMMED_TOKEN () && CPP_OPTION (pfile, cplusplus))
	    {

Here is the rtl for basic block 206:

;; Function lex_line

...

(note 1874 1873 2606 ("../../gcc/cpplex.c") 1693 -1347440721)

;; Start of basic block 206, registers live: 5 [r5] 6 [r6] 7 [r7] 8 [r8] 12 [ap] 13 [fp] 14 [sp]
(note 2606 1874 1878 [bb 206] NOTE_INSN_BASIC_BLOCK -1347440721)

(note 1878 2606 2954 ("../../gcc/cpplex.c") 1694 -1347440721)

(insn 2954 1878 2955 (set (reg:SI 3 r3)
        (reg:SI 6 r6)) 16 {movsi} (nil)
    (expr_list:REG_DEAD (reg:SI 6 r6)
        (nil)))

(insn 2955 2954 1919 (set (mem:SI (plus:SI (reg:SI 13 fp)
                (const_int -8 [0xfffffff8])) 0)
        (plus:SI (reg:SI 3 r3)
            (const_int 1 [0x1]))) 47 {addsi3} (insn_list 2954 (nil))
    (nil))

(insn 1919 2955 1920 (set (reg:SI 0 r0)
        (zero_extend:SI (mem:QI (post_inc:SI (reg:SI 3 r3)) 0))) 32 {zero_extendqisi2} (insn_list 1877 (nil))
    (expr_list:REG_UNUSED (reg:SI 3 r3)
        (expr_list:REG_INC (reg:SI 3 r3)
            (nil))))

(note 1920 1919 1922 NOTE_INSN_DELETED 0)

(jump_insn 1922 1920 1923 (set (pc)
        (if_then_else (leu (minus:SI (reg:SI 0 r0)
                    (const_int 33 [0x21]))
                (const_int 29 [0x1d]))
            (plus:SI (sign_extend:SI (mem:HI (plus:SI (pc)
                            (mult:SI (minus:SI (reg:SI 0 r0)
                                    (const_int 33 [0x21]))
                                (const_int 2 [0x2]))) 0))
                (label_ref:SI 1923))
            (pc))) 142 {casesi1} (insn_list 1919 (insn_list 1919 (nil)))
    (expr_list:REG_DEAD (reg:SI 0 r0)
        (nil)))
;; End of basic block 206, registers live:
 5 [r5] 7 [r7] 8 [r8] 12 [ap] 13 [fp] 14 [sp]

;; Insn is not within a basic block
(code_label 1923 1922 1924 709 "" "" [1 uses])

;; Insn is not within a basic block
(jump_insn 1924 1923 1879 (addr_diff_vec:HI (label_ref:SI 1923)
        [ 
            (label_ref:SI 1538)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 2026)
            (label_ref:SI 2050)
            (label_ref:SI 2058)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 2018)
            (label_ref:SI 1929)
            (label_ref:SI 2066)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 1929)
            (label_ref:SI 2034)
            (label_ref:SI 1400)
            (label_ref:SI 2042)
        ] 
        (const_int 0 [0x0])
        (const_int 0 [0x0])) -1 (nil)
    (nil))

(note 1879 1924 1886 ("../../gcc/cpplex.c") 1696 -1347440721)

(note 1886 1879 1890 ("../../gcc/cpplex.c") 1697 -1347440721)

(note 1890 1886 1894 ("../../gcc/cpplex.c") 1698 -1347440721)

(note 1894 1890 1898 ("../../gcc/cpplex.c") 1699 -1347440721)

(note 1898 1894 1902 ("../../gcc/cpplex.c") 1700 -1347440721)

(note 1902 1898 1906 ("../../gcc/cpplex.c") 1701 -1347440721)

(note 1906 1902 1910 ("../../gcc/cpplex.c") 1702 -1347440721)

(note 1910 1906 1914 ("../../gcc/cpplex.c") 1703 -1347440721)

(note 1914 1910 1917 ("../../gcc/cpplex.c") 1704 -1347440721)

(note 1917 1914 1928 ("../../gcc/cpplex.c") 1705 -1347440721)

(note 1928 1917 1929 ("../../gcc/cpplex.c") 1706 -1347440721)

;; Start of basic block 207, registers live: 5 [r5] 7 [r7] 8 [r8] 12 [ap] 13 [fp] 14 [sp]
(code_label 1929 1928 2607 686 "" "" [25 uses])

(note 2607 1929 1930 [bb 207] NOTE_INSN_BASIC_BLOCK -1347440721)

(note 1930 2607 1931 ("../../gcc/cpplex.c") 1707 -1347440721)

Here is the bb-reorder output:

;; Function lex_line

Reordering block 2 (1) after 0 (0)
Reordering block 5 (3) after 3 (2)
Reordering block 13 (6) after 7 (5)
Reordering block 233 (8) after 14 (7)
Reordering block 241 (12) after 236 (11)
Reordering block 247 (13) after 241 (12)
Reordering block 256 (14) after 247 (13)
Reordering block 259 (16) after 257 (15)
Reordering block 258 (19) after 261 (18)
Reordering block 248 (20) after 258 (19)
Reordering block 254 (25) after 252 (24)
Reordering block 253 (27) after 255 (26)
Reordering block 242 (28) after 253 (27)
Reordering block 246 (31) after 244 (30)
Reordering block 245 (32) after 246 (31)
Reordering block 237 (33) after 245 (32)
Reordering block 117 (37) after 240 (36)
Reordering block 120 (39) after 118 (38)
Reordering block 130 (40) after 120 (39)
Reordering block 138 (41) after 130 (40)
Reordering block 131 (43) after 139 (42)
Reordering block 121 (50) after 137 (49)
Reordering block 129 (51) after 121 (50)
Reordering block 122 (52) after 129 (51)
Reordering block 128 (55) after 124 (54)
Reordering block 125 (56) after 128 (55)
Reordering block 29 (59) after 127 (58)
Reordering block 32 (60) after 29 (59)
Reordering block 30 (61) after 32 (60)
Reordering block 39 (63) after 31 (62)
Reordering block 42 (64) after 39 (63)
Reordering block 44 (65) after 42 (64)
Reordering block 43 (66) after 44 (65)
Reordering block 40 (67) after 43 (66)
Reordering block 119 (69) after 41 (68)
Reordering block 227 (70) after 119 (69)
Reordering block 49 (71) after 227 (70)
Reordering block 53 (72) after 49 (71)
Reordering block 58 (74) after 54 (73)
Reordering block 55 (75) after 58 (74)
Reordering block 50 (78) after 57 (77)
Reordering block 144 (81) after 52 (80)
Reordering block 148 (82) after 144 (81)
Reordering block 145 (83) after 148 (82)
Reordering block 232 (86) after 147 (85)
Reordering block 33 (87) after 232 (86)
Reordering block 38 (89) after 34 (88)
Reordering block 35 (90) after 38 (89)
Reordering block 193 (93) after 37 (92)
Reordering block 197 (94) after 193 (93)
Reordering block 194 (95) after 197 (94)
Reordering block 159 (98) after 196 (97)
Reordering block 162 (99) after 159 (98)
Reordering block 160 (100) after 162 (99)
Reordering block 45 (102) after 161 (101)
Reordering block 230 (106) after 48 (105)
Reordering block 91 (108) after 231 (107)
Reordering block 116 (109) after 91 (108)
Reordering block 92 (110) after 116 (109)
Reordering block 111 (111) after 92 (110)
Reordering block 114 (113) after 112 (112)
Reordering block 113 (115) after 115 (114)
Reordering block 93 (116) after 113 (115)
Reordering block 109 (119) after 95 (118)
Reordering block 96 (121) after 110 (120)
Reordering block 104 (128) after 102 (127)
Reordering block 107 (130) after 105 (129)
Reordering block 106 (132) after 108 (131)
Reordering block 103 (133) after 106 (132)
Reordering block 167 (134) after 103 (133)
Reordering block 170 (135) after 167 (134)
Reordering block 168 (136) after 170 (135)
Reordering block 228 (138) after 169 (137)
Reordering block 140 (139) after 228 (138)
Reordering block 143 (140) after 140 (139)
Reordering block 141 (141) after 143 (140)
Reordering block 214 (143) after 142 (142)
Reordering block 219 (144) after 214 (143)
Reordering block 215 (145) after 219 (144)
Reordering block 59 (149) after 218 (148)
Reordering block 90 (150) after 59 (149)
Reordering block 60 (151) after 90 (150)
Reordering block 72 (155) after 63 (154)
Reordering block 88 (158) after 74 (157)
Reordering block 75 (160) after 89 (159)
Reordering block 83 (167) after 81 (166)
Reordering block 86 (169) after 84 (168)
Reordering block 85 (171) after 87 (170)
Reordering block 82 (172) after 85 (171)
Reordering block 64 (173) after 82 (172)
Reordering block 15 (181) after 71 (180)
Reordering block 18 (182) after 15 (181)
Reordering block 28 (186) after 21 (185)
Reordering block 22 (187) after 28 (186)
Reordering block 27 (191) after 25 (190)
Reordering block 26 (192) after 27 (191)
Reordering block 16 (193) after 26 (192)
Reordering block 149 (195) after 17 (194)
Reordering block 158 (196) after 149 (195)
Reordering block 150 (197) after 158 (196)
Reordering block 153 (198) after 150 (197)
Reordering block 156 (200) after 154 (199)
Reordering block 155 (202) after 157 (201)
Reordering block 151 (203) after 155 (202)
Reordering block 229 (205) after 152 (204)
Reordering block 186 (206) after 229 (205)
Reordering block 189 (207) after 186 (206)
Reordering block 187 (211) after 192 (210)
Reordering block 171 (213) after 188 (212)
Reordering block 174 (214) after 171 (213)
Reordering block 172 (215) after 174 (214)
Reordering block 175 (217) after 173 (216)
Reordering block 185 (218) after 175 (217)
Reordering block 176 (219) after 185 (218)
Reordering block 178 (220) after 176 (219)
Reordering block 180 (221) after 178 (220)
Reordering block 183 (223) after 181 (222)
Reordering block 182 (225) after 184 (224)
Reordering block 179 (226) after 182 (225)
Reordering block 177 (227) after 179 (226)
Reordering block 198 (228) after 177 (227)
Reordering block 207 (230) after 199 (229)
Reordering block 213 (231) after 207 (230)
Reordering block 208 (232) after 213 (231)
Reordering block 211 (234) after 209 (233)
Reordering block 210 (236) after 212 (235)
Reordering block 200 (237) after 210 (236)
Reordering block 205 (241) after 203 (240)
Reordering block 163 (243) after 206 (242)
Reordering block 166 (244) after 163 (243)
Reordering block 164 (245) after 166 (244)
Reordering block 221 (247) after 165 (246)
Reordering block 224 (248) after 221 (247)
Reordering block 220 (250) after 225 (249)
Reordering block 226 (251) after 220 (250)
Reordering block 222 (252) after 226 (251)
Reordering block 204 (254) after 223 (253)
Reordering block 8 (255) after 204 (254)
Reordering block 11 (256) after 8 (255)
Reordering block 9 (258) after 12 (257)
Reordering block 4 (260) after 10 (259)
Reordering block 1 (261) after 4 (260)
Emitting label for block 1 (261)
Emitting label for block 4 (260)
Emitting label for block 8 (255)
Removing jump in block 14 (7)
Emitting label for block 237 (33)
Emitting label for block 242 (28)
Emitting label for block 248 (20)
Emitting label for block 258 (19)
Emitting jump to block 262 (262)
Emitting jump to block 259 (16)
Emitting label for block 253 (28)
Emitting label for block 245 (33)
Emitting jump to block 247 (13)
Emitting jump to block 246 (32)
Emitting label for block 119 (70)
Emitting label for block 121 (51)
Emitting label for block 131 (44)
Emitting jump to block 138 (42)
Emitting label for block 122 (53)
Emitting label for block 125 (57)
Emitting jump to block 128 (56)
Emitting label for block 30 (62)
Emitting jump to block 32 (61)
Emitting label for block 40 (68)
Emitting label for block 43 (67)
Emitting jump to block 44 (66)
Emitting jump to block 42 (65)
Emitting jump to block 120 (40)
Emitting label for block 50 (79)
Emitting label for block 55 (76)
Emitting jump to block 58 (75)
Emitting label for block 145 (84)
Emitting label for block 35 (91)
Emitting jump to block 39 (64)
Emitting label for block 194 (96)
Emitting jump to block 197 (95)
Emitting label for block 160 (101)
Emitting label for block 92 (111)
Emitting label for block 93 (117)
Emitting label for block 113 (116)
Emitting jump to block 116 (110)
Emitting label for block 96 (122)
Emitting label for block 103 (134)
Emitting label for block 106 (133)
Emitting jump to block 104 (129)
Emitting label for block 168 (137)
Emitting label for block 141 (142)
Emitting label for block 215 (146)
Emitting label for block 60 (152)
Emitting label for block 75 (161)
Emitting label for block 82 (173)
Emitting label for block 85 (172)
Emitting jump to block 83 (168)
Emitting jump to block 72 (156)
Emitting label for block 16 (194)
Emitting label for block 22 (188)
Emitting jump to block 29 (60)
Emitting label for block 26 (193)
Emitting jump to block 28 (187)
Emitting jump to block 27 (192)
Emitting jump to block 18 (183)
Emitting label for block 150 (199)
Emitting label for block 151 (205)
Emitting label for block 155 (204)
Emitting label for block 187 (213)
Emitting label for block 172 (217)
Emitting label for block 176 (221)
Emitting label for block 177 (229)
Emitting label for block 179 (228)
Emitting label for block 182 (227)
Emitting jump to block 185 (220)
Emitting label for block 200 (239)
Emitting label for block 208 (234)
Emitting label for block 210 (238)
Removing jump in block 203 (242)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]