private void determineBodyConflicts(Address entry, Function original, Function latest,
			Function my, TaskMonitor monitor) throws CancelledException {
		monitor.checkCancelled();
		AddressSetView originalAddrs = (original != null) ? original.getBody() : null;
		AddressSetView latestAddrs = (latest != null) ? latest.getBody() : null;
		AddressSetView myAddrs = (my != null) ? my.getBody() : null;
		if (SystemUtilities.isEqual(latestAddrs, myAddrs)) {
			return;
		}
		boolean myBodyChanged = !SystemUtilities.isEqual(myAddrs, originalAddrs);
		boolean latestBodyChanged = !SystemUtilities.isEqual(latestAddrs, originalAddrs);
		if (myBodyChanged) {
			if (isEquivalent(latest, original)) {
				if (my != null && my.isThunk()) {
					// Save the thunk for auto-merging later.
					thunkAutoMergeSet.add(entry);
				}
				else {
					// AutoMerge My function body change
					merge(entry, KEEP_MY, monitor);
				}
			}
			else {
				// Have a my function body vs latest function conflict.
				bodySet.addRange(entry, entry);
			}
		}
		else if ((latestBodyChanged) && (!isEquivalent(my, original))) {
			// Have a latest function body vs my function conflict.
			bodySet.addRange(entry, entry);
		}
	}
@param changeSet address set indicating where either Latest or My changed a function.
@param monitor
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/FunctionMerger.java