Improve compiler speed

This commit is contained in:
drmortalwombat 2022-09-20 15:01:47 +02:00
parent c3e89d5d32
commit 259abf4c4b
7 changed files with 69 additions and 48 deletions

4
.gitignore vendored
View File

@ -345,3 +345,7 @@ make/oscar64
*.crt *.crt
*.crt *.crt
*.d64 *.d64
*.tlog
*.res
*.recipe
*.exe

View File

@ -103,7 +103,9 @@ enum KeyScanCode
KSCAN_STOP, KSCAN_STOP,
KSCAN_QUAL_SHIFT = 0x40, 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 // map of keyboard codes to PETSCII, first 64 without shift

View File

@ -196,11 +196,14 @@ public:
GrowingArray(const GrowingArray& a) GrowingArray(const GrowingArray& a)
: empty(a.empty) : empty(a.empty)
{ {
int i;
size = a.size; size = a.size;
range = a.range; range = a.range;
array = new T[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) GrowingArray & operator=(const GrowingArray& a)
@ -208,7 +211,10 @@ public:
if (a.size != size) if (a.size != size)
Grow(a.size, true); 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; return *this;
} }

View File

@ -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++) for (int i = 0; i < table.mAssoc.Size(); i++)
{ {
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc; mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
mAssoc[i].mSucc = table.mAssoc[i].mSucc; mAssoc[i].mSucc = table.mAssoc[i].mSucc;
mAssoc[i].mPred = table.mAssoc[i].mPred; mAssoc[i].mPred = table.mAssoc[i].mPred;
} }
#endif
} }
TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& table) TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& table)
{ {
mAssoc = table.mAssoc;
#if 0
mAssoc.SetSize(table.mAssoc.Size()); mAssoc.SetSize(table.mAssoc.Size());
for (int i = 0; i < table.mAssoc.Size(); i++) 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].mSucc = table.mAssoc[i].mSucc;
mAssoc[i].mPred = table.mAssoc[i].mPred; mAssoc[i].mPred = table.mAssoc[i].mPred;
} }
#endif
return *this; 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; bool changed = false;
@ -6555,61 +6560,50 @@ bool InterCodeBasicBlock::CalculateSingleAssignmentTemps(FastNumberSet& tassigne
return changed; return changed;
} }
void InterCodeBasicBlock::PerformTempForwarding(TempForwardingTable& forwardingTable) void InterCodeBasicBlock::PerformTempForwarding(const TempForwardingTable& forwardingTable)
{ {
int i; int i;
if (!mVisited) if (!mVisited)
{ {
TempForwardingTable localForwardingTable(forwardingTable);
if (mLoopHead) if (mLoopHead)
{ {
if (mNumEntries == 2 && (mTrueJump == this || mFalseJump == this) && mLocalModifiedTemps.Size()) 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++) for (int i = 0; i < mLocalModifiedTemps.Size(); i++)
{ {
if (mLocalModifiedTemps[i]) if (mLocalModifiedTemps[i])
localForwardingTable.Destroy(i); mMergeForwardingTable.Destroy(i);
} }
} }
else else
localForwardingTable.Reset(); mMergeForwardingTable.SetSize(forwardingTable.Size());
} }
#if 0 else
else if (mNumEntries > 1)
{ {
lvalues.FlushAll(); if (mNumEntered == 0)
ltvalue.Clear(); mMergeForwardingTable = forwardingTable;
} else
#endif mMergeForwardingTable.Intersect(forwardingTable);
else if (mNumEntries > 0)
{
if (mNumEntered > 0)
{
localForwardingTable.Intersect(mMergeForwardingTable);
}
mNumEntered++; mNumEntered++;
if (mNumEntered < mNumEntries) if (mNumEntered < mNumEntries)
{
mMergeForwardingTable = localForwardingTable;
return; return;
} }
}
mVisited = true; mVisited = true;
for (i = 0; i < mInstructions.Size(); i++) for (i = 0; i < mInstructions.Size(); i++)
{ {
mInstructions[i]->PerformTempForwarding(localForwardingTable); mInstructions[i]->PerformTempForwarding(mMergeForwardingTable);
} }
if (mTrueJump) mTrueJump->PerformTempForwarding(localForwardingTable); if (mTrueJump) mTrueJump->PerformTempForwarding(mMergeForwardingTable);
if (mFalseJump) mFalseJump->PerformTempForwarding(localForwardingTable); if (mFalseJump) mFalseJump->PerformTempForwarding(mMergeForwardingTable);
} }
} }
@ -12440,6 +12434,8 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet)
silvused = activeSet.Num(); silvused = activeSet.Num();
silvalues.SetSize(silvused + 16, true); silvalues.SetSize(silvused + 16, true);
if (silvused != mTemporaries.Size())
{
mTemporaries.SetSize(activeSet.Num(), true); mTemporaries.SetSize(activeSet.Num(), true);
ResetVisited(); ResetVisited();
@ -12447,6 +12443,7 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet)
ResetVisited(); ResetVisited();
mEntryBlock->RemapActiveTemporaries(activeSet); mEntryBlock->RemapActiveTemporaries(activeSet);
}
ResetVisited(); ResetVisited();
} while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused)); } while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused));

