Fix invalid abs,y to abs,x propagation

This commit is contained in:
drmortalwombat 2024-08-18 13:26:35 +02:00
parent 122dc12d40
commit c58bb46e7e

View File

@ -34369,7 +34369,7 @@ bool NativeCodeBasicBlock::IndexXYValueForwarding(int xreg, int xoffset, int xva
xoffset = 0; xoffset = 0;
} }
else if (i + 1 < mIns.Size() && mIns[i].mAddress == yreg && yoffset == 0 && else if (i + 1 < mIns.Size() && mIns[i].mAddress == yreg && yoffset == 0 &&
mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode && ASMIM_ABSOLUTE_X && !(mIns[i].mLive & LIVE_CPU_REG_A)) mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ABSOLUTE_X && !(mIns[i].mLive & LIVE_CPU_REG_A))
{ {
mIns[i] = NativeCodeInstruction(mIns[i + 1].mIns, ASMIT_LDA, mIns[i + 1]); mIns[i] = NativeCodeInstruction(mIns[i + 1].mIns, ASMIT_LDA, mIns[i + 1]);
mIns[i].mMode = ASMIM_ABSOLUTE_Y; mIns[i].mMode = ASMIM_ABSOLUTE_Y;
@ -49671,6 +49671,8 @@ void NativeCodeBasicBlock::CheckAsmCode(void)
assert(HasAsmInstructionMode(mIns[j].mType, ASMIM_IMMEDIATE)); assert(HasAsmInstructionMode(mIns[j].mType, ASMIM_IMMEDIATE));
else else
assert(HasAsmInstructionMode(mIns[j].mType, mIns[j].mMode)); assert(HasAsmInstructionMode(mIns[j].mType, mIns[j].mMode));
if (mIns[j].mMode == ASMIM_ABSOLUTE || mIns[j].mMode == ASMIM_ABSOLUTE_Y || mIns[j].mMode == ASMIM_ABSOLUTE_X)
assert(mIns[j].mLinkerObject != nullptr || mIns[j].mAddress > 0);
} }
if (mTrueJump) mTrueJump->CheckAsmCode(); if (mTrueJump) mTrueJump->CheckAsmCode();
@ -49757,7 +49759,7 @@ void NativeCodeBasicBlock::CheckLive(void)
else else
assert(HasAsmInstructionMode(mIns[j].mType, mIns[j].mMode)); assert(HasAsmInstructionMode(mIns[j].mType, mIns[j].mMode));
if (mIns[j].mMode == ASMIM_ABSOLUTE || mIns[j].mMode == ASMIM_ZERO_PAGE) if (mIns[j].mMode == ASMIM_ABSOLUTE || mIns[j].mMode == ASMIM_ZERO_PAGE || mIns[j].mMode == ASMIM_ABSOLUTE_X || mIns[j].mMode == ASMIM_ABSOLUTE_Y)
assert(mIns[j].mLinkerObject != nullptr || mIns[j].mAddress > 0); assert(mIns[j].mLinkerObject != nullptr || mIns[j].mAddress > 0);
if (mIns[j].mType != ASMIT_NOP) if (mIns[j].mType != ASMIT_NOP)
@ -51310,6 +51312,11 @@ void NativeCodeProcedure::Optimize(void)
mEntryBlock->LocalZeroPageValueNumbering(); mEntryBlock->LocalZeroPageValueNumbering();
} }
#if _DEBUG
ResetVisited();
mEntryBlock->CheckAsmCode();
#endif
if (step == 9 || step == 16) if (step == 9 || step == 16)
{ {
ResetVisited(); ResetVisited();
@ -51318,6 +51325,12 @@ void NativeCodeProcedure::Optimize(void)
} }
#if _DEBUG
ResetVisited();
mEntryBlock->CheckAsmCode();
#endif
int t = 0; int t = 0;
#if 1 #if 1
do do
@ -51391,6 +51404,8 @@ void NativeCodeProcedure::Optimize(void)
} }
} }
CheckBlocks();
if (step == 9) if (step == 9)
{ {
ResetVisited(); ResetVisited();
@ -52119,6 +52134,11 @@ void NativeCodeProcedure::Optimize(void)
changed = true; changed = true;
} }
#if 1 #if 1
#if _DEBUG
ResetVisited();
mEntryBlock->CheckAsmCode();
#endif
if (step == 10) if (step == 10)
{ {
if (changed) if (changed)
@ -52135,6 +52155,11 @@ void NativeCodeProcedure::Optimize(void)
} }
} }
#if _DEBUG
ResetVisited();
mEntryBlock->CheckAsmCode();
#endif
if (step == 11) if (step == 11)
{ {
if (changed && cnt < 20) if (changed && cnt < 20)