summaryrefslogtreecommitdiff
path: root/src/cpu/pred/bpred_unit.hh
diff options
context:
space:
mode:
authorArthur Perais <arthur.perais@inria.fr>2016-12-21 15:07:16 -0600
committerArthur Perais <arthur.perais@inria.fr>2016-12-21 15:07:16 -0600
commit497cc2d373d1559aaae0263635b88f670fd239cd (patch)
tree7ad8f55f589fe1e04bc3bc3764794c83e13f1788 /src/cpu/pred/bpred_unit.hh
parent34065f8d5f51e165b56d12a6d88092332809f0b9 (diff)
downloadgem5-497cc2d373d1559aaae0263635b88f670fd239cd.tar.xz
cpu: disallow speculative update of branch predictor tables (o3)
The Minor and o3 cpu models share the branch prediction code. Minor relies on the BPredUnit::squash() function to update the branch predictor tables on a branch mispre- diction. This is fine because Minor executes in-order, so the update is on the correct path. However, this causes the branch predictor to be updated on out-of-order branch mispredictions when using the o3 model, which should not be the case. This patch guards against speculative update of the branch prediction tables. On a branch misprediction, BPredUnit::squash() calls BpredUnit::update(..., squashed = true). The underlying branch predictor tests against the value of squashed. If it is true, it restores any speculatively updated internal state it might have (e.g., global/local branch history), then returns. If false, it updates its prediction tables. Previously, exist- ing predictors did not test against the "squashed" parameter. To accomodate for this change, the Minor model must now call BPredUnit::squash() then BPredUnit::update(..., squashed = false) on branch mispredictions. Before, calling BpredUnit::squash() performed the prediction tables update. The effect is a slight MPKI improvement when using the o3 model. A further patch should perform the same modifications for the indirect target predictor and BTB (less critical). Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/cpu/pred/bpred_unit.hh')
-rw-r--r--src/cpu/pred/bpred_unit.hh13
1 files changed, 1 insertions, 12 deletions
diff --git a/src/cpu/pred/bpred_unit.hh b/src/cpu/pred/bpred_unit.hh
index 3f9cbc057..b890dc332 100644
--- a/src/cpu/pred/bpred_unit.hh
+++ b/src/cpu/pred/bpred_unit.hh
@@ -179,14 +179,6 @@ class BPredUnit : public SimObject
*/
virtual void update(ThreadID tid, Addr instPC, bool taken,
void *bp_history, bool squashed) = 0;
- /**
- * Deletes the associated history with a branch, performs no predictor
- * updates. Used for branches that mispredict and update tables but
- * are still speculative and later retire.
- * @param bp_history History to delete associated with this predictor
- */
- virtual void retireSquashed(ThreadID tid, void *bp_history) = 0;
-
/**
* Updates the BTB with the target of a branch.
* @param inst_PC The branch's PC that will be updated.
@@ -211,7 +203,7 @@ class BPredUnit : public SimObject
ThreadID _tid)
: seqNum(seq_num), pc(instPC), bpHistory(bp_history), RASTarget(0),
RASIndex(0), tid(_tid), predTaken(pred_taken), usedRAS(0), pushedRAS(0),
- wasCall(0), wasReturn(0), wasSquashed(0), wasIndirect(0)
+ wasCall(0), wasReturn(0), wasIndirect(0)
{}
bool operator==(const PredictorHistory &entry) const {
@@ -254,9 +246,6 @@ class BPredUnit : public SimObject
/** Whether or not the instruction was a return. */
bool wasReturn;
- /** Whether this instruction has already mispredicted/updated bp */
- bool wasSquashed;
-
/** Wether this instruction was an indirect branch */
bool wasIndirect;
};