The Reaching Definitions Problem
To solve the reaching definitions problem, we treat each basic block of a subprogram as a node in a control flow graph
Each node is annotated with information about all defs made in the node
This information is then propagated among the nodes of the graph