In general, I can conclude that order of optimization passes play an important role in determining the amount of optimization. Although by running the optimizer on a set of six benchmark programs would give limited information, it looks to me that the best optimization may be got when the order of execution of the phases are - global constant propagation, local optimization (constant folding and local common sub-expression elimination), loop optimization and dead code elimination respectively. Adding multiple passes of dead code elimination and doing an extra pass of local optimization after global constant propagation and loop optimizations also are good techniques, though they increase compile-time overheads.