nullInfo == TOS_NULL
(nullInfo == TOS_NULL || nullInfo == NEXT_TO_TOS_NULL)
	public void meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result)		throws DataflowAnalysisException {		if (fact.isValid()) {			final int numSlots = fact.getNumSlots();			if (SPLIT_DOWNGRADE_NSP) {				// Downgrade NSP to DNR on non-exception control splits				if (!edge.isExceptionEdge() && numNonExceptionSuccessorMap[edge.getSource().getId()] > 0) {					IsNullValueFrame tmpFact = createFact();					tmpFact.copyFrom(fact);					for (int i = 0; i < numSlots; ++i) {						IsNullValue value = tmpFact.getValue(i);						if (value.equals(IsNullValue.nullOnSomePathValue()))							tmpFact.setValue(i, IsNullValue.doNotReportValue());					}					fact = tmpFact;				}			}			final BasicBlock destBlock = edge.getDest();			if (destBlock.isExceptionHandler()) {				// Exception handler - clear stack and push a non-null value				// to represent the exception.				IsNullValueFrame tmpFrame = createFact();				tmpFrame.copyFrom(fact);				tmpFrame.clearStack();				tmpFrame.pushValue(IsNullValue.nonNullValue());				fact = tmpFrame;			} else {				// Determine if the edge conveys any information about the				// null/non-null status of operands in the incoming frame.					int nullInfo = getNullInfoFromEdge(edge);				if (nullInfo != NO_INFO) {					// Value numbers in this frame					ValueNumberFrame vnaFrame = vnaDataflow.getStartFact(destBlock);					if (vnaFrame == null)						throw new IllegalStateException("no vna frame at block entry?");					if (vnaFrame != null) {						switch (nullInfo) {						case TOS_NULL:						case TOS_NON_NULL:							{								// What we know here is that the value that was								// just popped off the stack is either null or non-null.								// We can use this info to increase the precision of								// any stack slots containing the same value.								BasicBlock sourceBlock = edge.getSource();								Location atIf = new Location(sourceBlock.getLastInstruction(), sourceBlock);								ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(atIf);								IsNullValueFrame prevIsNullValueFrame = getFactAtLocation(atIf);								if (prevVnaFrame != null && prevIsNullValueFrame != null) {									ValueNumber replaceMe = prevVnaFrame.getTopValue();									IsNullValue origIsNullValue = prevIsNullValueFrame.getTopValue();									fact = replaceValues(fact, replaceMe, vnaFrame,										nullInfo == TOS_NULL											? IsNullValue.flowSensitiveNullValue(origIsNullValue)											: IsNullValue.flowSensitiveNonNullValue(origIsNullValue));								} else									throw new IllegalStateException("No value number frame?");							}							break;						case REF_OPERAND_NON_NULL:							{								// For all of the instructions which have a null-checked								// reference operand, it is pushed onto the stack before								// all of the other operands to the instruction.								Instruction firstInDest = edge.getDest().getFirstInstruction().getInstruction();								int numSlotsConsumed = firstInDest.consumeStack(methodGen.getConstantPool());								if (numSlotsConsumed == Constants.UNPREDICTABLE)									throw new DataflowAnalysisException("Unpredictable stack consumption for " + firstInDest);								ValueNumber replaceMe = vnaFrame.getValue(numSlots - numSlotsConsumed);								fact = replaceValues(fact, replaceMe, vnaFrame, IsNullValue.nonNullValue());							}							break;						default:							assert false;						}					}				}			}		}		// Normal dataflow merge		result.mergeWith(fact);	}