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_BASIC 0x36
#define MMAP_NO_ROM 0x35 #define MMAP_NO_ROM 0x35
#define MMAP_RAM 0x30 #define MMAP_RAM 0x30
#define MMAP_CHAR_ROM 0x31
// Install an IRQ an NMI trampoline, that routes the kernal interrupts // Install an IRQ an NMI trampoline, that routes the kernal interrupts
// through an intermediate trampoline when the kernal ROM is not paged // through an intermediate trampoline when the kernal ROM is not paged

View File

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

View File

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

View File

@ -964,9 +964,9 @@ int scanf_func(void * fparam)
return getchar(); 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, ...) int scanf(const char * fmt, ...)

View File

@ -18,7 +18,7 @@ int sprintf(char * str, const char * fmt, ...);
int scanf(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") #pragma compile("stdio.c")

View File

@ -7872,7 +7872,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
changed = true; 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->mNumEntries--;
mTrueJump = mTrueJump->mTrueJump; mTrueJump = mTrueJump->mTrueJump;
@ -7880,7 +7880,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
changed = true; 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->mNumEntries--;
mFalseJump = mFalseJump->mTrueJump; mFalseJump = mFalseJump->mTrueJump;
@ -8585,35 +8585,41 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(void)
{ {
if (mTrueJump->mIns.Size() > mFalseJump->mIns.Size()) if (mTrueJump->mIns.Size() > mFalseJump->mIns.Size())
{ {
int i = 0, offset = mTrueJump->mIns.Size() - mFalseJump->mIns.Size(); if (mTrueJump->mTrueJump != mFalseJump)
while (i < mFalseJump->mIns.Size() && mFalseJump->mIns[i].IsSame(mTrueJump->mIns[i + offset]))
i++;
if (i == mFalseJump->mIns.Size())
{ {
if (mTrueJump->mTrueJump) int i = 0, offset = mTrueJump->mIns.Size() - mFalseJump->mIns.Size();
mTrueJump->mTrueJump->RemEntryBlock(mTrueJump); while (i < mFalseJump->mIns.Size() && mFalseJump->mIns[i].IsSame(mTrueJump->mIns[i + offset]))
mTrueJump->mTrueJump = mFalseJump; i++;
if (mTrueJump->mTrueJump) if (i == mFalseJump->mIns.Size())
mTrueJump->mTrueJump->AddEntryBlock(mTrueJump); {
mTrueJump->mIns.SetSize(offset); if (mTrueJump->mTrueJump)
mTrueJump->mTrueJump->RemEntryBlock(mTrueJump);
mTrueJump->mTrueJump = mFalseJump;
if (mTrueJump->mTrueJump)
mTrueJump->mTrueJump->AddEntryBlock(mTrueJump);
mTrueJump->mIns.SetSize(offset);
changed = true; changed = true;
}
} }
} }
else else
{ {
int i = 0, offset = mFalseJump->mIns.Size() - mTrueJump->mIns.Size(); if (mFalseJump->mTrueJump != mTrueJump)
while (i < mTrueJump->mIns.Size() && mTrueJump->mIns[i].IsSame(mFalseJump->mIns[i + offset]))
i++;
if (i == mTrueJump->mIns.Size())
{ {
if (mFalseJump->mTrueJump) int i = 0, offset = mFalseJump->mIns.Size() - mTrueJump->mIns.Size();
mFalseJump->mTrueJump->RemEntryBlock(mFalseJump); while (i < mTrueJump->mIns.Size() && mTrueJump->mIns[i].IsSame(mFalseJump->mIns[i + offset]))
mFalseJump->mTrueJump = mTrueJump; i++;
if (mFalseJump->mTrueJump) if (i == mTrueJump->mIns.Size())
mFalseJump->mTrueJump->AddEntryBlock(mFalseJump); {
mFalseJump->mIns.SetSize(offset); if (mFalseJump->mTrueJump)
changed = true; mFalseJump->mTrueJump->RemEntryBlock(mFalseJump);
mFalseJump->mTrueJump = mTrueJump;
if (mFalseJump->mTrueJump)
mFalseJump->mTrueJump->AddEntryBlock(mFalseJump);
mFalseJump->mIns.SetSize(offset);
changed = true;
}
} }
} }
} }