diff --git a/src/cpu/pred/tournament.cc b/src/cpu/pred/tournament.cc index 1d4fe037e7..ea6be46fac 100644 --- a/src/cpu/pred/tournament.cc +++ b/src/cpu/pred/tournament.cc @@ -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(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; } diff --git a/src/cpu/pred/tournament.hh b/src/cpu/pred/tournament.hh index d461756103..8fb5b515c8 100644 --- a/src/cpu/pred/tournament.hh +++ b/src/cpu/pred/tournament.hh @@ -167,6 +167,7 @@ class TournamentBP : public BPredUnit static int newCount; #endif unsigned globalHistory; + unsigned localHistoryIdx; unsigned localHistory; bool localPredTaken; bool globalPredTaken;