Fix infinite loop unrolling

This commit is contained in:
drmortalwombat 2021-10-16 15:11:05 +02:00
parent c2886e2532
commit 815f64d14c
4 changed files with 23 additions and 15 deletions

View File

@ -3522,6 +3522,14 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 2].mRegisterFinal = mIns[i + 1].mRegisterFinal;
progress = true;
}
else if (mIns[i].mCode == BC_STORE_REG_32 &&
mIns[i + 1].LoadsRegister(BC_REG_ACCU) &&
mIns[i + 2].IsCommutative() && mIns[i].mRegister == mIns[i + 2].mRegister && mIns[i + 2].mRegisterFinal)
{
mIns[i + 0].mCode = BC_NOP;
mIns[i + 1].mRegister = mIns[i + 2].mRegister;
progress = true;
}
else if (mIns[i].mCode == BC_STORE_REG_16 &&
mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i + 1].mRegister != mIns[i + 2].mRegister &&
mIns[i + 2].IsCommutative() && mIns[i].mRegister == mIns[i + 2].mRegister)

View File

@ -62,7 +62,7 @@ void GlobalAnalyzer::AutoInline(void)
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_FUNC_ASSEMBLER) && !(f->mFlags & DTF_INTRINSIC) && !(f->mFlags & DTF_FUNC_RECURSIVE) && f->mLocalSize < 100)
{
int nparams = 0;
Declaration* dec = f->mParams;
Declaration* dec = f->mBase->mParams;
while (dec)
{
nparams++;
@ -120,10 +120,10 @@ void GlobalAnalyzer::AutoInline(void)
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_INTRINSIC) && f->mCalled.Size() == 0)
{
int nparams = 0;
Declaration* dec = f->mParams;
Declaration* dec = f->mBase->mParams;
while (dec)
{
nparams += dec->mSize;
nparams += dec->mBase->mSize;
dec = dec->mNext;
}

View File

@ -1868,7 +1868,7 @@ static bool IsInfiniteLoop(const InterCodeBasicBlock* block)
return false;
}
void InterCodeBasicBlock::GenerateTraces(void)
void InterCodeBasicBlock::GenerateTraces(bool expand)
{
int i;
@ -1896,7 +1896,7 @@ void InterCodeBasicBlock::GenerateTraces(void)
if (mFalseJump)
mFalseJump->mNumEntries++;
}
else if (mTrueJump && !mFalseJump && ((mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump))
else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump))
{
mTrueJump->mNumEntries--;
@ -1916,8 +1916,8 @@ void InterCodeBasicBlock::GenerateTraces(void)
break;
}
if (mTrueJump) mTrueJump->GenerateTraces();
if (mFalseJump) mFalseJump->GenerateTraces();
if (mTrueJump) mTrueJump->GenerateTraces(expand);
if (mFalseJump) mFalseJump->GenerateTraces(expand);
mInPath = false;
}
@ -4265,7 +4265,7 @@ void InterCodeProcedure::DisassembleDebug(const char* name)
Disassemble(name);
}
void InterCodeProcedure::BuildTraces(void)
void InterCodeProcedure::BuildTraces(bool expand)
{
// Count number of entries
//
@ -4281,7 +4281,7 @@ void InterCodeProcedure::BuildTraces(void)
// Build traces
//
ResetVisited();
mEntryBlock->GenerateTraces();
mEntryBlock->GenerateTraces(expand);
ResetVisited();
for (int i = 0; i < mBlocks.Size(); i++)
@ -4438,7 +4438,7 @@ void InterCodeProcedure::Close(void)
DisassembleDebug("start");
BuildTraces();
BuildTraces(true);
ResetVisited();
mLeafProcedure = mEntryBlock->IsLeafProcedure();
@ -4505,7 +4505,7 @@ void InterCodeProcedure::Close(void)
eliminated = mEntryBlock->EliminateDeadBranches();
if (eliminated)
{
BuildTraces();
BuildTraces(false);
/*
ResetVisited();
for (int i = 0; i < mBlocks.Size(); i++)
@ -4631,7 +4631,7 @@ void InterCodeProcedure::Close(void)
DisassembleDebug("local variables to temps");
BuildTraces();
BuildTraces(false);
BuildDataFlowSets();

View File

@ -431,7 +431,7 @@ public:
void Close(InterCodeBasicBlock* trueJump, InterCodeBasicBlock* falseJump);
void CollectEntries(void);
void GenerateTraces(void);
void GenerateTraces(bool expand);
void LocalToTemp(int vindex, int temp);
@ -545,7 +545,7 @@ public:
void ReduceTemporaries(void);
void Disassemble(const char* name, bool dumpSets = false);
protected:
void BuildTraces(void);
void BuildTraces(bool expand);
void BuildDataFlowSets(void);
void RenameTemporaries(void);
void TempForwarding(void);