Fix compiler getting stuck on optimizing infinite loop

This commit is contained in:
drmortalwombat 2021-12-25 12:30:24 +01:00
parent 9bd3d3391a
commit 24cc6e20c8
6 changed files with 44 additions and 29 deletions

View File

@ -7,6 +7,7 @@
#define MMAP_NO_BASIC 0x36
#define MMAP_NO_ROM 0x35
#define MMAP_RAM 0x30
#define MMAP_CHAR_ROM 0x31
// Install an IRQ an NMI trampoline, that routes the kernal interrupts
// through an intermediate trampoline when the kernal ROM is not paged

View File

@ -89,6 +89,9 @@ ex:
__asm irq1
{
lda $d019
bpl ex2
ldx nextIRQ
l1:
lda rasterIRQNext, x
@ -131,7 +134,6 @@ e2:
lda npos
sta tpos
asl $d019
jmp ex
e1:
@ -144,7 +146,11 @@ e1:
ex:
asl $d019
jmp $ea81
ex2:
LDA $DC0D
cli
jmp $ea31
}
@ -268,12 +274,13 @@ void rirq_init(bool kernalIRQ)
{
sei
#if 0
// disable CIA interrupts
lda #$7f
sta $dc0d
sta $dd0d
#endif
}
if (kernalIRQ)

View File

@ -2,6 +2,7 @@
#include "tinyfont.h"
#include <stdlib.h>
#include <c64/asm6502.h>
#include <string.h>
void bm_init(Bitmap * bm, char * data, char cw, char ch)
{

View File

@ -964,9 +964,9 @@ int scanf_func(void * fparam)
return getchar();
}
int sscanf(const char * fmt, const char * str, ...)
int sscanf(const char * str, const char * fmt, ...)
{
return fpscanf(fmt, sscanf_func, &str, (void **)((&str) + 1));
return fpscanf(fmt, sscanf_func, &str, (void **)((&fmt) + 1));
}
int scanf(const char * fmt, ...)

View File

@ -18,7 +18,7 @@ int sprintf(char * str, const char * fmt, ...);
int scanf(const char * fmt, ...);
int sscanf(const char * fmt, const char * str, ...);
int sscanf(const char * str, const char * fmt, ...);
#pragma compile("stdio.c")

View File

@ -7872,7 +7872,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
changed = true;
}
while (mTrueJump && mTrueJump->mIns.Size() == 0 && !mTrueJump->mFalseJump && !mTrueJump->mLocked && mTrueJump != this)
while (mTrueJump && mTrueJump->mIns.Size() == 0 && !mTrueJump->mFalseJump && !mTrueJump->mLocked && mTrueJump != this && mTrueJump->mTrueJump != mTrueJump)
{
mTrueJump->mNumEntries--;
mTrueJump = mTrueJump->mTrueJump;
@ -7880,7 +7880,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
changed = true;
}
while (mFalseJump && mFalseJump->mIns.Size() == 0 && !mFalseJump->mFalseJump && !mFalseJump->mLocked && mFalseJump != this)
while (mFalseJump && mFalseJump->mIns.Size() == 0 && !mFalseJump->mFalseJump && !mFalseJump->mLocked && mFalseJump != this && mFalseJump->mTrueJump != mFalseJump)
{
mFalseJump->mNumEntries--;
mFalseJump = mFalseJump->mTrueJump;
@ -8584,6 +8584,8 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(void)
if (mTrueJump && mFalseJump && !mTrueJump->mFalseJump && !mFalseJump->mFalseJump && mTrueJump->mTrueJump == mFalseJump->mTrueJump)
{
if (mTrueJump->mIns.Size() > mFalseJump->mIns.Size())
{
if (mTrueJump->mTrueJump != mFalseJump)
{
int i = 0, offset = mTrueJump->mIns.Size() - mFalseJump->mIns.Size();
while (i < mFalseJump->mIns.Size() && mFalseJump->mIns[i].IsSame(mTrueJump->mIns[i + offset]))
@ -8600,7 +8602,10 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(void)
changed = true;
}
}
}
else
{
if (mFalseJump->mTrueJump != mTrueJump)
{
int i = 0, offset = mFalseJump->mIns.Size() - mTrueJump->mIns.Size();
while (i < mTrueJump->mIns.Size() && mTrueJump->mIns[i].IsSame(mFalseJump->mIns[i + offset]))
@ -8617,6 +8622,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(void)
}
}
}
}
#endif
if (mTrueJump && mTrueJump->JoinTailCodeSequences())
changed = true;