1. A method for optimizing source code for use in a parallel computing environment comprising: compiling a source code file with a set of instrumentation to create an instrumented executable; executing the instrumented executable with a set of potential data inputs to track data unit memory accesses across one or more program regions to create a set of data access statistics; collecting the data access statistics by a method comprising the steps of: a) cutting dynamic basic blocks at source statement boundaries; b) collecting dynamic region nesting information; c) collecting execution and iteration count information; d) collecting data indicating whether each data unit, region, and referenced variable is read-only, write-first, or read-write; e) tracking global data, allocation, and deallocation of stack frames; f) learning which types of heap memory each program pointer is likely to point to; g) detecting whether there is a flow of values between region iterations; h) detecting whether there is a flow of values into or out of each region context; and i) detecting whether a variable is accessed according to a reduction pattern; and j) utilizing the data access statistics to add a set of parallel processing directives to the source code file to optimize the source code file for execution in a parallel computing environment.