diff -r 3824fbc8ed9a -r cdbb2b2535f2 src/cpu/o3/iew_impl.hh --- a/src/cpu/o3/iew_impl.hh Wed May 04 20:38:28 2011 -0500 +++ b/src/cpu/o3/iew_impl.hh Wed May 04 20:38:28 2011 -0500 @@ -485,8 +485,16 @@ inst->seqNum < toCommit->squashedSeqNum[tid]) { toCommit->squash[tid] = true; toCommit->squashedSeqNum[tid] = inst->seqNum; - TheISA::PCState pc = inst->pcState(); - TheISA::advancePC(pc, inst->staticInst); + TheISA::PCState pc; + if (inst->isMemRef() && inst->isIndirectCtrl()) { + // If an operation is a control operation as well as a memory + // reference we need to use the predicted PC, not the PC+N + // This instruction will verify misprediction based on predPC + pc = inst->readPredTarg(); + } else { + pc = inst->pcState(); + TheISA::advancePC(pc, inst->staticInst); + } toCommit->pc[tid] = pc; toCommit->mispredictInst[tid] = NULL;