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();
|
int sz = mInstructions.Size();
|
||||||
for (int i = sz - 1; i >= 0; i--)
|
for (int i = sz - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
InterInstruction* ins(mInstructions[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);
|
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)
|
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);
|
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)
|
if (ins->mDst.mTemp >= 0)
|
||||||
{
|
{
|
||||||
ins->mDst.mRange.Limit(mProc->mReverseValueRange[ins->mDst.mTemp]);
|
ins->mDst.mRange.Limit(mProc->mReverseValueRange[ins->mDst.mTemp]);
|
||||||
|
|
Loading…
Reference in New Issue