if (false) System.out.println("Checking... " + methodGen.getClassName() + "." + methodName + " : " + prev.getPosition() + " " + Constants.OPCODE_NAMES[lastInSourceOpcode]+ " " + tos);
	private IsNullConditionDecision getDecision(BasicBlock basicBlock,  IsNullValueFrame lastFrame)	        throws DataflowAnalysisException {				assert lastFrame != null;		  String methodName = methodGen.getMethod().getName();						final InstructionHandle lastInSourceHandle = basicBlock.getLastInstruction();		if (lastInSourceHandle == null)			return null; // doesn't end in null comparison		  if (false && methodName.startsWith("notifyText"))				System.out.println("XX " + methodGen.getClassName() + "." + methodName + " : " + lastInSourceHandle.getPosition());			final short lastInSourceOpcode = lastInSourceHandle.getInstruction().getOpcode();		// System.out.println("last opcode: " + Constants.OPCODE_NAMES[lastInSourceOpcode]);		if (lastInSourceOpcode == Constants.IFEQ || lastInSourceOpcode == Constants.IFNE ) {			InstructionHandle prev = lastInSourceHandle.getPrev();			if (prev == null) return null;			short secondToLastOpcode = prev.getInstruction().getOpcode();			// System.out.println("Second last opcode: " +  Constants.OPCODE_NAMES[secondToLastOpcode]);			if (secondToLastOpcode != Constants.INSTANCEOF) return null;			IsNullValue tos = instanceOfFrame.getTopValue();			boolean isNotInstanceOf = (lastInSourceOpcode != Constants.IFNE);			Location atInstanceOf = new Location(prev, basicBlock);			ValueNumberFrame instanceOfVnaFrame = vnaDataflow.getFactAtLocation(atInstanceOf);				if (false) System.out.println("Checking... " + methodGen.getClassName() + "." + methodName + " : " + prev.getPosition() 					+ " " + Constants.OPCODE_NAMES[lastInSourceOpcode]+ " " + tos);			// Initially, assume neither branch is feasible.			IsNullValue ifcmpDecision = null;			IsNullValue fallThroughDecision = null;			if (tos.isDefinitelyNull()) {				// Predetermined comparison - one branch is infeasible				if (isNotInstanceOf)					ifcmpDecision =tos;				else // ifnonnull					fallThroughDecision = tos;			} else if (tos.isDefinitelyNotNull()) {				return null;			} else {				// As far as we know, both branches feasible				ifcmpDecision = isNotInstanceOf ? tos : IsNullValue.pathSensitiveNonNullValue();				fallThroughDecision = isNotInstanceOf ? IsNullValue.pathSensitiveNonNullValue() : tos;			}			 if (false) System.out.println("Checking..." + tos + " -> " + ifcmpDecision + " or " + fallThroughDecision);							return new IsNullConditionDecision(instanceOfVnaFrame.getTopValue(), ifcmpDecision, fallThroughDecision);		}		if (!nullComparisonInstructionSet.get(lastInSourceOpcode))			return null; // doesn't end in null comparison		Location atIf = new Location(lastInSourceHandle, basicBlock);		ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(atIf);		switch (lastInSourceOpcode) {			case Constants.IFNULL:		case Constants.IFNONNULL:			{				IsNullValue tos = lastFrame.getTopValue();				boolean ifnull = (lastInSourceOpcode == Constants.IFNULL);				// Initially, assume neither branch is feasible.				IsNullValue ifcmpDecision = null;				IsNullValue fallThroughDecision = null;				if (tos.isDefinitelyNull()) {					// Predetermined comparison - one branch is infeasible					if (ifnull)						ifcmpDecision = IsNullValue.pathSensitiveNullValue();					else // ifnonnull						fallThroughDecision = IsNullValue.pathSensitiveNullValue();				} else if (tos.isDefinitelyNotNull()) {					// Predetermined comparison - one branch is infeasible					if (ifnull)						fallThroughDecision = IsNullValue.pathSensitiveNonNullValue();					else // ifnonnull						ifcmpDecision = IsNullValue.pathSensitiveNonNullValue();				} else {					// As far as we know, both branches feasible					ifcmpDecision = ifnull ? IsNullValue.pathSensitiveNullValue() : IsNullValue.pathSensitiveNonNullValue();					fallThroughDecision = ifnull ? IsNullValue.pathSensitiveNonNullValue() : IsNullValue.pathSensitiveNullValue();				}				return new IsNullConditionDecision(prevVnaFrame.getTopValue(), ifcmpDecision, fallThroughDecision);			}		case Constants.IF_ACMPEQ:		case Constants.IF_ACMPNE:			{				IsNullValue tos = lastFrame.getStackValue(0);				IsNullValue nextToTOS = lastFrame.getStackValue(1);				boolean tosNull = tos.isDefinitelyNull();				boolean nextToTOSNull = nextToTOS.isDefinitelyNull();				boolean cmpeq = (lastInSourceOpcode == Constants.IF_ACMPEQ);				// Initially, assume neither branch is feasible.				IsNullValue ifcmpDecision = null;				IsNullValue fallThroughDecision = null;				ValueNumber value;				if (tosNull && nextToTOSNull) {					// Redundant comparision: both values are null, only one branch is feasible					value = null; // no value will be replaced - just want to indicate that one of the branches is infeasible					if (cmpeq)						ifcmpDecision = IsNullValue.pathSensitiveNullValue();					else // cmpne						fallThroughDecision = IsNullValue.pathSensitiveNullValue();				} else if (tosNull || nextToTOSNull) {					// We have updated information about whichever value is not null;					// both branches are feasible					value = prevVnaFrame.getStackValue(tosNull ? 1 : 0);					ifcmpDecision = cmpeq ? IsNullValue.pathSensitiveNullValue() : IsNullValue.pathSensitiveNonNullValue();					fallThroughDecision = cmpeq ? IsNullValue.pathSensitiveNonNullValue() : IsNullValue.pathSensitiveNullValue();				} else {					// No information gained					break;				}				return new IsNullConditionDecision(value, ifcmpDecision, fallThroughDecision);			}		default:			throw new IllegalStateException();		}		return null; // no information gained	}