From e1a30a25c7a3fe2f7c5774bc168de9dd0198c9b8 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 26 Jul 2022 19:36:10 +0200 Subject: [PATCH] Fix data dependency violation in cross diamond movement --- oscar64/InterCode.cpp | 8 +++++++- oscar64/NativeCodeGenerator.cpp | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index a9807b2..ae98052 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8846,7 +8846,10 @@ bool InterCodeBasicBlock::PushSinglePathResultInstructions(void) for (int j = 0; j < ins->mNumOperands; j++) { if (ins->mSrc[j].mTemp >= 0) + { trueExitRequiredTemps += ins->mSrc[j].mTemp; + mTrueJump->mEntryRequiredTemps += ins->mSrc[j].mTemp; + } } mTrueJump->mInstructions.Insert(0, ins); mInstructions.Remove(i); @@ -8858,7 +8861,10 @@ bool InterCodeBasicBlock::PushSinglePathResultInstructions(void) for (int j = 0; j < ins->mNumOperands; j++) { if (ins->mSrc[j].mTemp >= 0) + { falseExitRequiredTems += ins->mSrc[j].mTemp; + mFalseJump->mEntryRequiredTemps += ins->mSrc[j].mTemp; + } } mFalseJump->mInstructions.Insert(0, ins); mInstructions.Remove(i); @@ -8871,7 +8877,7 @@ bool InterCodeBasicBlock::PushSinglePathResultInstructions(void) !mTrueJump->mLocalUsedTemps[dtemp] && !mTrueJump->mLocalModifiedTemps[dtemp]) { int j = 0; - while (j < ins->mNumOperands && !(ins->mSrc[j].mTemp >= 0 && (mFalseJump->mLocalModifiedTemps[dtemp] || mTrueJump->mLocalModifiedTemps[dtemp]))) + while (j < ins->mNumOperands && !(ins->mSrc[j].mTemp >= 0 && (mFalseJump->mLocalModifiedTemps[ins->mSrc[j].mTemp] || mTrueJump->mLocalModifiedTemps[ins->mSrc[j].mTemp]))) j++; if (j == ins->mNumOperands) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 8db2bac..1aebd18 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -17323,18 +17323,22 @@ bool NativeCodeBasicBlock::MoveStoreXUp(int at) return done; } - mIns[at].mLive |= mIns[at - 1].mLive; + int live = mIns[at - 1].mLive; mIns[at + n].mLive |= LIVE_CPU_REG_X; NativeCodeInstruction ins = mIns[at - 1]; if (ins.mMode == ASMIM_ABSOLUTE_X) ins.mAddress -= inc; - if (ins.RequiresYReg()) mIns[at].mLive |= LIVE_CPU_REG_Y; - if (ins.RequiresAccu()) mIns[at].mLive |= LIVE_CPU_REG_A; + if (ins.RequiresCarry()) live |= LIVE_CPU_REG_C; + if (ins.RequiresYReg()) live |= LIVE_CPU_REG_Y; + if (ins.RequiresAccu()) live |= LIVE_CPU_REG_A; for (int i = 0; i <= n; i++) + { + mIns[at + i].mLive |= live; mIns[at - 1 + i] = mIns[at + i]; + } mIns[at + n] = ins; done = true; } @@ -23036,6 +23040,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass (mIns[i + 2].mLive & LIVE_MEM) == 0) { mIns[i + 1].mType = mIns[i + 2].mType; + mIns[i + 1].mLive |= mIns[i + 2].mLive; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; progress = true;