private boolean hasUnrecoverableCallOther(Program program, Instruction instr) {
		HashSet<Varnode> callOtherOutputs = new HashSet<Varnode>();

		PcodeOp[] pcode = instr.getPcode(true);
		for (PcodeOp op : pcode) {
			if (op.getOpcode() == PcodeOp.CALLOTHER) {
				// if callother has defined pcode inject replacement
				// then could recover
				if (hasPcodeInject(program, op)) {
					continue;
				}
				// save callother output varnode
				Varnode dest = op.getOutput();
				if (dest != null) {
					callOtherOutputs.add(dest);
				}
				continue;
			}
			if (!callOtherOutputs.isEmpty() && op.getOpcode()==PcodeOp.BRANCHIND) {
				// check if branching to an output varnode of callother
				if (callOtherOutputs.contains(op.getInput(0))) {
					// target is computed from a callother output
					return true;
				}
				continue;
			}
			
			// if have a callother destinations, check for it as an input
			if (!callOtherOutputs.isEmpty()) {
				Varnode[] inputs = op.getInputs();
				for (Varnode in : inputs) {
					if (callOtherOutputs.contains(in)) {
						Varnode dest = op.getOutput();
						if (dest != null) {
							callOtherOutputs.add(dest);
						}
					}
				}
			}
		}
		
		return false;
	}
Check an instruction for an unrecoverable computed destination due
to calling a callOther pcode op that has no associated injection.
If there is an associated injection, then it might yet be recoverable.

@param program program
@param instr branching instruction to check
@return true if there is a callOther that will block switch recovery
Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/analysis/DecompilerSwitchAnalyzer.java