1. A machine-implemented method of processing program code, comprising: operating a processor so that the processor performs operations comprising in response to each speculative load instruction in the program code, storing a load address of a variable referenced by the load instruction in a hardware table, in response to each store instruction in the program code, comparing a store address of a variable referenced by the store instruction to addresses stored in the hardware table and removing from the hardware table any addresses that match the store address, detecting a data race condition based on an address of a variable shared by at least first and second threads for executing the program code, wherein the detecting comprises determining that a race condition has occurred based on a failure to find the shared variable address stored in the hardware table and validating the stored shared variable address, and reporting detection of the data race condition in the program code.