Fixing jumps reachability after block reordering

Ian Lance Taylor
Fri Jul 6 00:49:00 GMT 2007

"Gregory B. Prokopski" <> writes:

> One of the operations I need to perform is to reorder basic blocks in a
> particular manner.  This works fine for example on i386 and other that have
> HAS_LONG_COND_BRANCH, HAS_LONG_UNCOND_BRANCH set.  However on platforms like
> PPC, after the reordering, some branches are trying to reach destinations
> beyond their reach and I get errors during the final assembly.

The hot/cold block partitioning code, -freorder-blocks-and-partition,
faces a similar problem.  How do they solve it?

> For each function that has basic blocks reordered for code-copying,
>   Scan all the insn's, find all jumps,
>     For each jump check its destination label, and
>       1. compute the distance between the jump and the label
>         (if possible use insn_lengths[] form final.c, or build it yourself
>         using get_attr_length())
>       2. compare the distance with what can be reached using the Mode
>         (GET_MODE_SIZE, exact_log2())
>       3. if Mode won't reach the destination, create an extra BB with an
>         unconditional or indirect jump to the label (like bb-reorder.c)
> 	and redirect the original jump to it.

But you seem to be within a single function, so I don't understand why
you have any trouble at all.  Why doesn't the shorten_branches pass
work for you?


More information about the Gcc mailing list