Optimize short signed table access

This commit is contained in:
drmortalwombat 2023-07-08 22:20:42 +02:00
parent a46cf3a0d3
commit 0bab98ccc6

View File

@ -6376,12 +6376,16 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
{ {
if (ins->mDst.mType == IT_INT8) if (ins->mDst.mType == IT_INT8)
{ {
bool isUnsigned = false; bool isUnsigned = false, isSigned = false;
if (i + 1 < mInstructions.Size() && mInstructions[i + 1]->mCode == IC_CONVERSION_OPERATOR && mInstructions[i + 1]->mOperator == IA_EXT8TO16U && if (i + 1 < mInstructions.Size() && mInstructions[i + 1]->mCode == IC_CONVERSION_OPERATOR && mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal)
mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal) {
isUnsigned = true; if (mInstructions[i + 1]->mOperator == IA_EXT8TO16U)
isUnsigned = true;
else if (mInstructions[i + 1]->mOperator == IA_EXT8TO16S)
isSigned = true;
}
int mi = 0, ma = 0; int mi = 255, ma = 0;
if (vr.mMinState == IntegerValueRange::S_BOUND && vr.mMaxState == IntegerValueRange::S_BOUND && if (vr.mMinState == IntegerValueRange::S_BOUND && vr.mMaxState == IntegerValueRange::S_BOUND &&
vr.mMinValue >= -128 && vr.mMaxValue <= 127) vr.mMinValue >= -128 && vr.mMaxValue <= 127)
@ -6400,8 +6404,15 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
for (int j = 0; j < lo->mSize; j++) for (int j = 0; j < lo->mSize; j++)
{ {
int v = lo->mData[j]; int v = lo->mData[j];
if (!isUnsigned && (v & 0x80)) if (isUnsigned)
;
else if (isSigned)
v = (int8)v;
else if (v & 0x80)
mi = -128; mi = -128;
if (v < mi)
mi = v;
if (v > ma) if (v > ma)
ma = v; ma = v;
} }