cpu: Add drain check functionality to IEW
authorMitch Hayenga <mitch.hayenga@arm.com>
Thu, 30 Oct 2014 04:18:26 +0000 (23:18 -0500)
committerMitch Hayenga <mitch.hayenga@arm.com>
Thu, 30 Oct 2014 04:18:26 +0000 (23:18 -0500)
IEW did not check the instQueue and memDepUnit to ensure
they were drained.  This caused issues when drainSanityCheck()
did check those structures after asserting IEW was drained.

src/cpu/o3/iew_impl.hh
src/cpu/o3/inst_queue.hh
src/cpu/o3/inst_queue_impl.hh
src/cpu/o3/mem_dep_unit.hh
src/cpu/o3/mem_dep_unit_impl.hh

index 448be3a74dcf52dfea75174cb1ec25bcb59dc0e2..bf44fb9f2ad04e62db260a476437bf3f59f747b4 100644 (file)
@@ -381,7 +381,7 @@ template <class Impl>
 bool
 DefaultIEW<Impl>::isDrained() const
 {
-    bool drained(ldstQueue.isDrained());
+    bool drained = ldstQueue.isDrained() && instQueue.isDrained();
 
     for (ThreadID tid = 0; tid < numThreads; tid++) {
         if (!insts[tid].empty()) {
index d59d5281b592aa9fdc4c0bc4b0db271cf3460565..c6c55d08aa89f31bdedc7b45355a4c6c94cc27aa 100644 (file)
@@ -145,6 +145,9 @@ class InstructionQueue
     /** Sets the global time buffer. */
     void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
 
+    /** Determine if we are drained. */
+    bool isDrained() const;
+
     /** Perform sanity checks after a drain. */
     void drainSanityCheck() const;
 
index 0caee41ed24a3c26a2a65093265259b1c4dcdb08..6a76b49d06d28758aef0336355d55eedb9ad93bb 100644 (file)
@@ -440,6 +440,17 @@ InstructionQueue<Impl>::setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr)
     fromCommit = timeBuffer->getWire(-commitToIEWDelay);
 }
 
+template <class Impl>
+bool
+InstructionQueue<Impl>::isDrained() const
+{
+    bool drained = dependGraph.empty() && instsToExecute.empty();
+    for (ThreadID tid = 0; tid < numThreads; ++tid)
+        drained = drained && memDepUnit[tid].isDrained();
+
+    return drained;
+}
+
 template <class Impl>
 void
 InstructionQueue<Impl>::drainSanityCheck() const
index 3cc1d88fe02ad816879f1729c6a7fba38adf0734..c2c411fe45cd7f41d4dd6d32a5d9df95ddcb613c 100644 (file)
@@ -104,6 +104,9 @@ class MemDepUnit
     /** Registers statistics. */
     void regStats();
 
+    /** Determine if we are drained. */
+    bool isDrained() const;
+
     /** Perform sanity checks after a drain. */
     void drainSanityCheck() const;
 
index 6684e4ff0374fa84465553ff28a2af10967175ab..376198fc1a0327054991db5bf515087144965830 100644 (file)
@@ -127,6 +127,19 @@ MemDepUnit<MemDepPred, Impl>::regStats()
         .desc("Number of conflicting stores.");
 }
 
+template <class MemDepPred, class Impl>
+bool
+MemDepUnit<MemDepPred, Impl>::isDrained() const
+{
+    bool drained = instsToReplay.empty()
+                 && memDepHash.empty()
+                 && instsToReplay.empty();
+    for (int i = 0; i < Impl::MaxThreads; ++i)
+        drained = drained && instList[i].empty();
+
+    return drained;
+}
+
 template <class MemDepPred, class Impl>
 void
 MemDepUnit<MemDepPred, Impl>::drainSanityCheck() const