Remove stores to global variables that are never read
This commit is contained in:
parent
d3cba85efe
commit
2cd7956736
|
@ -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];
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue