Remove stores to global variables that are never read

This commit is contained in:
drmortalwombat 2021-11-01 16:08:37 +01:00
parent d3cba85efe
commit 2cd7956736
6 changed files with 116 additions and 1 deletions

View File

@ -236,6 +236,18 @@ bool Compiler::GenerateCode(void)
if (mErrors->mErrorCount != 0) if (mErrors->mErrorCount != 0)
return false; return false;
#if 1
for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++)
{
mInterCodeModule->mProcedures[i]->MarkRelevantStatics();
}
for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++)
{
mInterCodeModule->mProcedures[i]->RemoveNonRelevantStatics();
}
#endif
for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++) for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++)
{ {
InterCodeProcedure* proc = mInterCodeModule->mProcedures[i]; InterCodeProcedure* proc = mInterCodeModule->mProcedures[i];

View File

@ -3767,6 +3767,74 @@ void InterCodeBasicBlock::MapVariables(GrowingVariableArray& globalVars, Growing
} }
} }
void InterCodeBasicBlock::MarkRelevantStatics(void)
{
int i;
if (!mVisited)
{
mVisited = true;
for (i = 0; i < mInstructions.Size(); i++)
{
const InterInstruction* ins(mInstructions[i]);
if (ins->mCode == IC_LOAD)
{
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_GLOBAL)
ins->mSrc[0].mLinkerObject->mFlags |= LOBJF_RELEVANT;
}
else if (ins->mCode == IC_LEA)
{
if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mMemory == IM_GLOBAL)
ins->mSrc[1].mLinkerObject->mFlags |= LOBJF_RELEVANT;
}
else if (ins->mCode == IC_CONSTANT && ins->mDst.mType == IT_POINTER)
{
if (ins->mConst.mMemory == IM_GLOBAL)
ins->mConst.mLinkerObject->mFlags |= LOBJF_RELEVANT;
}
else if (ins->mCode == IC_COPY || ins->mCode == IC_STRCPY)
{
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_GLOBAL)
ins->mSrc[0].mLinkerObject->mFlags |= LOBJF_RELEVANT;
if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mMemory == IM_GLOBAL)
ins->mSrc[1].mLinkerObject->mFlags |= LOBJF_RELEVANT;
}
}
if (mTrueJump) mTrueJump->MarkRelevantStatics();
if (mFalseJump) mFalseJump->MarkRelevantStatics();
}
}
void InterCodeBasicBlock::RemoveNonRelevantStatics(void)
{
int i;
if (!mVisited)
{
mVisited = true;
for (i = 0; i < mInstructions.Size(); i++)
{
InterInstruction* ins(mInstructions[i]);
if (ins->mCode == IC_STORE)
{
if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mMemory == IM_GLOBAL && !ins->mVolatile)
{
if (!(ins->mSrc[1].mLinkerObject->mFlags & LOBJF_RELEVANT) && (ins->mSrc[1].mLinkerObject->mType == LOT_BSS || ins->mSrc[1].mLinkerObject->mType == LOT_DATA))
{
ins->mCode = IC_NONE;
}
}
}
}
if (mTrueJump) mTrueJump->RemoveNonRelevantStatics();
if (mFalseJump) mFalseJump->RemoveNonRelevantStatics();
}
}
void InterCodeBasicBlock::CollectOuterFrame(int level, int& size, bool &inner, bool &inlineAssembler, bool &byteCodeCall) void InterCodeBasicBlock::CollectOuterFrame(int level, int& size, bool &inner, bool &inlineAssembler, bool &byteCodeCall)
{ {
int i; int i;
@ -5143,6 +5211,19 @@ void InterCodeProcedure::CallsFunctionPointer(void)
mCallsFunctionPointer = true; mCallsFunctionPointer = true;
} }
void InterCodeProcedure::MarkRelevantStatics(void)
{
ResetVisited();
mEntryBlock->MarkRelevantStatics();
}
void InterCodeProcedure::RemoveNonRelevantStatics(void)
{
ResetVisited();
mEntryBlock->RemoveNonRelevantStatics();
}
void InterCodeProcedure::MapVariables(void) void InterCodeProcedure::MapVariables(void)
{ {
ResetVisited(); ResetVisited();

View File

@ -499,6 +499,9 @@ public:
bool IsLeafProcedure(void); bool IsLeafProcedure(void);
void MarkRelevantStatics(void);
void RemoveNonRelevantStatics(void);
void PeepholeOptimization(void); void PeepholeOptimization(void);
void SingleBlockLoopOptimisation(const NumberSet& aliasedParams); void SingleBlockLoopOptimisation(const NumberSet& aliasedParams);
@ -555,6 +558,9 @@ public:
void AddCalledFunction(InterCodeProcedure* proc); void AddCalledFunction(InterCodeProcedure* proc);
void CallsFunctionPointer(void); void CallsFunctionPointer(void);
void MarkRelevantStatics(void);
void RemoveNonRelevantStatics(void);
void MapVariables(void); void MapVariables(void);
void ReduceTemporaries(void); void ReduceTemporaries(void);
void Disassemble(FILE* file); void Disassemble(FILE* file);

View File

@ -303,6 +303,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE; ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger; ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
} }
else else
@ -325,6 +326,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE; ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset; ref.mRefOffset = aexp->mOffset;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 1; offset += 1;
@ -348,6 +350,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE; ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset; ref.mRefOffset = aexp->mOffset;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 1; offset += 1;
@ -377,6 +380,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_TEMPORARY; ref.mFlags = LREF_TEMPORARY;
ref.mRefObject = dec->mLinkerObject; ref.mRefObject = dec->mLinkerObject;
ref.mRefOffset = j; ref.mRefOffset = j;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
d[offset++] = aexp->mOffset; d[offset++] = aexp->mOffset;
@ -403,6 +407,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_TEMPORARY; ref.mFlags = LREF_TEMPORARY;
ref.mRefObject = dec->mLinkerObject; ref.mRefObject = dec->mLinkerObject;
ref.mRefOffset = j; ref.mRefOffset = j;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
d[offset++] = 0; d[offset++] = 0;
@ -440,6 +445,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mLinkerObject;
ref.mRefOffset = aexp->mInteger; ref.mRefOffset = aexp->mInteger;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
} }
else else
@ -460,6 +466,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mBase->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger; ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
} }
else else
@ -478,6 +485,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mLinkerObject; ref.mRefObject = aexp->mLinkerObject;
ref.mRefOffset = 0; ref.mRefOffset = 0;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 2; offset += 2;
@ -494,6 +502,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mLinkerObject; ref.mRefObject = aexp->mLinkerObject;
ref.mRefOffset = 0; ref.mRefOffset = 0;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 2; offset += 2;
@ -511,6 +520,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset; ref.mRefOffset = aexp->mOffset;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 2; offset += 2;
@ -529,6 +539,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mLinkerObject; ref.mRefObject = aexp->mLinkerObject;
ref.mRefOffset = 0; ref.mRefOffset = 0;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 2; offset += 2;
@ -546,6 +557,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE;
ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefObject = aexp->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset; ref.mRefOffset = aexp->mOffset;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref); dec->mLinkerObject->AddReference(ref);
offset += 2; offset += 2;

View File

@ -81,6 +81,8 @@ static const uint32 LOBJF_PLACED = 0x00000002;
static const uint32 LOBJF_NO_FRAME = 0x00000004; static const uint32 LOBJF_NO_FRAME = 0x00000004;
static const uint32 LOBJF_INLINE = 0x00000008; static const uint32 LOBJF_INLINE = 0x00000008;
static const uint32 LOBJF_CONST = 0x00000010; static const uint32 LOBJF_CONST = 0x00000010;
static const uint32 LOBJF_RELEVANT = 0x00000020;
class LinkerObject class LinkerObject
{ {

View File

@ -730,7 +730,9 @@ void Scanner::NextRawToken(void)
if (mToken != TK_EOF) if (mToken != TK_EOF)
{ {
mToken = TK_ERROR; mToken = TK_ERROR;
mStartOfLine = false;
if (mOffset > 1 || !IsWhitespace(mTokenChar))
mStartOfLine = false;
while (IsWhitespace(mTokenChar)) while (IsWhitespace(mTokenChar))
{ {