Shortcut identical consecutive conditional branches

This commit is contained in:
drmortalwombat 2022-12-25 22:14:12 +01:00
parent 5696691a19
commit 1a06102668
3 changed files with 49 additions and 11 deletions

View File

@ -114,6 +114,7 @@ inline void sidfx_loop_ch(byte ch)
{
channels[ch].cnt--;
channels[ch].com++;
channels[ch].priority = channels[ch].com->priority;
channels[ch].state = SIDFX_READY;
}
else
@ -140,6 +141,7 @@ inline void sidfx_loop_ch(byte ch)
{
channels[ch].cnt--;
channels[ch].com++;
channels[ch].priority = channels[ch].com->priority;
channels[ch].state = SIDFX_RESET_0;
}
else

View File

@ -4060,6 +4060,32 @@ void InterCodeBasicBlock::GenerateTraces(bool expand, bool compact)
if (mFalseJump)
mFalseJump->mNumEntries++;
}
else if (
mTrueJump &&
mInstructions.Size() > 0 &&
mInstructions.Last()->mCode == IC_BRANCH &&
mTrueJump->mInstructions.Size() == 1 &&
mTrueJump->mInstructions[0]->mCode == IC_BRANCH &&
mTrueJump->mInstructions[0]->mSrc[0].mTemp == mInstructions.Last()->mSrc[0].mTemp)
{
mTrueJump->mNumEntries--;
mTrueJump = mTrueJump->mTrueJump;
if (mTrueJump)
mTrueJump->mNumEntries++;
}
else if (
mFalseJump &&
mInstructions.Size() > 0 &&
mInstructions.Last()->mCode == IC_BRANCH &&
mFalseJump->mInstructions.Size() == 1 &&
mFalseJump->mInstructions[0]->mCode == IC_BRANCH &&
mFalseJump->mInstructions[0]->mSrc[0].mTemp == mInstructions.Last()->mSrc[0].mTemp)
{
mFalseJump->mNumEntries--;
mFalseJump = mFalseJump->mFalseJump;
if (mFalseJump)
mFalseJump->mNumEntries++;
}
else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1 && !mLoopHead) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump, mTrueJump))
{
mTrueJump->mNumEntries--;

View File

@ -16780,17 +16780,20 @@ bool NativeCodeBasicBlock::CheckPatchFailUse(void)
bool NativeCodeBasicBlock::CheckPatchFailReg(const NativeCodeBasicBlock* block, int reg)
{
if (mPatched)
if (mPatched && mEntryRequiredRegs[reg])
return false;
if (!mPatchFail)
{
mPatchFail = true;
if (mTrueJump && !mTrueJump->CheckPatchFailReg(block, reg))
return false;
if (mFalseJump && !mFalseJump->CheckPatchFailReg(block, reg))
return false;
if (this != block)
{
if (mTrueJump && !mTrueJump->CheckPatchFailReg(block, reg))
return false;
if (mFalseJump && !mFalseJump->CheckPatchFailReg(block, reg))
return false;
}
}
return true;
@ -16798,9 +16801,6 @@ bool NativeCodeBasicBlock::CheckPatchFailReg(const NativeCodeBasicBlock* block,
bool NativeCodeBasicBlock::CheckSingleUseGlobalLoad(const NativeCodeBasicBlock* block, int reg, int at, const NativeCodeInstruction& ains, int cycles)
{
if (mPatchFail)
return false;
if (!mPatched)
{
if (at == 0)
@ -16809,7 +16809,9 @@ bool NativeCodeBasicBlock::CheckSingleUseGlobalLoad(const NativeCodeBasicBlock*
if (!mEntryRequiredRegs[reg])
{
if (mExitRequiredRegs[reg])
mPatchFail = true;
// if (mExitRequiredRegs[reg])
{
if (mTrueJump && !mTrueJump->CheckPatchFailReg(block, reg))
return false;
@ -16832,6 +16834,9 @@ bool NativeCodeBasicBlock::CheckSingleUseGlobalLoad(const NativeCodeBasicBlock*
}
}
if (mPatchFail)
return false;
while (at < mIns.Size())
{
NativeCodeInstruction& ins(mIns[at]);
@ -25301,6 +25306,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
CheckLive();
#if 1
#if 1
// move load store pairs up to initial store
@ -31826,7 +31832,8 @@ void NativeCodeProcedure::RebuildEntry(void)
void NativeCodeProcedure::Optimize(void)
{
CheckFunc = !strcmp(mInterProc->mIdent->mString, "chain_prepend");
CheckFunc = !strcmp(mInterProc->mIdent->mString, "main");
#if 1
int step = 0;
int cnt = 0;
@ -31995,6 +32002,7 @@ void NativeCodeProcedure::Optimize(void)
if (mEntryBlock->RemoveDoubleZPStore())
changed = true;
}
#if 1
if (step > 0)
{
@ -32046,7 +32054,6 @@ void NativeCodeProcedure::Optimize(void)
mEntryBlock->CheckBlocks(true);
#endif
#if 1
if (step > 2 && !changed)
{
@ -32295,6 +32302,7 @@ void NativeCodeProcedure::Optimize(void)
changed = true;
}
#endif
if (step == 7)
{
ResetVisited();
@ -32337,6 +32345,8 @@ void NativeCodeProcedure::Optimize(void)
else
cnt++;
} while (changed);
#if 1