From 0170e851de4b06f8839f25bfa9551e02ec4f24b3 Mon Sep 17 00:00:00 2001 From: Maximilien Breughe Date: Mon, 22 Mar 2010 16:59:12 -0400 Subject: [PATCH] inorder: fix squash bug in branch predictor --- src/cpu/inorder/resources/bpred_unit.cc | 3 +++ src/cpu/inorder/resources/branch_predictor.cc | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cpu/inorder/resources/bpred_unit.cc b/src/cpu/inorder/resources/bpred_unit.cc index 0e8526fa1..c9674a0b5 100644 --- a/src/cpu/inorder/resources/bpred_unit.cc +++ b/src/cpu/inorder/resources/bpred_unit.cc @@ -343,6 +343,8 @@ BPredUnit::squash(const InstSeqNum &squashed_sn, // corresponding to the squash. In that case, don't bother trying to // fix up the entry. if (!pred_hist.empty()) { + if(pred_hist.front().seqNum==squashed_sn){ + assert(pred_hist.front().seqNum == squashed_sn); if (pred_hist.front().usedRAS) { ++RASIncorrect; @@ -353,6 +355,7 @@ BPredUnit::squash(const InstSeqNum &squashed_sn, BTB.update(pred_hist.front().PC, corr_target, tid); pred_hist.pop_front(); + } } } diff --git a/src/cpu/inorder/resources/branch_predictor.cc b/src/cpu/inorder/resources/branch_predictor.cc index ecac5fff0..ea9cf7207 100644 --- a/src/cpu/inorder/resources/branch_predictor.cc +++ b/src/cpu/inorder/resources/branch_predictor.cc @@ -56,6 +56,8 @@ BranchPredictor::regStats() .desc("Number of Branches Predicted As Not Taken (False)."); Resource::regStats(); + + branchPred.regStats(); } void @@ -140,7 +142,9 @@ BranchPredictor::squash(DynInstPtr inst, int squash_stage, InstSeqNum squash_seq_num, ThreadID tid) { DPRINTF(InOrderBPred, "Squashing...\n"); - branchPred.squash(squash_seq_num, tid); + Addr corr_targ=inst->readPredPC(); + bool taken=inst->predTaken(); + branchPred.squash(squash_seq_num,corr_targ,taken,tid); } void