Optimize value range of right shifts
This commit is contained in:
parent
1c0db235a8
commit
7eb149a71b
|
@ -334,7 +334,6 @@ void test_add_word_cross(void)
|
||||||
}
|
}
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
test_char_fit();
|
test_char_fit();
|
||||||
test_char_cross();
|
test_char_cross();
|
||||||
test_word_fit();
|
test_word_fit();
|
||||||
|
|
|
@ -8129,6 +8129,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
|
||||||
vr.mMinValue = 0;
|
vr.mMinValue = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
vr.mMinState = IntegerValueRange::S_BOUND;
|
||||||
|
vr.mMaxState = IntegerValueRange::S_BOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8148,20 +8150,43 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
|
||||||
|
|
||||||
if (ins->mSrc[0].mIntConst > 0)
|
if (ins->mSrc[0].mIntConst > 0)
|
||||||
{
|
{
|
||||||
switch (ins->mSrc[1].mType)
|
if (vr.mMinState == IntegerValueRange::S_BOUND && vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
{
|
{
|
||||||
case IT_INT16:
|
switch (ins->mSrc[1].mType)
|
||||||
vr.mMaxValue = (short)(int64min(32767, vr.mMaxValue)) >> ins->mSrc[0].mIntConst;
|
{
|
||||||
vr.mMinValue = (short)(int64max(-32768, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
|
case IT_INT16:
|
||||||
break;
|
vr.mMaxValue = (short)(int64min(32767, vr.mMaxValue)) >> ins->mSrc[0].mIntConst;
|
||||||
case IT_INT8:
|
vr.mMinValue = (short)(int64max(-32768, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
|
||||||
vr.mMaxValue = (char)(int64min(127, vr.mMaxValue)) >> ins->mSrc[0].mIntConst;
|
break;
|
||||||
vr.mMinValue = (char)(int64max(-128, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
|
case IT_INT8:
|
||||||
break;
|
vr.mMaxValue = (char)(int64min(127, vr.mMaxValue)) >> ins->mSrc[0].mIntConst;
|
||||||
case IT_INT32:
|
vr.mMinValue = (char)(int64max(-128, vr.mMinValue)) >> ins->mSrc[0].mIntConst;
|
||||||
vr.mMaxValue = (int)(vr.mMaxValue) >> ins->mSrc[0].mIntConst;
|
break;
|
||||||
vr.mMinValue = (int)(vr.mMinValue) >> ins->mSrc[0].mIntConst;
|
case IT_INT32:
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8711,7 +8736,6 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case IA_CMPLS:
|
case IA_CMPLS:
|
||||||
// Why limit weak, makes no sense
|
|
||||||
if (s0 < 0)
|
if (s0 < 0)
|
||||||
{
|
{
|
||||||
mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
|
mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
|
||||||
|
@ -21191,7 +21215,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "getch");
|
CheckFunc = !strcmp(mIdent->mString, "interpret_builtin");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
Loading…
Reference in New Issue