Some cascading store optimization
This commit is contained in:
parent
79ec9af3f2
commit
05a6d16dde
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue