A def-use chain links each definition of a variable to every place its value is read before being overwritten. It is the wiring diagram of data: follow it and you know exactly which assignment feeds which use. Almost every optimization needs it — dead-code elimination asks “does this def have any uses?”, constant propagation asks “do all defs reaching this use agree?” When a variable is assigned exactly once (static single assignment, SSA), the chains are unambiguous: one def, a clean fan-out of uses, no question about which assignment you mean.
A short instruction stream reads operands by id. Pick a variable; the demo finds every use of that definition — its def-use fan-out: live demo
“The compiler reads variables like you do, by name.” — it reads them by definition. Two assignments to the same name are two different values; a use belongs to whichever def reaches it. The chain, not the name, is the truth of the dataflow. cited
Single assignment is the clean case: one def, a fan of uses, no ambiguity about which value a use reads. A language whose bindings are written once is already halfway to SSA. Rosen-Wegman-Zadeck 1988
On the canonical compiler, variable v1 in a six-instruction stream is read at three sites — a clean three-use chain from one definition: