/** Split an unpredicated predicate block. */ private void splitBlock(Hyperblock hb, PredicateBlock block) { int chunkSize = (block.getBlockSize() + block.getFanout()) / 2; int maxChunk = (int) (Trips2Machine.maxBlockSize * MAXFILL); if (chunkSize > maxChunk) { chunkSize = maxChunk; } Instruction splitLocation = findSplitLocation(hb, block, chunkSize); PredicateBlock start = block.cut(splitLocation, gen); Hyperblock nhb = new Hyperblock(start, regs); // Insert the new hyperblock into the HFG. for (int i = hb.numOutEdges() - 1; i > -1; i--) { Hyperblock out = (Hyperblock) hb.getOutEdge(i); out.replaceInEdge(hb, nhb); hb.deleteOutEdge(out); nhb.addOutEdge(out); } hb.addOutEdge(nhb); nhb.addInEdge(hb); workingSet.add(nhb); hb.invalidateDomination(); hb.findLastBlock(); hb.determinePredicatesBranches(); nhb.findLastBlock(); nhb.determinePredicatesBranches(); // Update the return block if it has changed. if (gen.getReturnBlock() == hb) { gen.setReturnBlock(nhb); } }