Fix invalid memory range requirements due to select statement

This commit is contained in:
drmortalwombat 2024-09-19 20:05:19 +02:00
parent 9adcbd2706
commit ff4a0802ea

View File

@ -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]);