ValueNumber replaceMe = prevVnaFrame.getValue(slotToReplace); IsNullValue origIsNullValue = prevIsNullValueFrame.getValue(slotToReplace);
if (nextToTOS.isDefinitelyNull()) {  tmpFact = replaceValues(fact, tmpFact, prevVnaFrame.getTopValue(), prevVnaFrame, ifNullComparison(lastInSourceOpcode, edgeType, conditionValue)); } } break; } } }
	public void meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result)		throws DataflowAnalysisException {		if (fact.isValid()) {			final int numSlots = fact.getNumSlots();			if (!NO_SPLIT_DOWNGRADE_NSP) {				// Downgrade NSP to DNR on non-exception control splits				if (!edge.isExceptionEdge() && numNonExceptionSuccessorMap[edge.getSource().getId()] > 1) {					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();				// Mark all values as having occurred on an exception path				for (int i = 0; i < tmpFrame.getNumSlots(); ++i)					tmpFrame.setValue(i, tmpFrame.getValue(i).toExceptionValue());				// Push the exception value				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);				switch (nullInfo) {				case TOS_NULL:				case TOS_NON_NULL:				case NEXT_TO_TOS_NULL:				case NEXT_TO_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.						// Get ValueNumberFrame and IsNullValueFrame at location						// just before the IF instruction in the source block.						BasicBlock sourceBlock = edge.getSource();						Location atIf = new Location(sourceBlock.getLastInstruction(), sourceBlock);						IsNullValueFrame prevIsNullValueFrame = getFactAtLocation(atIf);						ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(atIf);						int prevNumSlots = prevIsNullValueFrame.getNumSlots();						assert prevNumSlots == prevVnaFrame.getNumSlots();						// Figure out which slot contains the value we have information about						int slotToReplace = (nullInfo == TOS_NULL || nullInfo == TOS_NON_NULL)							? prevNumSlots - 1							: prevNumSlots - 2;						// Get the value we have information about, as well as the						// condition the IF statement is controlled by.						ValueNumber replaceMe = prevVnaFrame.getValue(slotToReplace);						IsNullValue origIsNullValue = prevIsNullValueFrame.getValue(slotToReplace);						// Update all slots containing the value which was used						// in the IF statement.						fact = replaceValues(fact, replaceMe, prevVnaFrame,							(nullInfo == TOS_NULL || nullInfo == NEXT_TO_TOS_NULL)								? IsNullValue.flowSensitiveNullValue(origIsNullValue)								: IsNullValue.flowSensitiveNonNullValue(origIsNullValue));					}					break;				case REF_OPERAND_NON_NULL:					{						ValueNumberFrame vnaFrame = vnaDataflow.getStartFact(destBlock);						if (vnaFrame == null)							throw new IllegalStateException("no vna frame at block entry?");						// 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;				case NO_INFO:					break;				default:					assert false;				}			}		}		// Normal dataflow merge		result.mergeWith(fact);	}