1. A method executed in a computer system, the method comprising the steps: generating a flow graph for a source program that is being compiled using a compiler front end which performs syntactic and semantic processing of a programing language, said flow graph comprising tuples, each tuple representing a single expression in said source program, said flow graph being a representation of said source program in an intermediate language; determining, by said compiler front end for each tuple which can have an effect on another tuple and which is included in said first flow graph, an effect indicator that represents an effect said each tuple has on said another tuple, said effect indicator being associated with said each tuple; determining, by said compiler front end for each tuple which can have a dependency on another tuple and which is included in said flow graph, a dependency indicator that represents a dependency said each tuple on said another tuple, said dependency indicator being associated with said each tuple; and optimizing said flow graph by a compiler back end calling one or more predetermined routines in said compiler front end, said predetermined routines using effect and dependency information from said determining effect and said determining dependency steps to provide return information to said compiler back end wherein said compiler back end uses said return information to determine whether an optimization is valid for one of said tuples comprising said flow graph.