ValueNumberFrame blockValueNumberFrame = vnaDataflow.getResultFact(edge.getSource()); ValueNumberFrame targetValueNumberFrame = vnaDataflow.getStartFact(edge.getTarget());  UnconditionalValueDerefSet copyOfFact = createFact(); copy(fact, copyOfFact); fact = copyOfFact;  if (blockValueNumberFrame.isValid() && targetValueNumberFrame.isValid() && blockValueNumberFrame.getNumSlots() == targetValueNumberFrame.getNumSlots()) { if (false && DEBUG) { System.out.println("** Valid VNA frames"); System.out.println("** Block : " + blockValueNumberFrame); System.out.println("** Target: " + targetValueNumberFrame); }  for (int i = 0; i < blockValueNumberFrame.getNumSlots(); i++) { ValueNumber blockVN = blockValueNumberFrame.getValue(i); ValueNumber targetVN = targetValueNumberFrame.getValue(i); if (!blockVN.equals(targetVN)) { if (DEBUG) { System.out.println("Merge: " + targetVN + " -> " + blockVN); } if (fact.isUnconditionallyDereferenced(targetVN) && !fact.isUnconditionallyDereferenced(blockVN)) {  if (DEBUG) { System.out.println("** Copy vn derefs " + targetVN.getNumber() + " --> " + blockVN.getNumber()); } fact.setDerefSet(blockVN, fact.getUnconditionalDerefLocationSet(targetVN)); } } }
fact = propagateDerefSetsToMergeInputValues(fact, edge); if (invDataflow != null) { fact = clearDerefsOnNonNullBranch(fact, edge);
	public void meetInto(UnconditionalValueDerefSet fact, Edge edge,			UnconditionalValueDerefSet result) throws DataflowAnalysisException {				if (ignoreThisEdge(edge)) {			return;		}				if (isFactValid(fact)) {			// Find out if any VNs in the source block			// contribute to unconditionally dereferenced VNs in the			// target block.  If so, the VN in the source block is			// also unconditionally dereferenced, and we must propagate			// the target VN's dereferences. 			ValueNumberFrame blockValueNumberFrame =				vnaDataflow.getResultFact(edge.getSource());			ValueNumberFrame targetValueNumberFrame =				vnaDataflow.getStartFact(edge.getTarget());			UnconditionalValueDerefSet copyOfFact = createFact();			copy(fact, copyOfFact);			fact = copyOfFact;			if (blockValueNumberFrame.isValid() && targetValueNumberFrame.isValid() &&					blockValueNumberFrame.getNumSlots() == targetValueNumberFrame.getNumSlots()) {				if (false && DEBUG) {					System.out.println("** Valid VNA frames");					System.out.println("** Block : " + blockValueNumberFrame);					System.out.println("** Target: " + targetValueNumberFrame);				}				for (int i = 0; i < blockValueNumberFrame.getNumSlots(); i++) {					ValueNumber blockVN = blockValueNumberFrame.getValue(i);					ValueNumber targetVN = targetValueNumberFrame.getValue(i);					if (!blockVN.equals(targetVN)) {						if (DEBUG) {							System.out.println("Merge: " + targetVN + " -> " + blockVN);						}						if (fact.isUnconditionallyDereferenced(targetVN)								&& !fact.isUnconditionallyDereferenced(blockVN)) {							// Block VN is also dereferenced unconditionally.							if (DEBUG) {								System.out.println("** Copy vn derefs " + targetVN.getNumber() + 										" --> " + blockVN.getNumber());							}							fact.setDerefSet(blockVN, fact.getUnconditionalDerefLocationSet(targetVN));						}					}				}			}		}		if (result.isTop() || fact.isBottom()) {			// Make result identical to other fact			copy(fact, result);		} else if (result.isBottom() || fact.isTop()) {			// No change in result fact		} else {			// Dataflow merge			// (intersection of unconditional deref values)			result.mergeWith(fact, vnaDataflow.getAnalysis().getFactory());		}	}