Optimize value range of right shifts

This commit is contained in:
drmortalwombat 2024-06-30 15:45:34 +02:00
parent 1c0db235a8
commit 7eb149a71b
2 changed files with 39 additions and 16 deletions

View File

@ -334,7 +334,6 @@ void test_add_word_cross(void)
}
int main(void)
{
test_char_fit();
test_char_cross();
test_word_fit();

View File

@ -8129,6 +8129,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
vr.mMinValue = 0;
break;
}
vr.mMinState = IntegerValueRange::S_BOUND;
vr.mMaxState = IntegerValueRange::S_BOUND;
}
}
}
@ -8147,6 +8149,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
vr = mProc->mLocalValueRange[ins->mSrc[1].mTemp];
if (ins->mSrc[0].mIntConst > 0)
{
if (vr.mMinState == IntegerValueRange::S_BOUND && vr.mMaxState == IntegerValueRange::S_BOUND)
{
switch (ins->mSrc[1].mType)
{
@ -8159,11 +8163,32 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
vr.mMinValue = (char)(int64max(-128, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
break;
case IT_INT32:
vr.mMaxValue = (int)(vr.mMaxValue) >> ins->mSrc[0].mIntConst;
vr.mMinValue = (int)(vr.mMinValue) >> ins->mSrc[0].mIntConst;
vr.mMaxValue = (int)(int64min(2147483647, vr.mMaxValue)) >> ins->mSrc[0].mIntConst;
vr.mMinValue = (int)(int64max(-2147483648, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
break;
}
}
else
{
switch (ins->mSrc[1].mType)
{
case IT_INT16:
vr.mMaxValue = (short) 32767 >> ins->mSrc[0].mIntConst;
vr.mMinValue = (short)-32768 >> ins->mSrc[0].mIntConst;
break;
case IT_INT8:
vr.mMaxValue = (char) 127 >> ins->mSrc[0].mIntConst;
vr.mMinValue = (char)-128 >> ins->mSrc[0].mIntConst;
break;
case IT_INT32:
vr.mMaxValue = (int) 2147483647 >> ins->mSrc[0].mIntConst;
vr.mMinValue = (int)-2147483648 >> ins->mSrc[0].mIntConst;
break;
}
vr.mMinState = IntegerValueRange::S_BOUND;
vr.mMaxState = IntegerValueRange::S_BOUND;
}
}
}
else if (ins->mSrc[1].mTemp >= 0)
{
@ -8711,7 +8736,6 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
break;
#endif
case IA_CMPLS:
// Why limit weak, makes no sense
if (s0 < 0)
{
mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
@ -21191,7 +21215,7 @@ void InterCodeProcedure::Close(void)
{
GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "getch");
CheckFunc = !strcmp(mIdent->mString, "interpret_builtin");
CheckCase = false;
mEntryBlock = mBlocks[0];