LSQ: Fix a few issues with the storeset predictor.
authorMrinmoy Ghosh <Mrinmoy.Ghosh@arm.com>
Fri, 19 Aug 2011 20:08:05 +0000 (15:08 -0500)
committerMrinmoy Ghosh <Mrinmoy.Ghosh@arm.com>
Fri, 19 Aug 2011 20:08:05 +0000 (15:08 -0500)
Two issues are fixed in this patch:
1. The load and store pc passed to the predictor are passed in reverse order.
2. The flag indicating that a barrier is inflight was never cleared when
   the barrier was squashed instead of committed. This made all load insts
   dependent on a non-existent barrier in-flight.

src/cpu/o3/mem_dep_unit_impl.hh

index 6f3c922a7eea262ef772295e3e9b4157d9e97288..bb4264a92d93e1d9117475fb52d21b8444d94678 100644 (file)
@@ -405,15 +405,14 @@ MemDepUnit<MemDepPred, Impl>::completeBarrier(DynInstPtr &inst)
     completed(inst);
 
     InstSeqNum barr_sn = inst->seqNum;
-
+    DPRINTF(MemDepUnit, "barrier completed: %s SN:%lli\n", inst->pcState(),
+            inst->seqNum);
     if (inst->isMemBarrier()) {
-        assert(loadBarrier && storeBarrier);
         if (loadBarrierSN == barr_sn)
             loadBarrier = false;
         if (storeBarrierSN == barr_sn)
             storeBarrier = false;
     } else if (inst->isWriteBarrier()) {
-        assert(storeBarrier);
         if (storeBarrierSN == barr_sn)
             storeBarrier = false;
     }
@@ -480,6 +479,12 @@ MemDepUnit<MemDepPred, Impl>::squash(const InstSeqNum &squashed_num,
         DPRINTF(MemDepUnit, "Squashing inst [sn:%lli]\n",
                 (*squash_it)->seqNum);
 
+        if ((*squash_it)->seqNum == loadBarrierSN)
+              loadBarrier = false;
+
+        if ((*squash_it)->seqNum == storeBarrierSN)
+              storeBarrier = false;
+
         hash_it = memDepHash.find((*squash_it)->seqNum);
 
         assert(hash_it != memDepHash.end());
@@ -509,7 +514,7 @@ MemDepUnit<MemDepPred, Impl>::violation(DynInstPtr &store_inst,
             " load: %#x, store: %#x\n", violating_load->instAddr(),
             store_inst->instAddr());
     // Tell the memory dependence unit of the violation.
-    depPred.violation(violating_load->instAddr(), store_inst->instAddr());
+    depPred.violation(store_inst->instAddr(), violating_load->instAddr());
 }
 
 template <class MemDepPred, class Impl>