Finding and Exploiting Parallelism with Data-Structure-Aware Static and Dynamic Analysis