674,675c674,676
< // If the store's data has all of the data needed, we can forward.
< if ((store_has_lower_limit && store_has_upper_limit)) {
---
> // If the store's data has all of the data needed and the load isn't
> // LLSC, we can forward.
> if (store_has_lower_limit && store_has_upper_limit && !req->isLLSC()) {
710,712c711,718
< } else if ((store_has_lower_limit && lower_load_has_store_part) ||
< (store_has_upper_limit && upper_load_has_store_part) ||
< (lower_load_has_store_part && upper_load_has_store_part)) {
---
> } else if (
> (!req->isLLSC() &&
> ((store_has_lower_limit && lower_load_has_store_part) ||
> (store_has_upper_limit && upper_load_has_store_part) ||
> (lower_load_has_store_part && upper_load_has_store_part))) ||
> (req->isLLSC() &&
> ((store_has_lower_limit || upper_load_has_store_part) &&
> (store_has_upper_limit || lower_load_has_store_part)))) {
714c720,722
< // has only part of the load's data.
---
> // has only part of the load's data and the load isn't LLSC or
> // the load is LLSC and the store has all or part of the load's
> // data