The algorithm used for computing dominators is the one in the Dragon Book. The Tarjan-Lengauer algorithms are better but a bit harder to implement. One tricky aspect of using the algorithm we use is that it computes a set of dominators for each node, and the size of the set can be O(n). (Example: If the loop body is straight-line code then each node has one more dominator---itself---than the node before.) So the total size of all sets can be O(n^2). To get around having to store so much, we use a ordered list representation of sets, with unique conses, so the structure of two sets that are almost the same is often largely shared. Using this data structure we find that in practice the algorithm takes roughly constant time per node processed and each node is only processed a few times before convergence.