Improve outliner for short loops

This commit is contained in:
drmortalwombat 2025-02-18 14:51:42 +01:00
parent 39840b5fb1
commit f6296e83e5
2 changed files with 38 additions and 1 deletions

View File

@ -331,6 +331,9 @@ exit /b %errorlevel%
..\bin\oscar64 -e -O2 -xz -Oz -n %~1 ..\bin\oscar64 -e -O2 -xz -Oz -n %~1
@if %errorlevel% neq 0 goto :error @if %errorlevel% neq 0 goto :error
..\bin\oscar64 -e -O2 -Oo -n %~1
@if %errorlevel% neq 0 goto :error
@exit /b 0 @exit /b 0
:testb :testb
@ -370,4 +373,7 @@ exit /b %errorlevel%
..\bin\oscar64 -e -O2 -xz -Oz -n %~1 ..\bin\oscar64 -e -O2 -xz -Oz -n %~1
@if %errorlevel% neq 0 goto :error @if %errorlevel% neq 0 goto :error
..\bin\oscar64 -e -O2 -Oo -n %~1
@if %errorlevel% neq 0 goto :error
@exit /b 0 @exit /b 0

View File

@ -56112,11 +56112,24 @@ void NativeCodeGenerator::OutlineFunctions(void)
}); });
// Check for complete loop block replacement // Check for complete loop block replacement
bool trueLoop = false, falseLoop = false;
int k = 0; int k = 0;
while (k < segs.Size() && segs[k].mStart == 0 && segs[k].mEnd == segs[k].mBlock->mIns.Size() && segs[k].mBlock->mTrueJump == segs[k].mBlock && segs[k].mBlock->mBranch == segs[0].mBlock->mBranch) while (k < segs.Size() && segs[k].mStart == 0 && segs[k].mEnd == segs[k].mBlock->mIns.Size() && segs[k].mBlock->mTrueJump == segs[k].mBlock && segs[k].mBlock->mBranch == segs[0].mBlock->mBranch)
k++; k++;
if (k == segs.Size()) if (k == segs.Size())
trueLoop = true;
else if (k == 0)
{
while (k < segs.Size() && segs[k].mStart == 0 && segs[k].mEnd == segs[k].mBlock->mIns.Size() && segs[k].mBlock->mFalseJump == segs[k].mBlock && segs[k].mBlock->mBranch == segs[0].mBlock->mBranch)
k++;
if (k == segs.Size())
falseLoop = true;
}
if (trueLoop || falseLoop)
{ {
NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock();
@ -56127,6 +56140,7 @@ void NativeCodeGenerator::OutlineFunctions(void)
for (int i = 0; i < segs.Size(); i++) for (int i = 0; i < segs.Size(); i++)
{ {
SuffixSegment& s(segs[i]); SuffixSegment& s(segs[i]);
if (trueLoop)
segs[i].mBlock->mTrueJump = segs[i].mBlock->mFalseJump; segs[i].mBlock->mTrueJump = segs[i].mBlock->mFalseJump;
segs[i].mBlock->mFalseJump = nullptr; segs[i].mBlock->mFalseJump = nullptr;
segs[i].mBlock->mBranch = ASMIT_JMP; segs[i].mBlock->mBranch = ASMIT_JMP;
@ -56157,6 +56171,23 @@ void NativeCodeGenerator::OutlineFunctions(void)
mProcedures.Push(nproc); mProcedures.Push(nproc);
if (trueLoop || falseLoop)
{
ExpandingArray<NativeCodeProcedure *> procs;
for (int i = 0; i < segs.Size(); i++)
{
SuffixSegment& s(segs[i]);
NativeCodeProcedure* p = s.mBlock->mProc;
if (!procs.Contains(p))
{
procs.Push(p);
p->ResetVisited();
p->mEntryBlock->MergeBasicBlocks();
}
}
}
numOutlines++; numOutlines++;
progress = true; progress = true;
} }