> Hi Jan,
>
> I think fixup_reorder_chain contains questionable code to cope with a
> pathological case:
>
> /* The degenerated case of conditional jump jumping to the next
> instruction can happen on target having jumps with side
> effects.
>
> Create temporarily the duplicated edge representing branch.
> It will get unidentified by force_nonfallthru_and_redirect
> that would otherwise get confused by fallthru edge not pointing
> to the next basic block. */
> if (!e_taken)
> {
> rtx note;
> edge e_fake;
> bool redirected;
>
> e_fake = unchecked_make_edge (bb, e_fall->dest, 0);
>
> redirected = redirect_jump (BB_END (bb),
> block_label (bb), 0);
> gcc_assert (redirected);
>
> Note the call to redirect_jump that creates a loop. It is responsible for
> the
> ICE on the attached Ada testcase with the 3.4.5pre compiler at -O3 because
> the
> edge and the jump disagree on the target.
Duh. The code is ineed quite ugly side case.
>
> The final patch: http://gcc.gnu.org/ml/gcc-cvs/2003-03/msg01294.html
> The original version: http://gcc.gnu.org/ml/gcc-patches/2003-03/msg02097.html
>
> Am I right in thinking that the call to redirect_jump must be removed?
I actually believe there was reason for creating the loop (ie
redirecting the edge to anything else than the fallthru egdge
destination) as otherwise we screwed up in
force_nonfallthru_and_redirect and this function (called via
force_nonfallthru) is supposed to redirect the jump back to proper
destination. This is remarkably ugly hack :(
Would be possible to at leat see the RTL and precise ICE this code is
causing?
Honza