From ecaab1b5b3ff1a31d8b35f6d4b6c8ca3c6af45e0 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:04:13 +0100 Subject: [PATCH] Fix crash compiling infinite loop --- oscar64/NativeCodeGenerator.cpp | 57 +++++++++++++++++---------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index e0de622..329d428 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -34193,37 +34193,40 @@ bool NativeCodeBasicBlock::OptimizeXYSpilling(void) if (nblock == this) nblock = mFalseJump; - int ps = pblock->mIns.Size(); - if (nblock->mEntryBlocks.Size() == 1 && !pblock->mFalseJump && ps > 0) + if (nblock) { - if (!ReferencesAccu()) + int ps = pblock->mIns.Size(); + if (nblock->mEntryBlocks.Size() == 1 && !pblock->mFalseJump && ps > 0) { - if (!ReferencesXReg() && pblock->mIns.Size() > 0 && pblock->mIns[ps - 1].mType == ASMIT_TAX) + if (!ReferencesAccu()) { - nblock->mIns.Insert(0, NativeCodeInstruction(pblock->mIns[ps - 1].mIns, ASMIT_TAX)); - pblock->mIns.Remove(ps - 1); - ps--; - pblock->mExitRequiredRegs += CPU_REG_A; - nblock->mEntryRequiredRegs += CPU_REG_A; - mEntryRequiredRegs += CPU_REG_A; - mExitRequiredRegs += CPU_REG_A; - for (int i = 0; i < mIns.Size(); i++) - mIns[i].mLive |= LIVE_CPU_REG_A; - changed = true; - } + if (!ReferencesXReg() && pblock->mIns.Size() > 0 && pblock->mIns[ps - 1].mType == ASMIT_TAX) + { + nblock->mIns.Insert(0, NativeCodeInstruction(pblock->mIns[ps - 1].mIns, ASMIT_TAX)); + pblock->mIns.Remove(ps - 1); + ps--; + pblock->mExitRequiredRegs += CPU_REG_A; + nblock->mEntryRequiredRegs += CPU_REG_A; + mEntryRequiredRegs += CPU_REG_A; + mExitRequiredRegs += CPU_REG_A; + for (int i = 0; i < mIns.Size(); i++) + mIns[i].mLive |= LIVE_CPU_REG_A; + changed = true; + } - if (!ReferencesYReg() && pblock->mIns.Size() > 0 && pblock->mIns[ps - 1].mType == ASMIT_TAY) - { - nblock->mIns.Insert(0, NativeCodeInstruction(pblock->mIns[ps - 1].mIns, ASMIT_TAY)); - pblock->mIns.Remove(ps - 1); - ps--; - pblock->mExitRequiredRegs += CPU_REG_A; - nblock->mEntryRequiredRegs += CPU_REG_A; - mEntryRequiredRegs += CPU_REG_A; - mExitRequiredRegs += CPU_REG_A; - for (int i = 0; i < mIns.Size(); i++) - mIns[i].mLive |= LIVE_CPU_REG_A; - changed = true; + if (!ReferencesYReg() && pblock->mIns.Size() > 0 && pblock->mIns[ps - 1].mType == ASMIT_TAY) + { + nblock->mIns.Insert(0, NativeCodeInstruction(pblock->mIns[ps - 1].mIns, ASMIT_TAY)); + pblock->mIns.Remove(ps - 1); + ps--; + pblock->mExitRequiredRegs += CPU_REG_A; + nblock->mEntryRequiredRegs += CPU_REG_A; + mEntryRequiredRegs += CPU_REG_A; + mExitRequiredRegs += CPU_REG_A; + for (int i = 0; i < mIns.Size(); i++) + mIns[i].mLive |= LIVE_CPU_REG_A; + changed = true; + } } } }