Abstract: Data dependence analysis determines the ordering relationships between instructions in a unit of code that must be satisfied for the code to execute correctly. It is a fundamental program analysis technique used by optimizing compilers to identify constraints on data flow, code motion, and instruction reordering. Dependence graphs are often constructed as the result of data dependence analysis. In this talk we describe a new approach to performing data dependence analysis for Java in the presence of Java's "non-traditional" language features such as exception, synchronization, and memory consistency. We introduce new classes of edges in a dependence graph to model code motion constraints arising from these language features. We also present a linear-time algorithm for constructing this augmented dependence graph for an extended basic block.