cpu: pred: Local Predictor Reset in Tournament Predictor
authorAndrew Lukefahr <lukefahr@umich.edu>
Tue, 15 Sep 2015 13:14:07 +0000 (08:14 -0500)
committerAndrew Lukefahr <lukefahr@umich.edu>
Tue, 15 Sep 2015 13:14:07 +0000 (08:14 -0500)
When a branch gets squashed, it's speculative branch predictor state should get
rolled back in squash().  However, only the globalHistory state was being
rolled back.  This patch adds (at least some) support for rolling back the
local predictor state also.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>

src/cpu/pred/tournament.cc
src/cpu/pred/tournament.hh

index 1d4fe037e77d1dfb545959940aca663742330e7d..ea6be46fac04a160396c26f54bb51ae7d5377115 100644 (file)
@@ -217,6 +217,7 @@ TournamentBP::lookup(Addr branch_addr, void * &bp_history)
     history->localPredTaken = local_prediction;
     history->globalPredTaken = global_prediction;
     history->globalUsed = choice_prediction;
+    history->localHistoryIdx = local_history_idx;
     history->localHistory = local_predictor_idx;
     bp_history = (void *)history;
 
@@ -256,6 +257,7 @@ TournamentBP::uncondBranch(Addr pc, void * &bp_history)
     history->localPredTaken = true;
     history->globalPredTaken = true;
     history->globalUsed = true;
+    history->localHistoryIdx = invalidPredictorIndex;
     history->localHistory = invalidPredictorIndex;
     bp_history = static_cast<void *>(history);
 
@@ -371,6 +373,11 @@ TournamentBP::squash(void *bp_history)
     // Restore global history to state prior to this branch.
     globalHistory = history->globalHistory;
 
+    // Restore local history
+    if (history->localHistoryIdx != invalidPredictorIndex) {
+        localHistoryTable[history->localHistoryIdx] = history->localHistory;
+    }
+
     // Delete this BPHistory now that we're done with it.
     delete history;
 }
index d461756103eceff7e40b25761a9693234e0a8840..8fb5b515c82ca48a32201ad9c619b68c3b202cd9 100644 (file)
@@ -167,6 +167,7 @@ class TournamentBP : public BPredUnit
         static int newCount;
 #endif
         unsigned globalHistory;
+        unsigned localHistoryIdx;
         unsigned localHistory;
         bool localPredTaken;
         bool globalPredTaken;