From 323589a484bd4304682fa84e2b100c495db9edbc Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:55:10 +0200 Subject: [PATCH] Optimize compilation time --- oscar64/Array.h | 22 ++++++++++++++++++---- oscar64/InterCode.cpp | 29 ++++++++++++++++------------- oscar64/InterCode.h | 2 +- oscar64/NativeCodeGenerator.cpp | 2 ++ 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/oscar64/Array.h b/oscar64/Array.h index b81992c..b2e1048 100644 --- a/oscar64/Array.h +++ b/oscar64/Array.h @@ -421,11 +421,13 @@ protected: array = a2; } + for (int i = size; i < to; i++) array[i] = T{}; + size = to; } template - void Parition(const F & f, int l, int r) + void Partition(const F & f, int l, int r) { if (r > l + 1) { @@ -442,8 +444,8 @@ protected: } array[pi] = p; - Parition(f, l, pi); - Parition(f, pi + 1, r); + Partition(f, l, pi); + Partition(f, pi + 1, r); } } public: @@ -618,10 +620,22 @@ public: return false; } + void Fill(const T& t) + { + for (int i = 0; i < size; i++) + array[i] = t; + } + + void Clear(void) + { + for (int i = 0; i < size; i++) + array[i] = T{}; + } + template void Sort(const F & f) { - Parition(f, 0, size); + Partition(f, 0, size); } __forceinline T& operator[](int n) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6d3dcd0..178d005 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -5872,8 +5872,6 @@ void InterInstruction::Disassemble(FILE* file, InterCodeProcedure* proc) InterCodeBasicBlock::InterCodeBasicBlock(InterCodeProcedure * proc) : mProc(proc), mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mMergeAValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr), mDominator(nullptr), - mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), - mEntryParamValueRange(IntegerValueRange()), mTrueParamValueRange(IntegerValueRange()), mFalseParamValueRange(IntegerValueRange()), mLocalParamValueRange(IntegerValueRange()), mLoadStoreInstructions(nullptr), mMemoryValueSize(0), mEntryMemoryValueSize(0) { mVisited = false; @@ -7980,9 +7978,6 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const Growin if (!mLoopHead && mNumEntered < mEntryBlocks.Size()) return false; - mProc->mLocalValueRange.Clear(); - mLocalParamValueRange.Clear(); - assert(mProc->mLocalValueRange.Size() == mExitRequiredTemps.Size()); assert(mLocalParamValueRange.Size() == paramVars.Size()); @@ -8015,6 +8010,12 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const Growin } } + if (firstEntry) + { + mProc->mLocalValueRange.Clear(); + mLocalParamValueRange.Clear(); + } + assert(mProc->mLocalValueRange.Size() == mExitRequiredTemps.Size()); assert(mLocalParamValueRange.Size() == paramVars.Size()); @@ -22178,12 +22179,15 @@ void InterCodeBasicBlock::RemapActiveTemporaries(const FastNumberSet& set) for (int i = 0; i < set.Num(); i++) { int j = set.Element(i); - mEntryValueRange[i] = entryValueRange[j]; - mTrueValueRange[i] = trueValueRange[j]; - mFalseValueRange[i] = falseValueRange[j]; -// mLocalValueRange[i] = localValueRange[j]; -// mReverseValueRange[i] = reverseValueRange[j]; - mMemoryValueSize[i] = memoryValueSize[j]; + if (j < entryValueRange.Size()) + { + mEntryValueRange[i] = entryValueRange[j]; + mTrueValueRange[i] = trueValueRange[j]; + mFalseValueRange[i] = falseValueRange[j]; + // mLocalValueRange[i] = localValueRange[j]; + // mReverseValueRange[i] = reverseValueRange[j]; + mMemoryValueSize[i] = memoryValueSize[j]; + } } if (mTrueJump) mTrueJump->RemapActiveTemporaries(set); @@ -22289,8 +22293,7 @@ InterCodeProcedure::InterCodeProcedure(InterCodeModule * mod, const Location & l mSaveTempsLinkerObject(nullptr), mValueReturn(false), mFramePointer(false), mCheckUnreachable(true), mReturnType(IT_NONE), mCheapInline(false), mNoInline(false), mDeclaration(nullptr), mGlobalsChecked(false), mDispatchedCall(false), - mNumRestricted(1), - mReverseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()) + mNumRestricted(1) { mID = mModule->mProcedures.Size(); mModule->mProcedures.Push(this); diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 69df2d1..36e13a7 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -198,7 +198,7 @@ public: -typedef GrowingArray GrowingIntegerValueRangeArray; +typedef ExpandingArray GrowingIntegerValueRangeArray; class ValueSet { diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index c75cc3f..0a688bb 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -47447,6 +47447,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate3(int i, int pass) mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mLive |= LIVE_CPU_REG_A; mIns[i + 1].mLive |= LIVE_CPU_REG_A; mIns.Insert(i, ins); + if (mIns[i + 1].RequiresCarry()) + mIns[i + 0].mLive |= LIVE_CPU_REG_C; return true; } else if (