Later in the pipeline, memory disambiguation techniques are used to determine if the loads and stores were correctly executed and, if not, to recover.
This increases performance because it reduces the number of pipeline flushes that are required to recover from these memory dependence violations.
Speculation succeeds when the load is independent of the store, that is, when the two instructions access different memory locations.
Αs the scope of the out-of-order execution increased over few tens of instructions, naive memory dependence speculation was used.
In naive memory dependence speculation,[2] a load is allowed to bypass any preceding store.
As the scope of out-of-order execution increases further into several tens of instructions, the performance benefits of naive speculation decrease.
To retain the benefits of aggressive memory dependence speculation while avoiding the costs of mispeculation several predictors have been proposed.
Selective memory dependence prediction[2][3] stalls specific loads until it is certain that no violation may occur.
The synonym predictor[1] groups together all dependences that share a common load or store instruction.
If not, this is a branch misprediction, and a pipeline flush is necessary to throw away instructions that were speculatively fetched and executed.