Extracting Data-Level Parallelism from Sequential Programs for SIMD Execution