diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 7eb7978..fc029e5 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8538,11 +8538,13 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsBackward(const GrowingVaria } } + NumberSet requiredTemps(mExitRequiredTemps); + int sz = mInstructions.Size(); for (int i = sz - 1; i >= 0; i--) { InterInstruction* ins(mInstructions[i]); - if (ins->mCode == IC_LOAD && ins->mSrc[0].mMemory == IM_INDIRECT && ins->mSrc[0].mTemp >= 0) + if (ins->mCode == IC_LOAD && ins->mSrc[0].mMemory == IM_INDIRECT && ins->mSrc[0].mTemp >= 0 && requiredTemps[ins->mDst.mTemp]) mMemoryValueSize[ins->mSrc[0].mTemp] = int64max(mMemoryValueSize[ins->mSrc[0].mTemp], ins->mSrc[0].mIntConst + (InterTypeSize[ins->mDst.mType] - 1) * ins->mSrc[0].mStride + 1); else if (ins->mCode == IC_STORE && ins->mSrc[1].mMemory == IM_INDIRECT && ins->mSrc[1].mTemp >= 0) mMemoryValueSize[ins->mSrc[1].mTemp] = int64max(mMemoryValueSize[ins->mSrc[1].mTemp], ins->mSrc[1].mIntConst + (InterTypeSize[ins->mSrc[0].mType] - 1) * ins->mSrc[1].mStride + 1); @@ -8573,6 +8575,24 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsBackward(const GrowingVaria } } + if (ins->mDst.mTemp < 0 || requiredTemps[ins->mDst.mTemp] || IsObservable(ins->mCode)) + { + if (ins->mDst.mTemp >= 0) + requiredTemps -= ins->mDst.mTemp; + + if (ins->mCode == IC_SELECT) + { + if (ins->mSrc[0].mTemp >= 0) + requiredTemps += ins->mSrc[0].mTemp; + } + else + { + for (int i = 0; i < ins->mNumOperands; i++) + if (ins->mSrc[i].mTemp >= 0) + requiredTemps += ins->mSrc[i].mTemp; + } + } + if (ins->mDst.mTemp >= 0) { ins->mDst.mRange.Limit(mProc->mReverseValueRange[ins->mDst.mTemp]);