コード例 #1
0
ファイル: CFG.java プロジェクト: cwgem/jruby
  private void optimize() {
    // SSS FIXME: Can't we not add some of these exception edges in the first place??
    // Remove exception edges from blocks that couldn't possibly thrown an exception!
    List<Edge> toRemove = new ArrayList<Edge>();
    for (BasicBlock b : graph.allData()) {
      boolean noExceptions = true;
      for (Instr i : b.getInstrs()) {
        if (i.canRaiseException()) {
          noExceptions = false;
          break;
        }
      }

      if (noExceptions) {
        for (Edge<BasicBlock> e : graph.vertexFor(b).getOutgoingEdgesOfType(EdgeType.EXCEPTION)) {
          BasicBlock source = e.getSource().getData();
          BasicBlock destination = e.getDestination().getData();
          toRemove.add(e);

          if (rescuerMap.get(source) == destination) rescuerMap.remove(source);
          if (ensurerMap.get(source) == destination) ensurerMap.remove(source);
        }
      }
    }

    if (!toRemove.isEmpty()) {
      for (Edge edge : toRemove) {
        graph.removeEdge(edge);
      }
    }

    deleteOrphanedBlocks(graph);
  }
コード例 #2
0
ファイル: CFG.java プロジェクト: cwgem/jruby
  private BasicBlock createBB(Label label, Stack<ExceptionRegion> nestedExceptionRegions) {
    BasicBlock basicBlock = new BasicBlock(this, label);
    bbMap.put(label, basicBlock);
    graph.vertexFor(basicBlock);

    if (!nestedExceptionRegions.empty()) nestedExceptionRegions.peek().addBB(basicBlock);

    return basicBlock;
  }
コード例 #3
0
ファイル: CFG.java プロジェクト: cwgem/jruby
  private void deleteOrphanedBlocks(DirectedGraph<BasicBlock> graph) {
    // System.out.println("\nGraph:\n" + getGraph().toString());
    // System.out.println("\nInstructions:\n" + toStringInstrs());

    // FIXME: Quick and dirty implementation
    while (true) {
      BasicBlock bbToRemove = null;
      for (BasicBlock b : graph.allData()) {
        if (b == entryBB) continue; // Skip entry bb!

        // Every other bb should have at least one incoming edge
        if (graph.vertexFor(b).getIncomingEdges().isEmpty()) {
          bbToRemove = b;
          break;
        }
      }
      if (bbToRemove == null) break;

      removeBB(bbToRemove);
    }
  }
コード例 #4
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public void addEdge(BasicBlock source, BasicBlock destination, Object type) {
   graph.vertexFor(source).addEdgeTo(destination, type);
 }
コード例 #5
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Set<Edge<BasicBlock>> getOutgoingEdges(BasicBlock block) {
   return graph.vertexFor(block).getOutgoingEdges();
 }
コード例 #6
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Iterable<Edge<BasicBlock>> getOutgoingEdgesNotOfType(BasicBlock block, Object type) {
   return graph.vertexFor(block).getOutgoingEdgesNotOfType(type);
 }
コード例 #7
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Iterable<BasicBlock> getOutgoingDestinations(BasicBlock block) {
   return graph.vertexFor(block).getOutgoingDestinationsData();
 }
コード例 #8
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Iterable<BasicBlock> getOutgoingDestinationsNotOfType(BasicBlock block, Object type) {
   return graph.vertexFor(block).getOutgoingDestinationsDataNotOfType(type);
 }
コード例 #9
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public BasicBlock getOutgoingDestination(BasicBlock block) {
   return graph.vertexFor(block).getOutgoingDestinationData();
 }
コード例 #10
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public BasicBlock getOutgoingDestinationOfType(BasicBlock block, Object type) {
   return graph.vertexFor(block).getOutgoingDestinationDataOfType(type);
 }
コード例 #11
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Edge<BasicBlock> getOutgoingEdgeOfType(BasicBlock block, Object type) {
   return graph.vertexFor(block).getOutgoingEdgeOfType(type);
 }
コード例 #12
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public BasicBlock getIncomingSourceOfType(BasicBlock block, Object type) {
   return graph.vertexFor(block).getIncomingSourceDataOfType(type);
 }
コード例 #13
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public BasicBlock getIncomingSource(BasicBlock block) {
   return graph.vertexFor(block).getIncomingSourceData();
 }
コード例 #14
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Iterable<Edge<BasicBlock>> getIncomingEdges(BasicBlock block) {
   return graph.vertexFor(block).getIncomingEdges();
 }
コード例 #15
0
ファイル: CFG.java プロジェクト: cwgem/jruby
 public Iterable<BasicBlock> getIncomingSources(BasicBlock block) {
   return graph.vertexFor(block).getIncomingSourcesData();
 }