Fix loop inversion invariant integer range recovery

This commit is contained in:
drmortalwombat 2024-06-11 21:01:20 +02:00
parent c99c1756a9
commit 4cf64ee170
3 changed files with 6 additions and 2 deletions

View File

@ -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;

View File

@ -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];

View File

@ -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);