This is the mail archive of the
mailing list for the GCC project.
Re: Fixing jumps reachability after block reordering
- From: Ian Lance Taylor <iant at google dot com>
- To: "Gregory B. Prokopski" <gadek at debian dot org>
- Cc: GCC <gcc at gcc dot gnu dot org>
- Date: 05 Jul 2007 17:48:43 -0700
- Subject: Re: Fixing jumps reachability after block reordering
- References: <20070705205723.GA18103@gadek.cs.mcgill.ca>
"Gregory B. Prokopski" <email@example.com> 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?