Fix loop inversion invariant integer range recovery
This commit is contained in:
parent
c99c1756a9
commit
4cf64ee170
|
@ -1500,6 +1500,8 @@ const Ident* Declaration::MangleIdent(void)
|
||||||
|
|
||||||
if (mFlags & DTF_CONST)
|
if (mFlags & DTF_CONST)
|
||||||
mMangleIdent = mMangleIdent->PreMangle("const ");
|
mMangleIdent = mMangleIdent->PreMangle("const ");
|
||||||
|
if (mFlags & DTF_VOLATILE)
|
||||||
|
mMangleIdent = mMangleIdent->PreMangle("volatile ");
|
||||||
}
|
}
|
||||||
|
|
||||||
return mMangleIdent;
|
return mMangleIdent;
|
||||||
|
|
|
@ -14661,6 +14661,7 @@ bool InterCodeBasicBlock::SingleTailLoopOptimization(const NumberSet& aliasedPar
|
||||||
ains->mSrc[0] = nins->mSrc[0];
|
ains->mSrc[0] = nins->mSrc[0];
|
||||||
ains->mSrc[0].mIntConst *= indexScale[lins->mSrc[0].mTemp];
|
ains->mSrc[0].mIntConst *= indexScale[lins->mSrc[0].mTemp];
|
||||||
tail->mInstructions.Insert(tail->mInstructions.Size() - 3, ains);
|
tail->mInstructions.Insert(tail->mInstructions.Size() - 3, ains);
|
||||||
|
ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst;
|
||||||
|
|
||||||
indexScale[ains->mDst.mTemp] = (int)ains->mSrc[0].mIntConst;
|
indexScale[ains->mDst.mTemp] = (int)ains->mSrc[0].mIntConst;
|
||||||
|
|
||||||
|
@ -14695,6 +14696,7 @@ bool InterCodeBasicBlock::SingleTailLoopOptimization(const NumberSet& aliasedPar
|
||||||
ains->mSrc[0].mTemp = -1;
|
ains->mSrc[0].mTemp = -1;
|
||||||
ains->mSrc[0].mIntConst = s;
|
ains->mSrc[0].mIntConst = s;
|
||||||
tail->mInstructions.Insert(tail->mInstructions.Size() - 3, ains);
|
tail->mInstructions.Insert(tail->mInstructions.Size() - 3, ains);
|
||||||
|
ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst;
|
||||||
|
|
||||||
indexScale[ains->mDst.mTemp] = s;
|
indexScale[ains->mDst.mTemp] = s;
|
||||||
|
|
||||||
|
@ -20998,7 +21000,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "read_decompress");
|
CheckFunc = !strcmp(mIdent->mString, "_menuShowSprites");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
|
@ -9098,7 +9098,7 @@ Expression* Parser::ParseStatement(void)
|
||||||
{
|
{
|
||||||
int numLoops = (endValue - startValue + 255) / 256;
|
int numLoops = (endValue - startValue + 255) / 256;
|
||||||
int numIterations = (endValue - startValue) / numLoops;
|
int numIterations = (endValue - startValue) / numLoops;
|
||||||
int stride = (endValue - startValue + numLoops - 1) / numLoops;
|
int stride = (endValue - startValue) / numLoops;
|
||||||
int remain = (endValue - startValue) - numIterations * numLoops;
|
int remain = (endValue - startValue) - numIterations * numLoops;
|
||||||
|
|
||||||
Expression* unrollBody = new Expression(mScanner->mLocation, EX_SEQUENCE);
|
Expression* unrollBody = new Expression(mScanner->mLocation, EX_SEQUENCE);
|
||||||
|
|
Loading…
Reference in New Issue