Fix double condition propagation

This commit is contained in:
drmortalwombat 2025-06-15 13:56:11 +02:00
parent 100608e0ac
commit 4633631d7e
2 changed files with 90 additions and 27 deletions

View File

@ -16135,40 +16135,99 @@ bool InterCodeBasicBlock::ShortcutDuplicateBranches(void)
if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp)
{
InterInstruction* cins = mInstructions[sz - 2];
InterInstruction* bins = mInstructions[sz - 1];
if (mTrueJump->mInstructions.Size() == 2 && mTrueJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mTrueJump->mInstructions[1]->mCode == IC_BRANCH && mTrueJump->mInstructions[0]->mDst.mTemp == mTrueJump->mInstructions[1]->mSrc[0].mTemp)
{
InterInstruction* tcins = mTrueJump->mInstructions[0];
InterInstruction* tbins = mTrueJump->mInstructions[1];
if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1]))
{
if (cins->mOperator == tcins->mOperator)
if (tbins->mSrc[0].mFinal)
{
if (ChangeTrueJump(mTrueJump->mTrueJump))
changed = true;
if (cins->mOperator == tcins->mOperator)
{
if (ChangeTrueJump(mTrueJump->mTrueJump))
changed = true;
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
{
if (ChangeTrueJump(mTrueJump->mFalseJump))
changed = true;
}
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
else if (bins->mSrc[0].mFinal)
{
if (ChangeTrueJump(mTrueJump->mFalseJump))
changed = true;
if (cins->mOperator == tcins->mOperator)
{
if (ChangeTrueJump(mTrueJump->mTrueJump))
{
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
bins->mSrc[0].mFinal = false;
mExitRequiredTemps += bins->mSrc[0].mTemp;
changed = true;
}
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
{
if (ChangeTrueJump(mTrueJump->mFalseJump))
{
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
bins->mSrc[0].mFinal = false;
cins->mOperator = tcins->mOperator;
mExitRequiredTemps += bins->mSrc[0].mTemp;
InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t;
changed = true;
}
}
}
}
}
if (mFalseJump->mInstructions.Size() == 2 && mFalseJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mFalseJump->mInstructions[1]->mCode == IC_BRANCH && mFalseJump->mInstructions[0]->mDst.mTemp == mFalseJump->mInstructions[1]->mSrc[0].mTemp)
{
InterInstruction* tcins = mFalseJump->mInstructions[0];
InterInstruction* tbins = mFalseJump->mInstructions[1];
if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1]))
{
if (cins->mOperator == tcins->mOperator)
if (tbins->mSrc[0].mFinal)
{
if (ChangeFalseJump(mFalseJump->mFalseJump))
changed = true;
if (cins->mOperator == tcins->mOperator)
{
if (ChangeFalseJump(mFalseJump->mFalseJump))
changed = true;
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
{
if (ChangeFalseJump(mFalseJump->mTrueJump))
changed = true;
}
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
else if (bins->mSrc[0].mFinal)
{
if (ChangeFalseJump(mFalseJump->mTrueJump))
changed = true;
if (cins->mOperator == tcins->mOperator)
{
if (ChangeFalseJump(mFalseJump->mFalseJump))
{
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
bins->mSrc[0].mFinal = false;
mExitRequiredTemps += bins->mSrc[0].mTemp;
changed = true;
}
}
else if (cins->mOperator == InvertRelational(tcins->mOperator))
{
if (ChangeFalseJump(mFalseJump->mTrueJump))
{
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
bins->mSrc[0].mFinal = false;
cins->mOperator = tcins->mOperator;
mExitRequiredTemps += bins->mSrc[0].mTemp;
InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t;
changed = true;
}
}
}
}
}
@ -24572,7 +24631,7 @@ void InterCodeProcedure::Close(void)
{
GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "main");
CheckFunc = !strcmp(mIdent->mString, "edit_line");
CheckCase = false;
mEntryBlock = mBlocks[0];

View File

@ -29,7 +29,7 @@ const char MissileChars[] = {
#define Charset ((char *)0xd800)
// Joystick and crosshair control
int CrossX = 160, CrossY = 100;
volatile int CrossX = 160, CrossY = 100;
bool CrossP = false;
char CrossDelay = 0;
@ -553,20 +553,22 @@ __interrupt void joy_interrupt()
joy_poll(0);
// Move crosshair coordinates
CrossX += 2 * joyx[0]; CrossY += 2 * joyy[0];
int cx = CrossX + 2 * joyx[0], cy = CrossY + 2 * joyy[0];
// Stop at edges of screen
if (CrossX < 8)
CrossX = 8;
else if (CrossX > 312)
CrossX = 312;
if (CrossY < 20)
CrossY = 20;
else if (CrossY > 172)
CrossY = 172;
if (cx < 8)
cx = 8;
else if (cx > 312)
cx = 312;
if (cy < 20)
cy = 20;
else if (cy > 172)
cy = 172;
// Move crosshair sprite
spr_move(0, CrossX + 14, CrossY + 40);
spr_move(0, cx + 14, cy + 40);
CrossX = cx;
CrossY = cy;
// Check button
if (joyb[0])
@ -697,15 +699,17 @@ void game_play(void)
// Check if fire request
if (CrossP)
{
int cx = CrossX, cy = CrossY;
// Find launch site
int sx = 160;
if (CrossX < 120)
if (cx < 120)
sx = 24;
else if (CrossX > 200)
else if (cx > 200)
sx = 296;
// Fire missile
missile_start(sx, 184, CrossX, CrossY);
missile_start(sx, 184, cx, cy);
// Reset request
CrossP = false;