From c28f342f3ebdee75dfb610affd3e2f5407f98fad Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 3 May 2024 14:54:58 +0200 Subject: [PATCH] Remove some superflous range violation warnings --- oscar64/InterCode.cpp | 8 +++++++- oscar64/NativeCodeGenerator.cpp | 24 +++++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6e2c953..c2e2638 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -11941,7 +11941,10 @@ void InterCodeBasicBlock::RenameValueRanges(const GrowingIntArray& renameTable, if (mEntryValueRange.Size() > 0) { mProc->mLocalValueRange = mEntryValueRange; + GrowingArray memoryValueSize(mMemoryValueSize); + mEntryValueRange.SetSize(numTemps, true); + mMemoryValueSize.SetSize(numTemps, true); for (int i = 0; i < mProc->mLocalValueRange.Size(); i++) { if (renameTable[i] >= 0) @@ -11950,6 +11953,7 @@ void InterCodeBasicBlock::RenameValueRanges(const GrowingIntArray& renameTable, assert(mProc->mLocalValueRange[i].mMaxState == IntegerValueRange::S_UNKNOWN || mEntryValueRange[renameTable[i]].mMaxState == IntegerValueRange::S_UNKNOWN); mEntryValueRange[renameTable[i]].Limit(mProc->mLocalValueRange[i]); + mMemoryValueSize[renameTable[i]] = int64min(mMemoryValueSize[renameTable[i]], memoryValueSize[i]); } } } @@ -19644,6 +19648,8 @@ void InterCodeProcedure::RebuildIntegerRangeSet(void) { mLocalValueRange.SetSize(mTemporaries.Size(), false); + DisassembleDebug("BeforeRebuildIntegerRangeSet"); + ResetVisited(); mEntryBlock->RestartLocalIntegerRangeSets(mTemporaries.Size(), mLocalVars, mParamVars); @@ -20564,7 +20570,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "main"); + CheckFunc = !strcmp(mIdent->mString, "interpret_program"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 9e2916f..f99ece9 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -22655,6 +22655,12 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool mEntryRequiredRegs += CPU_REG_Y; if (ins.RequiresXReg()) mEntryRequiredRegs += CPU_REG_X; + if (ins.ChangesZFlag()) + mEntryRequiredRegs -= CPU_REG_Z; + if (ins.ChangesCarry()) + mEntryRequiredRegs -= CPU_REG_C; + if (ins.RequiresCarry()) + mEntryRequiredRegs += CPU_REG_C; mIns.Insert(0, ins); @@ -22668,6 +22674,12 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool b->mExitRequiredRegs += CPU_REG_Y; if (ins.RequiresXReg()) b->mExitRequiredRegs += CPU_REG_X; + if (ins.ChangesZFlag()) + b->mExitRequiredRegs -= CPU_REG_Z; + if (ins.ChangesCarry()) + b->mExitRequiredRegs -= CPU_REG_C; + if (ins.RequiresCarry()) + b->mExitRequiredRegs += CPU_REG_C; b->mIns.SetSize(b->mIns.Size() - 1); } @@ -34166,6 +34178,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc prevBlock->mIns.Push(mIns[si]); mIns.Remove(si); + prevBlock->mExitRequiredRegs += CPU_REG_X; + mEntryRequiredRegs += CPU_REG_X; mExitRequiredRegs += CPU_REG_X; @@ -34199,6 +34213,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc prevBlock->mIns.Push(mIns[si]); mIns.Remove(si); + prevBlock->mExitRequiredRegs += CPU_REG_X; + mEntryRequiredRegs += CPU_REG_X; mExitRequiredRegs += CPU_REG_X; @@ -46146,6 +46162,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[sz - 2].mType = ASMIT_NOP; mIns[sz - 2].mMode = ASMIM_IMPLIED; mIns[sz - 1].mType = ASMIT_ORA; mIns[sz - 1].mAddress = 0; mIns[sz - 1].mLive |= LIVE_CPU_REG_Z; + mExitRequiredRegs -= CPU_REG_C; + CheckLive(); } } @@ -46661,9 +46679,9 @@ void NativeCodeBasicBlock::CheckLive(void) assert(mEntryRequiredRegs[CPU_REG_Y]); } - if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_Z]) + if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_Z] && (mFalseJump || mTrueJump->mEntryRequiredRegs[CPU_REG_Z])) live |= LIVE_CPU_REG_Z; - if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_C]) + if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_C] && (mFalseJump || mTrueJump->mEntryRequiredRegs[CPU_REG_C])) live |= LIVE_CPU_REG_C; for (int j = mIns.Size() - 1; j >= 0; j--) @@ -47391,7 +47409,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) { mInterProc = proc; - CheckFunc = !strcmp(mInterProc->mIdent->mString, "plants_iterate"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "edit_text"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks];