@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; }