Improve const range propagation after byte compare
This commit is contained in:
parent
d6362a305f
commit
950c434157
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue