We define a tunnel boundary as the input and output sides of an intermediate tunnel instance node expansion. Each boundary consists of a pair of tunnel nodes (input/output), with one side being the tunnel "instance" node that owns the expansion. After expansion, tunnel nodes are cropped and removed from the function graph, so they do not result in any actual bytecode.