From 259abf4c4b2f6073229ec82a9a6881382c4a163a Mon Sep 17 00:00:00 2001
From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com>
Date: Tue, 20 Sep 2022 15:01:47 +0200
Subject: [PATCH] Improve compiler speed
---
.gitignore | 4 +++
include/c64/keyboard.h | 4 ++-
oscar64/Array.h | 12 ++++++--
oscar64/InterCode.cpp | 61 ++++++++++++++++++++---------------------
oscar64/InterCode.h | 4 +--
oscar64/NumberSet.cpp | 26 +++++++++++-------
oscar64/oscar64.vcxproj | 6 ++++
7 files changed, 69 insertions(+), 48 deletions(-)
diff --git a/.gitignore b/.gitignore
index d9366ad..f3941e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -345,3 +345,7 @@ make/oscar64
*.crt
*.crt
*.d64
+*.tlog
+*.res
+*.recipe
+*.exe
diff --git a/include/c64/keyboard.h b/include/c64/keyboard.h
index d00981a..2c7e287 100644
--- a/include/c64/keyboard.h
+++ b/include/c64/keyboard.h
@@ -103,7 +103,9 @@ enum KeyScanCode
KSCAN_STOP,
KSCAN_QUAL_SHIFT = 0x40,
- KSCAN_QUAL_DOWN = 0x80
+ KSCAN_QUAL_DOWN = 0x80,
+
+ KSCAN_MAX = 0xff
};
// map of keyboard codes to PETSCII, first 64 without shift
diff --git a/oscar64/Array.h b/oscar64/Array.h
index 5fe9ed4..f9151ef 100644
--- a/oscar64/Array.h
+++ b/oscar64/Array.h
@@ -196,11 +196,14 @@ public:
GrowingArray(const GrowingArray& a)
: empty(a.empty)
{
- int i;
size = a.size;
range = a.range;
array = new T[range];
- for (i = 0; i < size; i++) array[i] = a.array[i];
+
+ int lsize = size;
+ const T* sap = a.array;
+ T* dap = array;
+ for (int i = 0; i < lsize; i++) dap[i] = sap[i];
}
GrowingArray & operator=(const GrowingArray& a)
@@ -208,7 +211,10 @@ public:
if (a.size != size)
Grow(a.size, true);
- for (int i = 0; i < size; i++) array[i] = a.array[i];
+ int lsize = size;
+ const T* sap = a.array;
+ T* dap = array;
+ for (int i = 0; i < lsize; i++) dap[i] = sap[i];
return *this;
}
diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp
index ef04ac4..7a1f440 100644
--- a/oscar64/InterCode.cpp
+++ b/oscar64/InterCode.cpp
@@ -1279,18 +1279,23 @@ TempForwardingTable::TempForwardingTable(void) : mAssoc(Assoc(-1, -1, -1))
{
}
-TempForwardingTable::TempForwardingTable(const TempForwardingTable& table) : mAssoc(Assoc(-1, -1, -1))
+TempForwardingTable::TempForwardingTable(const TempForwardingTable& table) : mAssoc(table.mAssoc)
{
+#if 0
+ mAssoc.Reserve(table.mAssoc.Size());
for (int i = 0; i < table.mAssoc.Size(); i++)
{
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
mAssoc[i].mPred = table.mAssoc[i].mPred;
}
+#endif
}
TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& table)
{
+ mAssoc = table.mAssoc;
+#if 0
mAssoc.SetSize(table.mAssoc.Size());
for (int i = 0; i < table.mAssoc.Size(); i++)
{
@@ -1298,7 +1303,7 @@ TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& t
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
mAssoc[i].mPred = table.mAssoc[i].mPred;
}
-
+#endif
return *this;
}
@@ -6341,7 +6346,7 @@ void InterCodeBasicBlock::BuildLocalTempSets(int num)
}
}
-void InterCodeBasicBlock::BuildGlobalProvidedTempSet(NumberSet fromProvidedTemps)
+void InterCodeBasicBlock::BuildGlobalProvidedTempSet(const NumberSet & fromProvidedTemps)
{
bool changed = false;
@@ -6555,61 +6560,50 @@ bool InterCodeBasicBlock::CalculateSingleAssignmentTemps(FastNumberSet& tassigne
return changed;
}
-void InterCodeBasicBlock::PerformTempForwarding(TempForwardingTable& forwardingTable)
+void InterCodeBasicBlock::PerformTempForwarding(const TempForwardingTable& forwardingTable)
{
int i;
if (!mVisited)
{
- TempForwardingTable localForwardingTable(forwardingTable);
-
if (mLoopHead)
{
if (mNumEntries == 2 && (mTrueJump == this || mFalseJump == this) && mLocalModifiedTemps.Size())
{
- assert(localForwardingTable.Size() == mLocalModifiedTemps.Size());
+ mMergeForwardingTable = forwardingTable;
+ assert(mMergeForwardingTable.Size() == mLocalModifiedTemps.Size());
for (int i = 0; i < mLocalModifiedTemps.Size(); i++)
{
if (mLocalModifiedTemps[i])
- localForwardingTable.Destroy(i);
+ mMergeForwardingTable.Destroy(i);
}
}
else
- localForwardingTable.Reset();
+ mMergeForwardingTable.SetSize(forwardingTable.Size());
}
-#if 0
- else if (mNumEntries > 1)
+ else
{
- lvalues.FlushAll();
- ltvalue.Clear();
- }
-#endif
- else if (mNumEntries > 0)
- {
- if (mNumEntered > 0)
- {
- localForwardingTable.Intersect(mMergeForwardingTable);
- }
+ if (mNumEntered == 0)
+ mMergeForwardingTable = forwardingTable;
+ else
+ mMergeForwardingTable.Intersect(forwardingTable);
mNumEntered++;
if (mNumEntered < mNumEntries)
- {
- mMergeForwardingTable = localForwardingTable;
return;
- }
}
mVisited = true;
for (i = 0; i < mInstructions.Size(); i++)
{
- mInstructions[i]->PerformTempForwarding(localForwardingTable);
+ mInstructions[i]->PerformTempForwarding(mMergeForwardingTable);
}
- if (mTrueJump) mTrueJump->PerformTempForwarding(localForwardingTable);
- if (mFalseJump) mFalseJump->PerformTempForwarding(localForwardingTable);
+ if (mTrueJump) mTrueJump->PerformTempForwarding(mMergeForwardingTable);
+ if (mFalseJump) mFalseJump->PerformTempForwarding(mMergeForwardingTable);
}
}
@@ -12440,13 +12434,16 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet)
silvused = activeSet.Num();
silvalues.SetSize(silvused + 16, true);
- mTemporaries.SetSize(activeSet.Num(), true);
+ if (silvused != mTemporaries.Size())
+ {
+ mTemporaries.SetSize(activeSet.Num(), true);
- ResetVisited();
- mEntryBlock->ShrinkActiveTemporaries(activeSet, mTemporaries);
+ ResetVisited();
+ mEntryBlock->ShrinkActiveTemporaries(activeSet, mTemporaries);
- ResetVisited();
- mEntryBlock->RemapActiveTemporaries(activeSet);
+ ResetVisited();
+ mEntryBlock->RemapActiveTemporaries(activeSet);
+ }
ResetVisited();
} while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused));
diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h
index 3ad783e..6c413c8 100644
--- a/oscar64/InterCode.h
+++ b/oscar64/InterCode.h
@@ -394,7 +394,7 @@ public:
bool PropagateVariableCopy(const GrowingInstructionPtrArray& ctemps, const GrowingVariableArray& staticVars);
void BuildLocalTempSets(int num);
- void BuildGlobalProvidedTempSet(NumberSet fromProvidedTemps);
+ void BuildGlobalProvidedTempSet(const NumberSet & fromProvidedTemps);
bool BuildGlobalRequiredTempSet(NumberSet& fromRequiredTemps);
bool RemoveUnusedResultInstructions(void);
void BuildCallerSaveTempSet(NumberSet& callerSaveTemps);
@@ -427,7 +427,7 @@ public:
void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries);
void CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars);
- void PerformTempForwarding(TempForwardingTable& forwardingTable);
+ void PerformTempForwarding(const TempForwardingTable& forwardingTable);
void PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int & spareTemps, const GrowingVariableArray& staticVars);
void PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars);
bool EliminateDeadBranches(void);
diff --git a/oscar64/NumberSet.cpp b/oscar64/NumberSet.cpp
index aeacfb2..9cf3792 100644
--- a/oscar64/NumberSet.cpp
+++ b/oscar64/NumberSet.cpp
@@ -94,8 +94,6 @@ void NumberSet::Clear(void)
NumberSet& NumberSet::operator=(const NumberSet& set)
{
- int i;
-
this->size = set.size;
if (dwsize != set.dwsize)
@@ -105,28 +103,36 @@ NumberSet& NumberSet::operator=(const NumberSet& set)
this->bits = new uint32[dwsize];
}
- for (i = 0; i < dwsize; i++)
- bits[i] = set.bits[i];
+ int size = dwsize;
+ const uint32* sbits = set.bits;
+ uint32* dbits = bits;
+
+ for (int i = 0; i < size; i++)
+ dbits[i] = sbits[i];
return *this;
}
NumberSet& NumberSet::operator&=(const NumberSet& set)
{
- int i;
+ int size = dwsize;
+ const uint32* sbits = set.bits;
+ uint32* dbits = bits;
- for (i = 0; i < dwsize; i++)
- bits[i] &= set.bits[i];
+ for (int i = 0; i < size; i++)
+ dbits[i] &= sbits[i];
return *this;
}
NumberSet& NumberSet::operator|=(const NumberSet& set)
{
- int i;
+ int size = dwsize;
+ const uint32* sbits = set.bits;
+ uint32* dbits = bits;
- for (i = 0; i < dwsize; i++)
- bits[i] |= set.bits[i];
+ for (int i = 0; i < size; i++)
+ dbits[i] |= sbits[i];
return *this;
}
diff --git a/oscar64/oscar64.vcxproj b/oscar64/oscar64.vcxproj
index 382416e..92b3377 100644
--- a/oscar64/oscar64.vcxproj
+++ b/oscar64/oscar64.vcxproj
@@ -38,6 +38,7 @@
v142
true
Unicode
+ false
Application
@@ -81,6 +82,8 @@
false
+ $(SolutionDir)\$(Configuration)$(Platform)\
+ $(Configuration)$(Platform)\
@@ -104,6 +107,7 @@
true
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
+ false
Console
@@ -127,6 +131,7 @@
Console
true
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;version.lib;%(AdditionalDependencies)
@@ -143,6 +148,7 @@
true
true
true
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;version.lib;%(AdditionalDependencies)