diff -r 3d5bebbf0299 -r f2a46a6f0a9c src/cpu/o3/commit_impl.hh --- a/src/cpu/o3/commit_impl.hh Fri Feb 03 05:59:17 2012 -0600 +++ b/src/cpu/o3/commit_impl.hh Fri Feb 03 09:13:26 2012 -0600 @@ -856,7 +856,8 @@ fromIEW->mispredictInst[tid]; toIEW->commitInfo[tid].branchTaken = fromIEW->branchTaken[tid]; - toIEW->commitInfo[tid].squashInst = NULL; + toIEW->commitInfo[tid].squashInst = + rob->findInst(tid, squashed_inst); toIEW->commitInfo[tid].pc = fromIEW->pc[tid]; diff -r 3d5bebbf0299 -r f2a46a6f0a9c src/cpu/o3/fetch_impl.hh --- a/src/cpu/o3/fetch_impl.hh Fri Feb 03 05:59:17 2012 -0600 +++ b/src/cpu/o3/fetch_impl.hh Fri Feb 03 09:13:26 2012 -0600 @@ -1189,8 +1189,15 @@ // StaticInst from the rom, the current macroop, or what's already // in the predecoder. bool needMem = !inRom && !curMacroop && !predecoder.extMachInstReady(); + fetchAddr = (thisPC.instAddr() + pcOffset) & BaseCPU::PCMask; + Addr block_PC = icacheBlockAlignPC(fetchAddr); if (needMem) { + // If buffer is no longer valid or fetchAddr has moved to point + // to the next cache block then start fetch from icache. + if (!cacheDataValid[tid] || block_PC != cacheDataPC[tid]) + break; + if (blkOffset >= numInsts) { // We need to process more memory, but we've run out of the // current block. diff -r 3d5bebbf0299 -r f2a46a6f0a9c src/cpu/o3/rob.hh --- a/src/cpu/o3/rob.hh Fri Feb 03 05:59:17 2012 -0600 +++ b/src/cpu/o3/rob.hh Fri Feb 03 09:13:26 2012 -0600 @@ -122,6 +122,11 @@ */ DynInstPtr readHeadInst(ThreadID tid); + /** Returns a pointer to the instruction with the given sequence if it is + * in the ROB. + */ + DynInstPtr findInst(ThreadID tid, InstSeqNum squash_inst); + /** Returns pointer to the tail instruction within the ROB. There is * no guarantee as to the return value if the ROB is empty. * @retval Pointer to the DynInst that is at the tail of the ROB. diff -r 3d5bebbf0299 -r f2a46a6f0a9c src/cpu/o3/rob_impl.hh --- a/src/cpu/o3/rob_impl.hh Fri Feb 03 05:59:17 2012 -0600 +++ b/src/cpu/o3/rob_impl.hh Fri Feb 03 09:13:26 2012 -0600 @@ -544,3 +544,14 @@ .desc("The number of ROB writes"); } +template +typename Impl::DynInstPtr +ROB::findInst(ThreadID tid, InstSeqNum squash_inst) +{ + for (InstIt it = instList[tid].begin(); it != instList[tid].end(); it++) { + if ((*it)->seqNum == squash_inst) { + return *it; + } + } + return NULL; +}