Fix data dependency violation in cross diamond movement

This commit is contained in:
drmortalwombat 2022-07-26 19:36:10 +02:00
parent ca37ebff0b
commit e1a30a25c7
2 changed files with 15 additions and 4 deletions

View File

@ -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)

View File

@ -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;