cpu-o3: Do not set Executed on load instruction to be replayed (#1182)

A load instruction can be replayed when
1) it's strictly ordered or
2) it falls into load-store forwarding mismatch.

Case 1 was considered in executeLoad function but the case 2 wasn't. It
causes the case-2 replayed load instruction to violate the assertion
condition "assert(!load_inst->isExecuted())" in LSQUnit::read. This
commit fixes the problem by adding consideration of the case 2 in
LSQUnit::executeLoad.

Co-authored-by: Minje Jun <minje.jun@samsung.com>
This commit is contained in:
Minje Jun
2024-06-15 02:12:26 +09:00
committed by GitHub
parent 3cf638e217
commit b8e21a2d32

View File

@@ -611,6 +611,12 @@ LSQUnit::executeLoad(const DynInstPtr &inst)
if (inst->isTranslationDelayed() && load_fault == NoFault)
return load_fault;
// Partial Store-to-Load Forwarding condition marks the load to be
// reissued during LSQUnit::read(). In this case we shouldn't notify
// iewStage that the instruction is ready for commit.
if (!inst->isIssued() && !inst->effAddrValid())
return load_fault;
if (load_fault != NoFault && inst->translationCompleted() &&
inst->savedRequest->isPartialFault()
&& !inst->savedRequest->isComplete()) {