Fix invalid memory range requirements due to select statement
This commit is contained in:
parent
9adcbd2706
commit
ff4a0802ea
|
@ -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]);
|
||||
|
|
Loading…
Reference in New Issue