View File

@ -394,7 +394,7 @@ public:
bool PropagateVariableCopy(const GrowingInstructionPtrArray& ctemps, const GrowingVariableArray& staticVars); bool PropagateVariableCopy(const GrowingInstructionPtrArray& ctemps, const GrowingVariableArray& staticVars);
void BuildLocalTempSets(int num); void BuildLocalTempSets(int num);
void BuildGlobalProvidedTempSet(NumberSet fromProvidedTemps); void BuildGlobalProvidedTempSet(const NumberSet & fromProvidedTemps);
bool BuildGlobalRequiredTempSet(NumberSet& fromRequiredTemps); bool BuildGlobalRequiredTempSet(NumberSet& fromRequiredTemps);
bool RemoveUnusedResultInstructions(void); bool RemoveUnusedResultInstructions(void);
void BuildCallerSaveTempSet(NumberSet& callerSaveTemps); void BuildCallerSaveTempSet(NumberSet& callerSaveTemps);
@ -427,7 +427,7 @@ public:
void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries); void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries);
void CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars); 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 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); void PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars);
bool EliminateDeadBranches(void); bool EliminateDeadBranches(void);

View File

@ -94,8 +94,6 @@ void NumberSet::Clear(void)
NumberSet& NumberSet::operator=(const NumberSet& set) NumberSet& NumberSet::operator=(const NumberSet& set)
{ {
int i;
this->size = set.size; this->size = set.size;
if (dwsize != set.dwsize) if (dwsize != set.dwsize)
@ -105,28 +103,36 @@ NumberSet& NumberSet::operator=(const NumberSet& set)
this->bits = new uint32[dwsize]; this->bits = new uint32[dwsize];
} }
for (i = 0; i < dwsize; i++) int size = dwsize;
bits[i] = set.bits[i]; const uint32* sbits = set.bits;
uint32* dbits = bits;
for (int i = 0; i < size; i++)
dbits[i] = sbits[i];
return *this; return *this;
} }
NumberSet& NumberSet::operator&=(const NumberSet& set) 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++) for (int i = 0; i < size; i++)
bits[i] &= set.bits[i]; dbits[i] &= sbits[i];
return *this; return *this;
} }
NumberSet& NumberSet::operator|=(const NumberSet& set) 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++) for (int i = 0; i < size; i++)
bits[i] |= set.bits[i]; dbits[i] |= sbits[i];
return *this; return *this;
} }

View File

@ -38,6 +38,7 @@
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<SpectreMitigation>false</SpectreMitigation>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
@ -81,6 +82,8 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)\$(Configuration)$(Platform)\</OutDir>
<IntDir>$(Configuration)$(Platform)\</IntDir>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
@ -104,6 +107,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@ -127,6 +131,7 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>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)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@ -143,6 +148,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>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)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>