The simple work-list algorithm allows to perform data-flow analyses, very simply, even its performance is not very high. Informally, it can be described as follows:
// initialization for every n: in(n) = INIT for every n: insert(n, worklist) // main cycle while not empty(worklist) do x = extract(worklist) old = in(x) if FORWARD new = MEET(all p in fathers(n)) (TRASF(in(p))) if old <> new for every f in children(n): insert(f, worklist); in(n) = new else new = MEET(all p in children(n)) (TRASF(in(p))) if old <> new for every f in fathers(n): insert(f, worklist); in(n) = new enddo
The algorithm is very general. Every analysis has just to define the carrier data type, INIT, TRASF and MEET fucntions, choose the direction (FORWARD or BACKWARD). Ocaml implementation follows closely this scheme.