From 0b8304b40d263767e5624f4bcc1b4bf86dcfb99b Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 28 Jul 2024 17:52:07 +0200 Subject: [PATCH] More cross block const pointer forwarding --- oscar64/InterCode.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 402cd08..1fac959 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -12402,6 +12402,21 @@ InterInstruction* InterCodeBasicBlock::FindTempOrigin(int temp) const return nullptr; } +InterInstruction* InterCodeBasicBlock::FindTempOriginSinglePath(int temp) const +{ + for (int i = mInstructions.Size() - 1; i >= 0; i--) + { + if (mInstructions[i]->mDst.mTemp == temp) + { + mMark = i; + return mInstructions[i]; + } + } + if (mEntryBlocks.Size() == 1) + return mEntryBlocks[0]->FindTempOriginSinglePath(temp); + return nullptr; +} + bool InterCodeBasicBlock::CanMoveInstructionDown(int si, int ti) const { InterInstruction* ins = mInstructions[si]; @@ -16178,7 +16193,7 @@ bool InterCodeBasicBlock::PullStoreUpToConstAddress(void) if (ins->mCode == IC_STORE && ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0 && CanMoveInstructionBeforeBlock(i)) { int j = 0; - while (j < mEntryBlocks.Size() && (cins = mEntryBlocks[j]->FindTempOrigin(ins->mSrc[1].mTemp)) && cins->mCode == IC_CONSTANT) + while (j < mEntryBlocks.Size() && (cins = mEntryBlocks[j]->FindTempOriginSinglePath(ins->mSrc[1].mTemp)) && cins->mCode == IC_CONSTANT) j++; if (j == mEntryBlocks.Size()) @@ -22608,6 +22623,12 @@ void InterCodeProcedure::Close(void) #endif BuildDataFlowSets(); + + GrowingInstructionPtrArray ptemps(nullptr); + ptemps.SetSize(mTemporaries.Size()); + ResetVisited(); + mEntryBlock->ForwardConstTemps(ptemps); + ResetVisited(); mEntryBlock->PullStoreUpToConstAddress(); DisassembleDebug("PullStoreUpToConstAddress");