Out of range address

Dear guys,

     I am having some problems when compiling huge programs (like gcc).
I have a machine pass to destroy critical edges, and I have to add
new basic blocks, but sometimes the program is too big, and the new
basic block gets out of addressing range. What is the proper way to
address this problem? I am producing code for the PowerPC, and I had
to implement the insert go-to method. I am adding:
BuildMI(MBB, MBB.end(), PPC::B, 1).addMBB(&TMBB);

Best,

Fernando

Make sure to run your pass before the PPC branch selection pass. The branch selection pass is the one that makes sure that out-of-range branches are handled. If you run after that, you have to do this yourself.

-Chris

    I am having some problems when compiling huge programs (like gcc).
I have a machine pass to destroy critical edges, and I have to add
new basic blocks, but sometimes the program is too big, and the new
basic block gets out of addressing range.

Make sure to run your pass before the PPC branch selection pass. The
branch selection pass is the one that makes sure that out-of-range
branches are handled. If you run after that, you have to do this
yourself.

Thank you for the help, Chris.

     my pass runs before the branch selector, but the selector is not
resolving the branches that I changed due to critical edges. So, I
think I am forgetting to do something to guarantee that this will
happen. Could someone read this pseudo code to see if it makes sense?

     const BasicBlock * src_bb = src.getBasicBlock();
     const BasicBlock * dst_bb = dst.getBasicBlock();
     MachineBasicBlock * crit_mbb = new MachineBasicBlock(src_bb);

     /// modify the llvm control flow graph
     src.removeSuccessor(& dst);
     src.addSuccessor(crit_mbb);
     crit_mbb->addSuccessor(& dst);

     /// insert the new block into the machine function.
     mf.getBasicBlockList().insert(mf.end(), crit_mbb);

     /// insert a unconditional branch linking the new block to dst
     ...
     /// modify every branch in src that points to dst to point to the new
     /// machine basic block instead:
     ...
     /// Change all the phi functions in dst, so that the incoming block be
     /// crit_mbb, instead of src

thanks a lot,

Fernando