private void checkAssignment(Varnode output, Varnode value, PcodeOp op, TaskMonitor monitor)
			throws CancelledException {

		Varnode[] inputs = op.getInputs();
		int opcode = op.getOpcode();
		if (output != null && !output.isUnique() && opcode != PcodeOp.LOAD &&
			opcode != PcodeOp.STORE && opcode != PcodeOp.COPY) {
			checkStackOffsetAssignment(op, value, monitor);
		}

		Register reg = program.getRegister(output.getAddress(), output.getSize());
		if (reg == null || reg.isProgramCounter() || reg.isProcessorContext() ||
			framePointerCandidatesDismissed.contains(reg.getBaseRegister())) {
			Msg.debug(this, "SET: " + output + " = " + value);
			return;
		}
		if (addRegister(reg, registersModified)) {
			if (DEBUG) {
				Msg.debug(this, "MODIFIED: " + reg + " = " + value);
			}
		}
		else {
			Msg.debug(this, "SET: " + output + " = " + value);
		}
		if (framePointerCandidates.containsKey(reg)) {
			if (value.getAddress().equals(reg.getAddress())) {
				return; // Ignore register restore
			}
			framePointerCandidatesDismissed.add(reg);
			framePointerCandidates.remove(reg);
			return;
		}

		if (opcode != PcodeOp.LOAD) {
			if (value.equals(getStackPointerVarnode()) ||
				(inputs.length == 1 && inputs[0].equals(getStackPointerVarnode())) ||
				(inputs.length == 2 && (inputs[0].equals(getStackPointerVarnode()) || inputs[1].equals(getStackPointerVarnode())))) {
				framePointerCandidates.put(reg, new FramePointerCandidate(reg, op.getSeqnum(),
					value));
				return;
			}
		}
		framePointerCandidatesDismissed.add(reg);
	}
Check value assignments for items of interest:
<ul>
<li>Frame pointer identification</li>
<li>Tracking of modified registers</li>
</ul>
@param output output varnode
@param value assigned value
@param op pcode operation
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/util/state/ResultsState.java