> 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

Reply via email to