1. A method for parallelizing program code of an application, the method comprising: examining one or more program instructions of a multi-threaded application; identifying a non-countable loop pattern; replacing the non-countable loop pattern with a parallelized loop pattern, wherein the parallelized loop pattern is configured to squash and re-execute any speculative thread of the parallelized loop pattern that is signaled to have a transaction failure.