Improve outliner for short loops
This commit is contained in:
parent
39840b5fb1
commit
f6296e83e5
|
@ -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
|
||||||
|
|
|
@ -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,7 +56140,8 @@ 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]);
|
||||||
segs[i].mBlock->mTrueJump = segs[i].mBlock->mFalseJump;
|
if (trueLoop)
|
||||||
|
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;
|
||||||
segs[i].mBlock->mNumEntries = 1;
|
segs[i].mBlock->mNumEntries = 1;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue