I beg to differ with this statement. There are useful and safe optimizations
that a compiler can perform locally. By locally I mean either on a basic
block level, or at an expression level. Value Numbering, and Constant
Folding come immediately to mind. None of these require data flow analysis
in the traditional sense (i.e. requiring du or ud chains).