Validate register livetime during peephole optimization

This commit is contained in:
drmortalwombat 2022-04-23 22:11:25 +02:00
parent 4cdc501a34
commit 3a689cc7a1
9 changed files with 584 additions and 61 deletions

View File

@ -132,6 +132,9 @@ rem @echo off
@call :test charwintest.c
@if %errorlevel% neq 0 goto :error
@call :test linetest.c
@if %errorlevel% neq 0 goto :error
@call :test ptrinittest.c
@if %errorlevel% neq 0 goto :error

25
autotest/linetest.c Normal file
View File

@ -0,0 +1,25 @@
#include <gfx/bitmap.h>
#include <assert.h>
char * const Hires = (char *)0x4000;
Bitmap Screen;
ClipRect cr = {0, 0, 320, 200};
int main(void)
{
bm_init(&Screen, Hires, 40, 25);
bmu_rect_clear(&Screen, 0, 0, 320, 200);
bm_line(&Screen, &cr, 0, 0, 199, 199, 0xff, LINOP_SET);
for(int i=0; i<200; i++)
{
assert(Hires[(i & 7) + 320 * (i >> 3) + (i & ~7)] == 0x80 >> (i & 7));
}
return 0;
}

View File

@ -6438,14 +6438,27 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
case IC_LEA:
if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0 && ltvalue[ins->mSrc[0].mTemp])
{
InterInstruction* ains = ltvalue[ins->mSrc[0].mTemp];
InterInstruction* pins = ltvalue[ins->mSrc[0].mTemp];
if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSrc[0].mTemp < 0)
if (pins->mCode == IC_BINARY_OPERATOR && pins->mOperator == IA_ADD && pins->mSrc[0].mTemp < 0 && pins->mDst.mType == IT_INT16)
{
ins->mSrc[0] = ains->mSrc[1];
ins->mSrc[1].mIntConst += ains->mSrc[0].mIntConst;
ins->mSrc[0] = pins->mSrc[1];
ins->mSrc[1].mIntConst += pins->mSrc[0].mIntConst;
changed = true;
}
#if 1
else if (pins->mCode == IC_CONVERSION_OPERATOR && pins->mOperator == IA_EXT8TO16U && pins->mSrc[0].IsUByte() && pins->mSrc[0].mTemp >= 0 && ltvalue[pins->mSrc[0].mTemp])
{
InterInstruction* ains = ltvalue[pins->mSrc[0].mTemp];
if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSrc[0].mTemp < 0 && ains->mDst.mType == IT_INT16)
{
ins->mSrc[0] = ains->mSrc[1];
ins->mSrc[1].mIntConst += ains->mSrc[0].mIntConst;
changed = true;
}
}
#endif
}
break;
@ -10492,6 +10505,9 @@ void InterCodeProcedure::Close(void)
DisassembleDebug("Simplified range limited relational ops");
#endif
BuildTraces(false);
DisassembleDebug("Rebuilt traces");
#if 1
GrowingInstructionPtrArray silvalues(nullptr);
int silvused;

View File

@ -304,16 +304,16 @@ void Linker::Link(void)
LinkerObject* lobj = lsec->mObjects[k];
if ((lobj->mFlags & LOBJF_REFERENCED) && !(lobj->mFlags & LOBJF_PLACED) && lrgn->Allocate(this, lobj) )
{
if (lsec->mType == LST_DATA)
lrgn->mNonzero = lrgn->mUsed;
if (lobj->mAddress + lobj->mSize == lrgn->mStart + lrgn->mUsed)
if (lsec->mType != LST_BSS || lobj->mAddress + lobj->mSize == lrgn->mStart + lrgn->mUsed)
{
if (lobj->mAddress < lsec->mStart)
lsec->mStart = lobj->mAddress;
if (lobj->mAddress + lobj->mSize > lsec->mEnd)
lsec->mEnd = lobj->mAddress + lobj->mSize;
}
if (lsec->mType == LST_DATA && lsec->mEnd > lrgn->mNonzero)
lrgn->mNonzero = lsec->mEnd;
}
}
}
@ -322,19 +322,16 @@ void Linker::Link(void)
mProgramStart = 0xffff;
mProgramEnd = 0x0000;
int address = 0;
for (int i = 0; i < mRegions.Size(); i++)
{
LinkerRegion* lrgn = mRegions[i];
address = lrgn->mStart + lrgn->mNonzero;
if (lrgn->mNonzero)
{
if (lrgn->mStart < mProgramStart)
mProgramStart = lrgn->mStart;
if (address > mProgramEnd)
mProgramEnd = address;
if (lrgn->mNonzero > mProgramEnd)
mProgramEnd = lrgn->mNonzero;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -248,6 +248,7 @@ public:
bool MoveCLCLoadAddZPStoreUp(int at);
bool MoveLoadAddZPStoreUp(int at);
bool MoveLoadShiftRotateUp(int at);
bool MoveLoadShiftStoreUp(int at);
bool MoveCLCLoadAddZPStoreDown(int at);
bool FindDirectAddressSumY(int at, int reg, int& apos, int& breg);
@ -284,6 +285,8 @@ public:
bool PatchGlobalAdressSumYByX(int at, int reg, const NativeCodeInstruction& ains, int addr);
bool MergeXYSameValue(int from);
bool ReverseReplaceTAX(int at);
bool ValueForwarding(const NativeRegisterDataSet& data, bool global, bool final);
void CollectEntryBlocks(NativeCodeBasicBlock* block);
@ -330,6 +333,8 @@ public:
bool PatchForwardSumYPointer(const NativeCodeBasicBlock* block, int reg, int base, int index, int at, int yval);
bool IsDominatedBy(const NativeCodeBasicBlock* block) const;
void CheckLive(void);
};
class NativeCodeProcedure

View File

@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
#else
strcpy(strProductName, "oscar64");
strcpy(strProductVersion, "1.5.119");
strcpy(strProductVersion, "1.5.120");
#ifdef __APPLE__
uint32_t length = sizeof(basePath);

View File

@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,5,119,0
PRODUCTVERSION 1,5,119,0
FILEVERSION 1,5,120,0
PRODUCTVERSION 1,5,120,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.5.119.0"
VALUE "FileVersion", "1.5.120.0"
VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.5.119.0"
VALUE "ProductVersion", "1.5.120.0"
END
END
BLOCK "VarFileInfo"

View File

@ -4023,15 +4023,15 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:oscar64"
"ProductCode" = "8:{B1BF49F7-D667-4323-99B3-BBC698F30A19}"
"PackageCode" = "8:{4B34FDC5-E807-4B25-8603-B7969A6CF518}"
"ProductCode" = "8:{9290BC82-2F82-425B-940E-E5626BB5D5FD}"
"PackageCode" = "8:{B19DA3BE-65E1-4E1E-B167-39662B0C378C}"
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.5.119"
"ProductVersion" = "8:1.5.120"
"Manufacturer" = "8:oscar64"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"