1. A method executed in a computer system, the method comprising the steps of: 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 programming 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 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 has on said another tuple, said dependency indicator being associated with said each tuple; detecting a programming loop construct in said flow graph, said programming loop construct comprising one or more blocks in said flow graph, each of said blocks corresponding to a portion of said source program and including a sequence of tuples with no entry or exit between a first tuple add a last tuple of said sequence; determining for each of said blocks comprising said programming loop construct, a set of effects by examining effect indicators that are associated with tuples in the sequence included in a corresponding block, each of said set of effects being associated with the corresponding block representing memory locations that may be modified by one of said tuples in said each corresponding block; determining for said programming loop construct a set of induction variable candidates by examining said sets of effect and dependency indicators, said dependency indicators being associated with tuples that are included in said programing loop construct, said set of induction variable candidates including variables whose dependencies are included in said set of candidates and representing memory locations that may be modified by one of said tuples in said programming loop construct; and optimizing said flow graph using a compiler back end and said set of induction variable candidates.