There is a bunch of DPRINTS in there that I kept in figuring out what's
going on.
The actual fix is small in fetch_impl.hh:
" // Update the branch predictor.
+#if THE_ISA == MIPS_ISA
+ if (fromDecode->decodeInfo[tid].branchMispredict && 0) {
+#else
if (fromDecode->decodeInfo[tid].branchMispredict) {
+#endif
"
A little lower in the fall-out of that selection statement you'll see 2
different squash functions that get called in the branch predictor:
- One squashes all history behind the mispredicted instruction
- The other squashes all history and then updates some branch history state
(which is kind of confusing)
I edited out the 2nd one from happening and things work again.
The reason why you get a mispredict in decode is I think the fetching
scenario behind an unconditional PC-relative branch. You wont know exactly
which direction to go until after decode.
On Wed, Apr 15, 2009 at 11:44 PM, Steve Reinhardt <[email protected]> wrote:
> I'm confused... this patch looks like it pretty much just inserts a bunch
> of DPRINTFs (plus the seemingly mistaken inclusion of a whitespace change in
> mips/isa/decoder.isa).
>
> I don't know anything specific about the O3 predictor, but it makes sense
> that the history is updated speculatively in decode, but I don't see how you
> can even know whether a branch is mispredicted while you're still in the
> decode stage, so the fixup would have to wait at least until execute (and
> you may want to wait until commit if that makes recovery substantially
> simpler).
>
> Steve
>
>
> On Wed, Apr 15, 2009 at 8:15 PM, Korey Sewell <[email protected]> wrote:
>
>> This is the patch that will prevent me from committing.
>>
>> Basically, the decode stage is finding a mispredicted branch and then
>> deleting information out the branch history table for squashed instructions
>> AND itself.
>>
>> This messes things up for when the actual mispredicted instruction gets to
>> commit and wants to update the branch history.
>>
>> So basically, I ignored that condition and it branch prediction started
>> working. I did the same for ALPHA and SPARC and it seemed to work for Hello
>> World as well (maybe I just got lucky?)
>>
>> The next thing I guess I should do is run the quick/long regressions on
>> ALPHA/SPARC to make sure I'm not breaking anything if I were to remove that
>> code.
>>
>> Anybody have any thoughts on this (Gabe, Kevin?)?
>>
>>
>>
>> On Wed, Apr 15, 2009 at 11:06 PM, Korey Sewell <[email protected]>wrote:
>>
>>> # HG changeset patch
>>> # User Korey Sewell <[email protected]>
>>> # Date 1239850525 14400
>>> # Node ID ce539a58327b78b049f8af0bf8a00737f2b97640
>>> # Parent 7b685fee8773c2fe0bd09ec7abb0a43873aeed92
>>> Fix Branch Prediction for MIPS. Namely, i dont see the reason for
>>> updating the branch history on anything that happens in decode. this should
>>> happen only in commit, right?
>>>
>>> diff --git a/src/arch/mips/isa/decoder.isa
>>> b/src/arch/mips/isa/decoder.isa
>>> --- a/src/arch/mips/isa/decoder.isa
>>> +++ b/src/arch/mips/isa/decoder.isa
>>> @@ -135,7 +135,7 @@ decode OPCODE_HI default Unknown::unknow
>>> 0x2: movz({{ Rd = (Rt == 0) ? Rs : Rd; }});
>>> 0x3: movn({{ Rd = (Rt != 0) ? Rs : Rd; }});
>>> #if FULL_SYSTEM
>>> - 0x4: syscall({{
>>> + 0x4: syscall({{
>>> fault = new SystemCallFault();
>>> }});
>>> #else
>>> diff --git a/src/cpu/o3/bpred_unit_impl.hh
>>> b/src/cpu/o3/bpred_unit_impl.hh
>>> --- a/src/cpu/o3/bpred_unit_impl.hh
>>> +++ b/src/cpu/o3/bpred_unit_impl.hh
>>> @@ -173,6 +173,10 @@ BPredUnit<Impl>::predict(DynInstPtr &ins
>>> tid, pred_taken, inst->readPC());
>>> }
>>>
>>> + DPRINTF(Fetch, "BranchPred: [tid:%i]: [sn:%i] Creating prediction
>>> history "
>>> + "for PC %#x\n",
>>> + tid, inst->seqNum, inst->readPC());
>>> +
>>> PredictorHistory predict_record(inst->seqNum, PC, pred_taken,
>>> bp_history, tid);
>>>
>>> @@ -249,7 +253,7 @@ void
>>> void
>>> BPredUnit<Impl>::update(const InstSeqNum &done_sn, unsigned tid)
>>> {
>>> - DPRINTF(Fetch, "BranchPred: [tid:%i]: Commiting branches until "
>>> + DPRINTF(Fetch, "BranchPred: [tid:%i]: Committing branches until "
>>> "[sn:%lli].\n", tid, done_sn);
>>>
>>> while (!predHist[tid].empty() &&
>>> @@ -290,7 +294,12 @@ BPredUnit<Impl>::squash(const InstSeqNum
>>> // This call should delete the bpHistory.
>>> BPSquash(pred_hist.front().bpHistory);
>>>
>>> + DPRINTF(Fetch, "BranchPred: [tid:%i]: Removing history for
>>> [sn:%i] "
>>> + "PC %#x.\n", tid, pred_hist.front().seqNum,
>>> pred_hist.front().PC);
>>> +
>>> pred_hist.pop_front();
>>> +
>>> + DPRINTF(Fetch, "[tid:%i]: predHist.size(): %i\n", tid,
>>> predHist[tid].size());
>>> }
>>>
>>> }
>>> @@ -320,7 +329,13 @@ BPredUnit<Impl>::squash(const InstSeqNum
>>> // corresponding to the squash. In that case, don't bother trying to
>>> // fix up the entry.
>>> if (!pred_hist.empty()) {
>>> - assert(pred_hist.front().seqNum == squashed_sn);
>>> + if (pred_hist.front().seqNum != squashed_sn)
>>> + {
>>> + DPRINTF(Fetch, "PredHist.front.sn = %i | squashed_sn =
>>> %i.\n",
>>> + pred_hist.front().seqNum, squashed_sn);
>>> + assert(pred_hist.front().seqNum == squashed_sn);
>>> + }
>>> +
>>> if (pred_hist.front().usedRAS) {
>>> ++RASIncorrect;
>>> }
>>> @@ -329,7 +344,13 @@ BPredUnit<Impl>::squash(const InstSeqNum
>>> pred_hist.front().bpHistory);
>>>
>>> BTB.update(pred_hist.front().PC, corr_target, tid);
>>> +
>>> + DPRINTF(Fetch, "BranchPred: [tid:%i]: Removing history for
>>> [sn:%i] "
>>> + "PC %#x.\n", tid, pred_hist.front().seqNum,
>>> pred_hist.front().PC);
>>> +
>>> pred_hist.pop_front();
>>> +
>>> + DPRINTF(Fetch, "[tid:%i]: predHist.size(): %i\n", tid,
>>> predHist[tid].size());
>>> }
>>> }
>>>
>>> diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh
>>> --- a/src/cpu/o3/fetch_impl.hh
>>> +++ b/src/cpu/o3/fetch_impl.hh
>>> @@ -939,7 +939,11 @@ DefaultFetch<Impl>::checkSignalsAndUpdat
>>> "from decode.\n",tid);
>>>
>>> // Update the branch predictor.
>>> +#if THE_ISA == MIPS_ISA
>>> + if (fromDecode->decodeInfo[tid].branchMispredict && 0) {
>>> +#else
>>> if (fromDecode->decodeInfo[tid].branchMispredict) {
>>> +#endif
>>> branchPred.squash(fromDecode->decodeInfo[tid].doneSeqNum,
>>> fromDecode->decodeInfo[tid].nextPC,
>>> fromDecode->decodeInfo[tid].branchTaken,
>>> diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh
>>> --- a/src/cpu/o3/iew_impl.hh
>>> +++ b/src/cpu/o3/iew_impl.hh
>>> @@ -1282,11 +1282,11 @@ DefaultIEW<Impl>::executeInsts()
>>> fetchRedirect[tid] = true;
>>>
>>> DPRINTF(IEW, "Execute: Branch mispredict detected.\n");
>>> - DPRINTF(IEW, "Predicted target was %#x, %#x.\n",
>>> + DPRINTF(IEW, "Predicted target was PC:%#x, NPC:%#x.\n",
>>> inst->readPredPC(), inst->readPredNPC());
>>> DPRINTF(IEW, "Execute: Redirecting fetch to PC: %#x,"
>>> " NPC: %#x.\n", inst->readNextPC(),
>>> - inst->readNextNPC());
>>> + inst->readNextPC());
>>> // If incorrect, then signal the ROB that it must be
>>> squashed.
>>> squashDueToBranch(inst, tid);
>>>
>>> _______________________________________________
>>> m5-dev mailing list
>>> [email protected]
>>> http://m5sim.org/mailman/listinfo/m5-dev
>>>
>>
>>
>>
>> --
>> ----------
>> Korey L Sewell
>> Graduate Student - PhD Candidate
>> Computer Science & Engineering
>> University of Michigan
>>
>> _______________________________________________
>> m5-dev mailing list
>> [email protected]
>> http://m5sim.org/mailman/listinfo/m5-dev
>>
>>
>
> _______________________________________________
> m5-dev mailing list
> [email protected]
> http://m5sim.org/mailman/listinfo/m5-dev
>
>
--
----------
Korey L Sewell
Graduate Student - PhD Candidate
Computer Science & Engineering
University of Michigan
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev