------- Additional Comments From dalej at gcc dot gnu dot org 2005-05-16 21:44 ------- OK, what happens is that tail call creates a block 0 with multiple predecessors, and the out-of-ssa pass mangles that into this form:
# BLOCK 0 # PRED: 9 [14.9%] (true,exec) 1 [29.0%] (true,exec) <L37>:; posD.1132 = aposD.1138; # SUCC: 12 [100.0%] (fallthru) # BLOCK 12 # PRED: 0 [100.0%] (fallthru) ENTRY [100.0%] (fallthru,exec) <L38>:; *((intD.0 *) ((unsigned intD.3) posD.1132 * 4) + mrD.1133) = 1; where ENTRY no longer falls into block 0, but is expected to jump to block 12. Expand has no idea such a thing is possible and falls through anyway. While it's not obvious in 4.0 branch, the addition of a verify_flow_info failure in mainline makes it apparent this is not supposed to happen. One way to fix this is change tailcall so it splits block 0 instead of creating multiple predecessors for it. I'll go do that unless somebody has a better idea. -- What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |dalej at gcc dot gnu dot org |dot org | Status|NEW |ASSIGNED http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21562