cpu-o3: Missing freeing the heads of DepGraph in IQ squashing
authorHanhwi Jang <jang.hanhwi@gmail.com>
Sat, 20 Jan 2018 14:55:27 +0000 (23:55 +0900)
committerHanhwi Jang <jang.hanhwi@gmail.com>
Tue, 24 Jul 2018 00:52:51 +0000 (00:52 +0000)
Free the squahsed instructions' heads of DepGraph in IQ squashing

In a system with large register file (ex.2048), the number of
DynInst hits the hardcoded limit (1500). This is caused by
missing freeing the heads of DepGraph in IQ. IQ only clears
out the heads when instructions reach writeback stage.
If a instruction is squashed before writeback stage, its head of
dependency graph, which holds the instruction's DynInstPtr,
would not be cleared out. This prevents freeing the DynInst of the
squahsed instruction even after it is committed.

Change-Id: I05b3db93cb6ad8960183d7ae765149c7f292e5b3
Reviewed-on: https://gem5-review.googlesource.com/7481
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/cpu/o3/inst_queue_impl.hh

index f70f66274f8d63bf3b6ee75afd1efcf56823f7df..84ac5799c8cff97d047a9bb977b333efe5f94822 100644 (file)
@@ -1338,6 +1338,25 @@ InstructionQueue<Impl>::doSquash(ThreadID tid)
             ++freeEntries;
         }
 
+        // IQ clears out the heads of the dependency graph only when
+        // instructions reach writeback stage. If an instruction is squashed
+        // before writeback stage, its head of dependency graph would not be
+        // cleared out; it holds the instruction's DynInstPtr. This prevents
+        // freeing the squashed instruction's DynInst.
+        // Thus, we need to manually clear out the squashed instructions' heads
+        // of dependency graph.
+        for (int dest_reg_idx = 0;
+             dest_reg_idx < squashed_inst->numDestRegs();
+             dest_reg_idx++)
+        {
+            PhysRegIdPtr dest_reg =
+                squashed_inst->renamedDestRegIdx(dest_reg_idx);
+            if (dest_reg->isFixedMapping()){
+                continue;
+            }
+            assert(dependGraph.empty(dest_reg->flatIndex()));
+            dependGraph.clearInst(dest_reg->flatIndex());
+        }
         instList[tid].erase(squash_it--);
         ++iqSquashedInstsExamined;
     }