From 815f64d14cb1824da2c74b4ce8969a9213d96947 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sat, 16 Oct 2021 15:11:05 +0200 Subject: [PATCH] Fix infinite loop unrolling --- oscar64/ByteCodeGenerator.cpp | 10 +++++++++- oscar64/GlobalAnalyzer.cpp | 6 +++--- oscar64/InterCode.cpp | 18 +++++++++--------- oscar64/InterCode.h | 4 ++-- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 1fb0398..f108ad2 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -3462,7 +3462,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void) mIns[i + 2].mCode = BC_NOP; else mIns[i + 2].mCode = BC_STORE_REG_16; - + progress = true; } else if (mIns[i].mCode == BC_STORE_REG_32 && @@ -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) diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index 534d5b5..a5d1fa6 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -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; } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index ac2a3ce..e2079ea 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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(); diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index e374c63..f555a08 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -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);