Some more cross block pointer forwarding
This commit is contained in:
parent
cdd7a15a42
commit
9daf4fa621
|
@ -9265,6 +9265,50 @@ bool InterCodeBasicBlock::MoveTrainCrossBlock(void)
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InterCodeBasicBlock::ForwardLoopMovedTemp(void)
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
if (mTrueJump && !mFalseJump && mTrueJump->mLoopHead && mTrueJump->mNumEntries == 2)
|
||||||
|
{
|
||||||
|
InterCodeBasicBlock* eblock = nullptr;
|
||||||
|
if (mTrueJump->mTrueJump == mTrueJump)
|
||||||
|
eblock = mTrueJump->mFalseJump;
|
||||||
|
else if (mTrueJump->mFalseJump == mTrueJump)
|
||||||
|
eblock = mTrueJump->mTrueJump;
|
||||||
|
|
||||||
|
if (eblock)
|
||||||
|
{
|
||||||
|
int i = mInstructions.Size() - 1;
|
||||||
|
while (i >= 0)
|
||||||
|
{
|
||||||
|
if (mInstructions[i]->mCode == IC_LOAD_TEMPORARY && CanMoveInstructionBehindBlock(i) &&
|
||||||
|
!mTrueJump->mLocalUsedTemps[mInstructions[i]->mDst.mTemp] &&
|
||||||
|
!mTrueJump->mLocalModifiedTemps[mInstructions[i]->mSrc[0].mTemp])
|
||||||
|
{
|
||||||
|
eblock->mInstructions.Insert(0, mInstructions[i]);
|
||||||
|
mInstructions.Remove(i);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && mTrueJump->ForwardLoopMovedTemp())
|
||||||
|
changed = true;
|
||||||
|
if (mFalseJump && mFalseJump->ForwardLoopMovedTemp())
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void)
|
bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
@ -14187,6 +14231,10 @@ void InterCodeProcedure::Close(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
BuildDataFlowSets();
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->ForwardLoopMovedTemp();
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
do {
|
do {
|
||||||
TempForwarding();
|
TempForwarding();
|
||||||
|
|
|
@ -464,6 +464,7 @@ public:
|
||||||
bool IsLeafProcedure(void);
|
bool IsLeafProcedure(void);
|
||||||
|
|
||||||
bool ForwardDiamondMovedTemp(void);
|
bool ForwardDiamondMovedTemp(void);
|
||||||
|
bool ForwardLoopMovedTemp(void);
|
||||||
|
|
||||||
bool MoveTrainCrossBlock(void);
|
bool MoveTrainCrossBlock(void);
|
||||||
|
|
||||||
|
|
|
@ -28004,6 +28004,22 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].ChangesAccuAndFlag() &&
|
||||||
|
(mIns[i + 1].mType == ASMIT_INC || mIns[i + 1].mType == ASMIT_DEC) &&
|
||||||
|
mIns[i + 2].mType == ASMIT_ORA && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0 &&
|
||||||
|
mIns[i + 1].MayBeMovedBefore(mIns[i + 0]))
|
||||||
|
{
|
||||||
|
mIns.Insert(i, mIns[i + 1]);
|
||||||
|
mIns[i].mLive |= LIVE_CPU_REG_A;
|
||||||
|
if (mIns[i + 1].RequiresYReg())
|
||||||
|
mIns[i].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
if (mIns[i + 1].RequiresXReg())
|
||||||
|
mIns[i].mLive |= LIVE_CPU_REG_X;
|
||||||
|
mIns[i + 1].mLive |= LIVE_CPU_REG_Z;
|
||||||
|
mIns.Remove(i + 2);
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 &&
|
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 &&
|
||||||
|
@ -28882,6 +28898,19 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_STA &&
|
||||||
|
mIns[i + 2].mType == ASMIT_LDA &&
|
||||||
|
mIns[i + 3].mType == ASMIT_CMP && mIns[i + 3].mMode == ASMIM_IMMEDIATE && mIns[i + 3].mAddress == mIns[i + 0].mAddress && !(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 1].mLive |= LIVE_CPU_REG_A;
|
||||||
|
mIns[i + 2].mType = ASMIT_CMP; mIns[i + 2].mLive |= LIVE_CPU_REG_Z;
|
||||||
|
mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED;
|
||||||
|
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 0].mLive & LIVE_CPU_REG_A) &&
|
mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 0].mLive & LIVE_CPU_REG_A) &&
|
||||||
!mIns[i + 1].ReferencesZeroPage(mIns[i + 0].mAddress) && !mIns[i + 1].ChangesCarry() &&
|
!mIns[i + 1].ReferencesZeroPage(mIns[i + 0].mAddress) && !mIns[i + 1].ChangesCarry() &&
|
||||||
|
|
Loading…
Reference in New Issue