private boolean shouldClearInstruction(Instruction instruction, Instruction resultInstruction) {
		if (resultInstruction == null) {
			return true;
		}
		if (!ProgramDiff.equivalentInstructionPrototypes(instruction, resultInstruction)) {
			return true;
		}
		try {
			byte[] bytes = instruction.getParsedBytes();
			byte[] resultBytes = resultInstruction.getParsedBytes();
			if (!Arrays.equals(bytes, resultBytes)) {
				return true; // bytes differ
			}
		}
		catch (MemoryAccessException e) {
			String message =
				"ProgramMerge couldn't get the underlying bytes when comparing instructions." +
					" instruction1 is at " + instruction.getAddress().toString(true) +
					". instruction2 is at " + resultInstruction.getAddress().toString(true) +
					".  " + e.getMessage();
			Msg.error(this, message, e);
			return true;
		}
		return false;
	}
<CODE>mergeCodeUnits</CODE> merges all instructions and/or data
(as indicated) in the specified address set from the origin program.
It merges them into the result program. When merging
instructions, the bytes are also replaced if they differ.
This assumes originToResultTranslator maps address spaces and does
not do fine-grained mapping of addresses.
@param originAddressSet the addresses to be merged.
The addresses in this set should be derived from the origin program.
@param byteDiffs address set indicating addresses where the bytes differ
between the result program and the origin program.
The addresses in this set should be derived from the origin program.
@param mergeDataBytes true indicates bytes that differ should be copied when merging Data.
false means don't copy any bytes for Data.
@param monitor the task monitor for notifying the user of this merge's
progress.

@throws MemoryAccessException if bytes can't be copied.
@throws CancelledException if user cancels via the monitor.
@throws UnsupportedOperationException if the ProgramMerge translator is not a
"one for one translator".
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramMerge.java