This paper presents an efficient algorithm that automatically generates a parallel program from a dependence-based representation of a sequential program. The resulti~ parallel program consists of nested fork-join constructs, composed from the loops and statements of the sequential program. Data dependences are handled b,, two techniques. One technique implicitly satisfies them b? sequencing, thereby reducing parallelism. Where increased parallelism results, the other technique eliminates them by privatization: the introduction of processspecific private instances of variables. Additionally, the algorithm determines when cowing values of such instances in and out of nested parallel constructs results in greater parallelism. This is the first algorithm for automatically generating parallelism for such a general model. The algorithm generates as much parallelism as is possible in our model while minimizing privatization.