"Gregory B. Prokopski" <[EMAIL PROTECTED]> 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? Ian