private void doWork() {
			if (program.getCode().isEmpty()) {
				throw new IllegalArgumentException("No code to analyze");
			}

			for (PcodeOp op : program.getCode()) {
				// This op would be after the block from the last iteration
				checkForFallthrough(op);
				IntBranch branchTo = getBranchTo(op);
				if (branchTo != null) {
					makeBlock();
					// This op would be after the block we just made
					checkForFallthrough(op);
				}
				partialBlock.add(op);
				Branch branchFrom = getBranchFrom(op);
				if (branchFrom != null) {
					makeBlock();
					// NB. lastBlock cannot be null, we just added the op
					if (branchFrom instanceof IntBranch ib) {
						lastBlock.branchesFrom.add(ib);
					}
					else {
						lastBlock.branchesOut.add(branchFrom);
					}
					/**
					 * Do not checkForFallthrough, because the current op is already in the block
					 */
				}
			}

			makeBlock();
			if (needsFallthrough(lastBlock)) {
				/**
				 * I'm making it the decoder's responsibility to provide a sane program. We can
				 * catch missing control flow at the very end, but we cannot do so at the end of
				 * other blocks. If they have fall-through, they'll (perhaps erroneously) fall
				 * through to the next block that happens to be there. Thus, it is up to the
				 * decoder, if it decodes any incomplete strides, that is must synthesize the
				 * appropriate control-flow ops.
				 */
				throw new UnterminatedFlowException();
			}

			fillFlows();
			cook();
		}
Notify the splitter of the given branches before analysis

<p>
The splitter immediately indexes the given branches by source and target op.

@param branches the branches
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitControlFlowModel.java