While experimenting with a patch to use conditional returns, I hit a case
where a conditional jump between hot and cold sections was being converted
into a conditional return. The new jump still had the REG_CROSSING_JUMP
and later passes were confused by the combination of that and a return
JUMP_LABEL.
The jump is now returning directly from the current section rather than
crossing sections within the function, so I think we should just drop
the note.
Tested on s390x-linux-gnu with some local patches. OK to install?
Thanks,
Richard
gcc/
* jump.c (redirect_jump_2): Remove REG_CROSSING_JUMP notes when
converting a conditional jump into a conditional return.
Index: gcc/jump.c
===================================================================
--- gcc/jump.c 2014-01-03 15:06:10.516727719 +0000
+++ gcc/jump.c 2014-01-14 10:27:13.224173269 +0000
@@ -1580,6 +1580,16 @@ redirect_jump_2 (rtx jump, rtx olabel, r
}
}
+ /* Handle the case where we had a conditional crossing jump to a return
+ label and are now changing it into a direct conditional return.
+ The jump is no longer crossing in that case. */
+ if (ANY_RETURN_P (nlabel))
+ {
+ note = find_reg_note (jump, REG_CROSSING_JUMP, NULL_RTX);
+ if (note)
+ remove_note (jump, note);
+ }
+
if (!ANY_RETURN_P (olabel)
&& --LABEL_NUSES (olabel) == 0 && delete_unused > 0
/* Undefined labels will remain outside the insn stream. */