Improve const range propagation after byte compare

This commit is contained in:
drmortalwombat 2025-01-04 09:12:56 +01:00
parent d6362a305f
commit 950c434157

View File

@ -9338,13 +9338,27 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
{ {
int s1 = mInstructions[sz - 2]->mSrc[1].mTemp, s0 = mInstructions[sz - 2]->mSrc[0].mTemp; int s1 = mInstructions[sz - 2]->mSrc[1].mTemp, s0 = mInstructions[sz - 2]->mSrc[0].mTemp;
int s1c = -1, s0c = -1; int s1c = -1, s0c = -1;
InterOperator s1o, s0o;
if (sz > 2 && mInstructions[sz - 3]->mCode == IC_CONVERSION_OPERATOR && mInstructions[sz - 3]->mOperator == IA_EXT8TO16S) for(int si=0; si<sz-2; si++)
{ {
if (s1 == mInstructions[sz - 3]->mSrc[0].mTemp) if (mInstructions[si]->mDst.mTemp == s0 || mInstructions[si]->mDst.mTemp == s0c)
s1c = mInstructions[sz - 3]->mDst.mTemp; s0c = -1;
if (s0 == mInstructions[sz - 3]->mSrc[0].mTemp) else if (mInstructions[si]->mDst.mTemp == s1 || mInstructions[si]->mDst.mTemp == s1c)
s0c = mInstructions[sz - 3]->mDst.mTemp; s1c = -1;
if (mInstructions[si]->mCode == IC_CONVERSION_OPERATOR && (mInstructions[si]->mOperator == IA_EXT8TO16S || mInstructions[si]->mOperator == IA_EXT8TO16U))
{
if (s1 == mInstructions[si]->mSrc[0].mTemp)
{
s1c = mInstructions[si]->mDst.mTemp;
s1o = mInstructions[si]->mOperator;
}
if (s0 == mInstructions[si]->mSrc[0].mTemp)
{
s0c = mInstructions[si]->mDst.mTemp;
s0o = mInstructions[si]->mOperator;
}
}
} }
switch (mInstructions[sz - 2]->mOperator) switch (mInstructions[sz - 2]->mOperator)
@ -9405,7 +9419,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
mFalseValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst); mFalseValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst);
mFalseValueRange[s1].LimitMaxWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[1].mType)); mFalseValueRange[s1].LimitMaxWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[1].mType));
if (s1c >= 0) if (s1c >= 0 && s1o == IA_EXT8TO16S)
{ {
mTrueValueRange[s1c].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1); mTrueValueRange[s1c].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
mTrueValueRange[s1c].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[1].mType)); mTrueValueRange[s1c].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[1].mType));
@ -9422,7 +9436,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
mFalseValueRange[s0].LimitMax(mInstructions[sz - 2]->mSrc[1].mIntConst); mFalseValueRange[s0].LimitMax(mInstructions[sz - 2]->mSrc[1].mIntConst);
mFalseValueRange[s0].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[0].mType)); mFalseValueRange[s0].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[0].mType));
if (s0c >= 0) if (s0c >= 0 && s0o == IA_EXT8TO16S)
{ {
mTrueValueRange[s0c].LimitMin(mInstructions[sz - 2]->mSrc[1].mIntConst + 1); mTrueValueRange[s0c].LimitMin(mInstructions[sz - 2]->mSrc[1].mIntConst + 1);
mTrueValueRange[s0c].LimitMaxWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[0].mType)); mTrueValueRange[s0c].LimitMaxWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[0].mType));
@ -9547,12 +9561,19 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
{ {
mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst); mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst);
mTrueValueRange[s1].LimitMin(0); mTrueValueRange[s1].LimitMin(0);
if (s1c >= 0)
{
mTrueValueRange[s1c].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst);
mTrueValueRange[s1c].LimitMin(0);
}
if (mFalseValueRange[s1].mMinState == IntegerValueRange::S_BOUND && if (mFalseValueRange[s1].mMinState == IntegerValueRange::S_BOUND &&
mFalseValueRange[s1].mMinValue >= 0 || mFalseJump->TempIsUnsigned(s1)) mFalseValueRange[s1].mMinValue >= 0 || mFalseJump->TempIsUnsigned(s1))
{ {
mFalseValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst + 1); mFalseValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst + 1);
} }
if (s1c >= 0 && s1o == IA_EXT8TO16U)
mFalseValueRange[s1c].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst + 1);
} }
break; break;
case IA_CMPGU: case IA_CMPGU:
@ -23013,7 +23034,7 @@ void InterCodeProcedure::Close(void)
{ {
GrowingTypeArray tstack(IT_NONE); GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "drawAllRows"); CheckFunc = !strcmp(mIdent->mString, "enemies_iterate");
CheckCase = false; CheckCase = false;
mEntryBlock = mBlocks[0]; mEntryBlock = mBlocks[0];