Example #1
0
  /** 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);
    }
  }