This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fixing jumps reachability after block reordering


Hi,

I am working on adding support for code-copying to GCC that can be used to
safely speed up interpreter-based VMs, as will be presented at GCC Summit:

http://www.gccsummit.org/2007/view_abstract.php?content_key=30

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 draft of a solution I came up with after a few days of digging in the
existing code is this:

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.

Is there an esier way of doing it? (maybe there's mechanisms in GCC that do
it already?)  What am I missing?  Any similar code in GCC I should look at?

Thanks,

Gregory

-- 
Gregory B. Prokopski       <gadek@debian.org>
Sable Research Group       http://www.sable.mcgill.ca
Montreal, Quebec, Canada


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]