From 2cd7956736568fc59bed49051b7702061fdf3762 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:08:37 +0100 Subject: [PATCH] Remove stores to global variables that are never read --- oscar64/Compiler.cpp | 12 +++++ oscar64/InterCode.cpp | 81 ++++++++++++++++++++++++++++++++++ oscar64/InterCode.h | 6 +++ oscar64/InterCodeGenerator.cpp | 12 +++++ oscar64/Linker.h | 2 + oscar64/Scanner.cpp | 4 +- 6 files changed, 116 insertions(+), 1 deletion(-) diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 33f7188..5ffd606 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -236,6 +236,18 @@ bool Compiler::GenerateCode(void) if (mErrors->mErrorCount != 0) 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++) { InterCodeProcedure* proc = mInterCodeModule->mProcedures[i]; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index e73901d..f355667 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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) { int i; @@ -5143,6 +5211,19 @@ void InterCodeProcedure::CallsFunctionPointer(void) mCallsFunctionPointer = true; } +void InterCodeProcedure::MarkRelevantStatics(void) +{ + ResetVisited(); + mEntryBlock->MarkRelevantStatics(); + +} + +void InterCodeProcedure::RemoveNonRelevantStatics(void) +{ + ResetVisited(); + mEntryBlock->RemoveNonRelevantStatics(); +} + void InterCodeProcedure::MapVariables(void) { ResetVisited(); diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 404328b..c9e8df9 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -499,6 +499,9 @@ public: bool IsLeafProcedure(void); + void MarkRelevantStatics(void); + void RemoveNonRelevantStatics(void); + void PeepholeOptimization(void); void SingleBlockLoopOptimisation(const NumberSet& aliasedParams); @@ -555,6 +558,9 @@ public: void AddCalledFunction(InterCodeProcedure* proc); void CallsFunctionPointer(void); + void MarkRelevantStatics(void); + void RemoveNonRelevantStatics(void); + void MapVariables(void); void ReduceTemporaries(void); void Disassemble(FILE* file); diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index a0a2445..f2d6d67 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -303,6 +303,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE; ref.mRefObject = aexp->mBase->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); } else @@ -325,6 +326,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE; ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 1; @@ -348,6 +350,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE; ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 1; @@ -377,6 +380,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_TEMPORARY; ref.mRefObject = dec->mLinkerObject; ref.mRefOffset = j; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); d[offset++] = aexp->mOffset; @@ -403,6 +407,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_TEMPORARY; ref.mRefObject = dec->mLinkerObject; ref.mRefOffset = j; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); d[offset++] = 0; @@ -440,6 +445,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefOffset = aexp->mInteger; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); } else @@ -460,6 +466,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mBase->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); } else @@ -478,6 +485,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mLinkerObject; ref.mRefOffset = 0; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 2; @@ -494,6 +502,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mLinkerObject; ref.mRefOffset = 0; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 2; @@ -511,6 +520,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 2; @@ -529,6 +539,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mLinkerObject; ref.mRefOffset = 0; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 2; @@ -546,6 +557,7 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex ref.mFlags = LREF_LOWBYTE | LREF_HIGHBYTE; ref.mRefObject = aexp->mBase->mLinkerObject; ref.mRefOffset = aexp->mOffset; + ref.mRefObject->mFlags |= LOBJF_RELEVANT; dec->mLinkerObject->AddReference(ref); offset += 2; diff --git a/oscar64/Linker.h b/oscar64/Linker.h index fa910d2..9229a4b 100644 --- a/oscar64/Linker.h +++ b/oscar64/Linker.h @@ -81,6 +81,8 @@ static const uint32 LOBJF_PLACED = 0x00000002; static const uint32 LOBJF_NO_FRAME = 0x00000004; static const uint32 LOBJF_INLINE = 0x00000008; static const uint32 LOBJF_CONST = 0x00000010; +static const uint32 LOBJF_RELEVANT = 0x00000020; + class LinkerObject { diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index 92af247..246d44a 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -730,7 +730,9 @@ void Scanner::NextRawToken(void) if (mToken != TK_EOF) { mToken = TK_ERROR; - mStartOfLine = false; + + if (mOffset > 1 || !IsWhitespace(mTokenChar)) + mStartOfLine = false; while (IsWhitespace(mTokenChar)) {