private void computeAllArrowsDepth() {

		// Find overlapping arrows and compute depth
		for (FlowArrow arrow : flowArrows) {

			List<FlowArrow> sameDepth = null;

			// If we have not already assigned a depth to this FlowArrow object
			if (arrow.depth == -1) {

				sameDepth = getArrowsAtSameDepth(arrow, flowArrows);

				// Compute the full address set for all same-depth arrows
				AddressSet sameDepthAddrs = new AddressSet(arrow.addressSet);

				for (FlowArrow otherArrow : sameDepth) {
					sameDepthAddrs.add(otherArrow.addressSet);
				}

				List<FlowArrow> differentDepth = new ArrayList<>(flowArrows);
				differentDepth.removeAll(sameDepth);
				differentDepth.remove(arrow);
				assignArrowDepth(arrow, sameDepthAddrs, differentDepth);
			}
			else {
				sameDepth = Collections.emptyList();
			}

			// If this is the deepest arrow seen, increase maxDepth
			if (arrow.depth > maxDepth) {
				maxDepth = arrow.depth;
			}

			// Make same source/dest arrows the same depth
			for (FlowArrow same : sameDepth) {
				same.depth = arrow.depth;
			}
		}
	}
Iterate over each other FlowArrow object to check overlaps

@return FlowArrow objects that have a start/end address in common
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/flowarrow/FlowArrowPlugin.java