mem-cache: Fix fix of replacement count
authorDaniel <odanrc@yahoo.com.br>
Mon, 22 Apr 2019 09:32:22 +0000 (11:32 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Mon, 22 Apr 2019 22:17:10 +0000 (22:17 +0000)
Commit 7976b561de61b7523ca9a860154ad7ba701d12a7 tried fixing
replacement update when a single location can be associated to
multiple blocks.

Although the comment of the correct action was added, the proper
validation check was forgotten. This change adds that check and
moves doing the eviction to when there is a valid block.

Change-Id: I31d8bb914ccfd1849e9d97464d70a58a62f59533
Signed-off-by: Daniel <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18210
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/mem/cache/base.cc

index 849cff59896761020ef8ae5b7664ebfc038d4596..554a61eb01579daba8a6d5a2ce671c4921be94c1 100644 (file)
@@ -1307,8 +1307,11 @@ BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks)
 
     // Check for transient state allocations. If any of the entries listed
     // for eviction has a transient state, the allocation fails
+    bool replacement = false;
     for (const auto& blk : evict_blks) {
         if (blk->isValid()) {
+            replacement = true;
+
             Addr repl_addr = regenerateBlkAddr(blk);
             MSHR *repl_mshr = mshrQueue.findMatch(repl_addr, blk->isSecure());
             if (repl_mshr) {
@@ -1326,27 +1329,23 @@ BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks)
 
     // The victim will be replaced by a new entry, so increase the replacement
     // counter if a valid block is being replaced
-    if (evict_blks.size() > 0) {
+    if (replacement) {
+        // Evict valid blocks associated to this victim block
         for (const auto& blk : evict_blks) {
             if (blk->isValid()) {
                 DPRINTF(CacheRepl, "Evicting %s (%#llx) to make room for " \
                         "%#llx (%s)\n", blk->print(), regenerateBlkAddr(blk),
                         addr, is_secure);
-            }
-        }
 
-        replacements++;
-    }
+                if (blk->wasPrefetched()) {
+                    unusedPrefetches++;
+                }
 
-    // Evict valid blocks associated to this victim block
-    for (const auto& blk : evict_blks) {
-        if (blk->isValid()) {
-            if (blk->wasPrefetched()) {
-                unusedPrefetches++;
+                evictBlock(blk, writebacks);
             }
-
-            evictBlock(blk, writebacks);
         }
+
+        replacements++;
     }
 
     // Insert new block at victimized entry