コード例 #1
0
  @Override
  protected Set<FloatingReadNode> processBlock(Block block, Set<FloatingReadNode> currentState) {
    AbstractBeginNode beginNode = block.getBeginNode();
    if (beginNode instanceof AbstractMergeNode) {
      AbstractMergeNode abstractMergeNode = (AbstractMergeNode) beginNode;
      for (PhiNode phi : abstractMergeNode.phis()) {
        if (phi instanceof MemoryPhiNode) {
          MemoryPhiNode memoryPhiNode = (MemoryPhiNode) phi;
          addFloatingReadUsages(currentState, memoryPhiNode);
        }
      }
    }
    for (Node n : blockToNodesMap.get(block)) {
      if (n instanceof MemoryCheckpoint) {
        if (n instanceof MemoryCheckpoint.Single) {
          MemoryCheckpoint.Single single = (MemoryCheckpoint.Single) n;
          processLocation(n, single.getLocationIdentity(), currentState);
        } else if (n instanceof MemoryCheckpoint.Multi) {
          MemoryCheckpoint.Multi multi = (MemoryCheckpoint.Multi) n;
          for (LocationIdentity location : multi.getLocationIdentities()) {
            processLocation(n, location, currentState);
          }
        }

        addFloatingReadUsages(currentState, n);
      } else if (n instanceof MemoryNode) {
        addFloatingReadUsages(currentState, n);
      } else if (n instanceof FloatingReadNode) {
        FloatingReadNode floatingReadNode = (FloatingReadNode) n;
        if (floatingReadNode.getLastLocationAccess() != null
            && floatingReadNode.getLocationIdentity().isMutable()) {
          if (currentState.contains(floatingReadNode)) {
            // Floating read was found in the state.
            currentState.remove(floatingReadNode);
          } else {
            throw new RuntimeException(
                "Floating read node "
                    + n
                    + " was not found in the state, i.e., it was killed by a memory check point before its place in the schedule. Block="
                    + block
                    + ", block begin: "
                    + block.getBeginNode()
                    + " block loop: "
                    + block.getLoop()
                    + ", "
                    + blockToNodesMap.get(block).get(0));
          }
        }
      }
    }
    return currentState;
  }