I'm bumping the below e-mail from the users lists to dev. I believe it is a legit problem with decode not actually passing back the correct value for taken/not taken to the branch predictor when it detects a pc-relative, unconditional control branch in decode.
The relevant line in decode_impl.hh is this: toFetch->decodeInfo[tid].branchTaken = inst->pcState().branching(); However, the branch isnt technically "resolved" at that point so you wont get the right "resolution" back to BpHistory. I'm thinking the fix might be to: 1. Call execute on the branch in decode so that the PC/NPC/NNPC values can be updated. 2. Call squash in decode 3. Bypass execution of the unconditonal, pc-relative branch in IEW... (this may be trickier than it sounds, but I'm not fond of the idea of just executing the branch 2x) Any thoughts? ---------- Forwarded message ---------- From: reena panda <reena.pa...@gmail.com> Date: Sat, Mar 26, 2011 at 4:17 PM Subject: [m5-users] Help with Branch Misprediction recovery in m5. To: M5 users mailing list <m5-us...@m5sim.org> Hi, I am using m5 in ALPHA FS mode, with O3 CPU model. I was going through the fetch/decode stage implementation in m5. But I can't understand properly, the way branch misprediction is handled in the decode/fetch stage of pipeline. Please correct me if I am wrong, but the way it is currently implemented in m5 is as follows:- Suppose an unconditional branch(PC = x, say) is fetched in the fetch cycle, its branch prediction history is immediately updated as a "taken branch". Now lets say, its actual target is "Y". But suppose the entry corresponding to the branch PC (x) is not found in the BTB, then the next PC and nextNPC are still updated to x+4, x+8 respectively. Since unconditional branches can be resolved in the decode stage, the following check is correctly performed in decodeInsts function (in decode_impl.hh):- if (inst->branchTarget() != inst->readPredPC()) { ++decodeBranchMispred; squash(inst, inst->threadNumber); } But what is odd is that in squash function, the following information is sent back to fetch stage:- toFetch->decodeInfo[tid].nextPC = inst->branchTarget(); toFetch->decodeInfo[tid].nextNPC = inst->branchTarget() + sizeof(TheISA::MachInst); toFetch->decodeInfo[tid].branchTaken = inst->readNextPC() != (inst->readPC() + sizeof(TheISA::MachInst)); The third statement is odd because it compares nextPC with PC( i.e, x+4 with x+4) yields branch direction as "not-taken", Which is wrong and would update the branch predictors incorrectly. Branch is actually an "unconditional taken branch" in the example. Then, should not the last line be something like this:- toFetch->decodeInfo[tid].branchTaken = inst->branchTarget() != (inst->readPC() + sizeof(TheISA::MachInst)); Please point if I am missing something here? I can't understand the working correctly. Also, can some one give me pointers on how to infer total branch misprediction statistics from the stats.txt file, the stats seem to be scattered across the different pipeline stages. Are they all disjoint/or is there any degree of overlap between them? Thanks, Reena _______________________________________________ m5-users mailing list m5-us...@m5sim.org http://m5sim.org/cgi-bin/mailman/listinfo/m5-users -- - Korey _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev