------- Comment #6 from hutchinsonandy at gcc dot gnu dot org 2009-09-27 17:30 ------- Created an attachment (id=18663) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=18663&action=view) Patch to cfgrtl.c commit_one_edge_insertion()
The problem is in cfgrtl.c function commit_one_edge_insertion() It does copy value for phi nodes to previous edge. If it find jump on edge it places copy before it. It assumes that edge is fall thru edge. For a fall thru edge, the last instruction can be anything - specifically a jump just created by RTL expander. The bug has been present since Rev 146817 I have attached patch that correct the problem. Index: cfgrtl.c =================================================================== --- cfgrtl.c (revision 152217) +++ cfgrtl.c (working copy) @@ -1482,8 +1482,9 @@ happens on the fr30 for example. We know this block has a single successor, so we can just emit - the queued insns before the jump. */ - if (JUMP_P (BB_END (bb))) + the queued insns before the jump. Fallthru edges can have + jumps created by RTL expander, so ignore these. */ + if (!(e->flags & EDGE_FALLTHRU) && JUMP_P (BB_END (bb))) before = BB_END (bb); else { -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41440