Some cascading store optimization

This commit is contained in:
drmortalwombat 2025-05-19 17:23:28 +02:00
parent 79ec9af3f2
commit 05a6d16dde
4 changed files with 34 additions and 12 deletions

View File

@ -39,7 +39,7 @@ rem @echo off
@call :testh opp_list.cpp
@if %errorlevel% neq 0 goto :error
@call :testh opp_functional.cpp
@call :testn opp_functional.cpp
@if %errorlevel% neq 0 goto :error
@call :testh operatoroverload.cpp

View File

@ -1610,8 +1610,9 @@ const Ident* Declaration::FullIdent(void)
Declaration* dec = mBase->mParams;
while (dec)
{
if (dec->mBase->mIdent)
tident = tident->Mangle(dec->mBase->MangleIdent()->mString);
const Ident* mident = dec->mBase->MangleIdent();
if (mident)
tident = tident->Mangle(mident->mString);
dec = dec->mNext;
if (dec)
tident = tident->Mangle(",");
@ -1747,7 +1748,7 @@ const Ident* Declaration::MangleIdent(void)
}
dec = dec->mNext;
if (dec)
if (mMangleIdent && dec)
mMangleIdent = mMangleIdent->Mangle(",");
}
}
@ -1764,11 +1765,14 @@ const Ident* Declaration::MangleIdent(void)
}
if (mMangleIdent)
{
if (mFlags & DTF_CONST)
mMangleIdent = mMangleIdent->PreMangle("const ");
if (mFlags & DTF_VOLATILE)
mMangleIdent = mMangleIdent->PreMangle("volatile ");
}
}
return mMangleIdent;
}

View File

@ -47,7 +47,7 @@ const Ident* Ident::Unique(const char* str)
const Ident* Ident::PreMangle(const char* str) const
{
char buffer[200];
char buffer[1000];
strcpy_s(buffer, str);
strcat_s(buffer, mString);
return Unique(buffer);
@ -55,14 +55,14 @@ const Ident* Ident::PreMangle(const char* str) const
const Ident* Ident::Unique(const char* str, int id)
{
char buffer[200];
char buffer[1000];
sprintf_s(buffer, "%s#%d", str, id);
return Unique(buffer);
}
const Ident* Ident::Mangle(const char* str) const
{
char buffer[200];
char buffer[1000];
strcpy_s(buffer, mString);
strcat_s(buffer, str);
return Unique(buffer);

View File

@ -20738,6 +20738,24 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
changed = true;
}
if (i + 3 < mInstructions.Size() &&
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 0]->mSrc[0].mTemp < 0 &&
mInstructions[i + 0]->mDst.IsUByte() && mInstructions[i + 0]->mSrc[1].IsUByte() &&
mInstructions[i + 1]->mCode == IC_CONVERSION_OPERATOR && mInstructions[i + 1]->mOperator == IA_EXT8TO16U &&
mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal &&
mInstructions[i + 2]->mCode == IC_LEA && mInstructions[i + 2]->mSrc[1].mTemp >= 0 &&
mInstructions[i + 2]->mSrc[0].mTemp == mInstructions[i + 1]->mDst.mTemp && mInstructions[i + 2]->mSrc[0].mFinal &&
mInstructions[i + 3]->mCode == IC_STORE &&
mInstructions[i + 3]->mSrc[1].mTemp == mInstructions[i + 2]->mDst.mTemp && mInstructions[i + 3]->mSrc[1].mFinal)
{
mInstructions[i + 3]->mSrc[1].mIntConst += mInstructions[i + 0]->mSrc[0].mIntConst;
mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mSrc[1];
mInstructions[i + 1]->mDst.mRange = mInstructions[i + 0]->mSrc[1].mRange;
mInstructions[i + 2]->mSrc[0].mRange = mInstructions[i + 0]->mSrc[1].mRange;
changed = true;
}
if (i + 3 < mInstructions.Size() &&
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SHR &&
mInstructions[i + 0]->mSrc[0].mTemp < 0 &&
@ -23581,7 +23599,7 @@ void InterCodeProcedure::Close(void)
{
GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "main");
CheckFunc = !strcmp(mIdent->mString, "fill");
CheckCase = false;
mEntryBlock = mBlocks[0];