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; mIns[i + 2].mRegisterFinal = mIns[i + 1].mRegisterFinal;
progress = true; 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 && 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 + 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) 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) 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; int nparams = 0;
Declaration* dec = f->mParams; Declaration* dec = f->mBase->mParams;
while (dec) while (dec)
{ {
nparams++; 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) 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; int nparams = 0;
Declaration* dec = f->mParams; Declaration* dec = f->mBase->mParams;
while (dec) while (dec)
{ {
nparams += dec->mSize; nparams += dec->mBase->mSize;
dec = dec->mNext; dec = dec->mNext;
} }

View File

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

View File

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