mirror of
https://github.com/cc65/cc65.git
synced 2024-07-30 20:29:03 +00:00
Added optimization statistics
git-svn-id: svn://svn.cc65.org/cc65/trunk@982 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
21111ba235
commit
9c24d729ae
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* common */
|
/* common */
|
||||||
@ -57,12 +58,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/* Helper functions */
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Optimize shifts */
|
/* Optimize shifts */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -1379,6 +1374,10 @@ typedef struct OptFunc OptFunc;
|
|||||||
struct OptFunc {
|
struct OptFunc {
|
||||||
unsigned (*Func) (CodeSeg*); /* Optimizer function */
|
unsigned (*Func) (CodeSeg*); /* Optimizer function */
|
||||||
const char* Name; /* Name of the function/group */
|
const char* Name; /* Name of the function/group */
|
||||||
|
unsigned long TotalRuns; /* Total number of runs */
|
||||||
|
unsigned long LastRuns; /* Last number of runs */
|
||||||
|
unsigned long TotalChanges; /* Total number of changes */
|
||||||
|
unsigned long LastChanges; /* Last number of changes */
|
||||||
char Disabled; /* True if function disabled */
|
char Disabled; /* True if function disabled */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1394,49 +1393,49 @@ struct OptFunc {
|
|||||||
#define OptFuncEntry(func) static OptFuncDesc D##func = { func, #func, 0 }
|
#define OptFuncEntry(func) static OptFuncDesc D##func = { func, #func, 0 }
|
||||||
|
|
||||||
/* A list of all the function descriptions */
|
/* A list of all the function descriptions */
|
||||||
static OptFunc DOptPtrStore1 = { OptPtrStore1, "OptPtrStore1", 0 };
|
static OptFunc DOptPtrStore1 = { OptPtrStore1, "OptPtrStore1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrStore2 = { OptPtrStore2, "OptPtrStore2", 0 };
|
static OptFunc DOptPtrStore2 = { OptPtrStore2, "OptPtrStore2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad1 = { OptPtrLoad1, "OptPtrLoad1", 0 };
|
static OptFunc DOptPtrLoad1 = { OptPtrLoad1, "OptPtrLoad1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad2 = { OptPtrLoad2, "OptPtrLoad2", 0 };
|
static OptFunc DOptPtrLoad2 = { OptPtrLoad2, "OptPtrLoad2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad3 = { OptPtrLoad3, "OptPtrLoad3", 0 };
|
static OptFunc DOptPtrLoad3 = { OptPtrLoad3, "OptPtrLoad3", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad4 = { OptPtrLoad4, "OptPtrLoad4", 0 };
|
static OptFunc DOptPtrLoad4 = { OptPtrLoad4, "OptPtrLoad4", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad5 = { OptPtrLoad5, "OptPtrLoad5", 0 };
|
static OptFunc DOptPtrLoad5 = { OptPtrLoad5, "OptPtrLoad5", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptPtrLoad6 = { OptPtrLoad6, "OptPtrLoad6", 0 };
|
static OptFunc DOptPtrLoad6 = { OptPtrLoad6, "OptPtrLoad6", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegA1 = { OptNegA1, "OptNegA1", 0 };
|
static OptFunc DOptNegA1 = { OptNegA1, "OptNegA1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegA2 = { OptNegA2, "OptNegA2", 0 };
|
static OptFunc DOptNegA2 = { OptNegA2, "OptNegA2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegAX1 = { OptNegAX1, "OptNegAX1", 0 };
|
static OptFunc DOptNegAX1 = { OptNegAX1, "OptNegAX1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegAX2 = { OptNegAX2, "OptNegAX2", 0 };
|
static OptFunc DOptNegAX2 = { OptNegAX2, "OptNegAX2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegAX3 = { OptNegAX3, "OptNegAX3", 0 };
|
static OptFunc DOptNegAX3 = { OptNegAX3, "OptNegAX3", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptNegAX4 = { OptNegAX4, "OptNegAX4", 0 };
|
static OptFunc DOptNegAX4 = { OptNegAX4, "OptNegAX4", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptSub1 = { OptSub1, "OptSub1", 0 };
|
static OptFunc DOptSub1 = { OptSub1, "OptSub1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptSub2 = { OptSub2, "OptSub2", 0 };
|
static OptFunc DOptSub2 = { OptSub2, "OptSub2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptAdd1 = { OptAdd1, "OptAdd1", 0 };
|
static OptFunc DOptAdd1 = { OptAdd1, "OptAdd1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptAdd2 = { OptAdd2, "OptAdd2", 0 };
|
static OptFunc DOptAdd2 = { OptAdd2, "OptAdd2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptAdd3 = { OptAdd3, "OptAdd3", 0 };
|
static OptFunc DOptAdd3 = { OptAdd3, "OptAdd3", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptShift1 = { OptShift1, "OptShift1", 0 };
|
static OptFunc DOptShift1 = { OptShift1, "OptShift1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptJumpCascades = { OptJumpCascades, "OptJumpCascades", 0 };
|
static OptFunc DOptJumpCascades = { OptJumpCascades, "OptJumpCascades", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptDeadJumps = { OptDeadJumps, "OptDeadJumps", 0 };
|
static OptFunc DOptDeadJumps = { OptDeadJumps, "OptDeadJumps", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptRTS = { OptRTS, "OptRTS", 0 };
|
static OptFunc DOptRTS = { OptRTS, "OptRTS", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptDeadCode = { OptDeadCode, "OptDeadCode", 0 };
|
static OptFunc DOptDeadCode = { OptDeadCode, "OptDeadCode", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptJumpTarget = { OptJumpTarget, "OptJumpTarget", 0 };
|
static OptFunc DOptJumpTarget = { OptJumpTarget, "OptJumpTarget", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCondBranches = { OptCondBranches, "OptCondBranches", 0 };
|
static OptFunc DOptCondBranches = { OptCondBranches, "OptCondBranches", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptRTSJumps = { OptRTSJumps, "OptRTSJumps", 0 };
|
static OptFunc DOptRTSJumps = { OptRTSJumps, "OptRTSJumps", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptBoolTrans = { OptBoolTrans, "OptBoolTrans", 0 };
|
static OptFunc DOptBoolTrans = { OptBoolTrans, "OptBoolTrans", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp1 = { OptCmp1, "OptCmp1", 0 };
|
static OptFunc DOptCmp1 = { OptCmp1, "OptCmp1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp2 = { OptCmp2, "OptCmp2", 0 };
|
static OptFunc DOptCmp2 = { OptCmp2, "OptCmp2", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp3 = { OptCmp3, "OptCmp3", 0 };
|
static OptFunc DOptCmp3 = { OptCmp3, "OptCmp3", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp4 = { OptCmp4, "OptCmp4", 0 };
|
static OptFunc DOptCmp4 = { OptCmp4, "OptCmp4", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp5 = { OptCmp5, "OptCmp5", 0 };
|
static OptFunc DOptCmp5 = { OptCmp5, "OptCmp5", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp6 = { OptCmp6, "OptCmp6", 0 };
|
static OptFunc DOptCmp6 = { OptCmp6, "OptCmp6", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptCmp7 = { OptCmp7, "OptCmp7", 0 };
|
static OptFunc DOptCmp7 = { OptCmp7, "OptCmp7", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptTest1 = { OptTest1, "OptTest1", 0 };
|
static OptFunc DOptTest1 = { OptTest1, "OptTest1", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptUnusedLoads = { OptUnusedLoads, "OptUnusedLoads", 0 };
|
static OptFunc DOptUnusedLoads = { OptUnusedLoads, "OptUnusedLoads", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptUnusedStores = { OptUnusedStores, "OptUnusedStores", 0 };
|
static OptFunc DOptUnusedStores = { OptUnusedStores, "OptUnusedStores", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptDupLoads = { OptDupLoads, "OptDupLoads", 0 };
|
static OptFunc DOptDupLoads = { OptDupLoads, "OptDupLoads", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptStoreLoad = { OptStoreLoad, "OptStoreLoad", 0 };
|
static OptFunc DOptStoreLoad = { OptStoreLoad, "OptStoreLoad", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptTransfers = { OptTransfers, "OptTransfers", 0 };
|
static OptFunc DOptTransfers = { OptTransfers, "OptTransfers", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptStackOps = { OptStackOps, "OptStackOps", 0 };
|
static OptFunc DOptStackOps = { OptStackOps, "OptStackOps", 0, 0, 0, 0, 0 };
|
||||||
static OptFunc DOptBranchDist = { OptBranchDist, "OptBranchDist", 0 };
|
static OptFunc DOptBranchDist = { OptBranchDist, "OptBranchDist", 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
/* Table containing all the steps in alphabetical order */
|
/* Table containing all the steps in alphabetical order */
|
||||||
static OptFunc* OptFuncs[] = {
|
static OptFunc* OptFuncs[] = {
|
||||||
@ -1488,47 +1487,38 @@ static OptFunc* OptFuncs[] = {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned RunOptStep (CodeSeg* S, OptFunc* O, unsigned Max)
|
static int CmpOptStep (const void* Key, const void* Func)
|
||||||
/* Run one optimizer function Max times or until there are no more changes */
|
/* Compare function for bsearch */
|
||||||
{
|
{
|
||||||
unsigned Changes, C;
|
return strcmp (Key, (*(const OptFunc**)Func)->Name);
|
||||||
|
|
||||||
/* Don't run the function if it is disabled */
|
|
||||||
if (O->Disabled) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run this until there are no more changes */
|
|
||||||
Changes = 0;
|
|
||||||
do {
|
|
||||||
C = O->Func (S);
|
|
||||||
Changes += C;
|
|
||||||
} while (--Max && C > 0);
|
|
||||||
|
|
||||||
/* Return the number of changes */
|
|
||||||
return Changes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static OptFunc* FindOptStep (const char* Name)
|
static OptFunc* FindOptFunc (const char* Name)
|
||||||
|
/* Find an optimizer step by name in the table and return a pointer. Return
|
||||||
|
* NULL if no such step is found.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
/* Search for the function in the list */
|
||||||
|
OptFunc** O = bsearch (Name, OptFuncs, OPTFUNC_COUNT, sizeof (OptFuncs[0]), CmpOptStep);
|
||||||
|
return O? *O : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static OptFunc* GetOptFunc (const char* Name)
|
||||||
/* Find an optimizer step by name in the table and return a pointer. Print an
|
/* Find an optimizer step by name in the table and return a pointer. Print an
|
||||||
* error and call AbEnd if not found.
|
* error and call AbEnd if not found.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
unsigned I;
|
/* Search for the function in the list */
|
||||||
|
OptFunc* F = FindOptFunc (Name);
|
||||||
/* Run all optimization steps */
|
if (F == 0) {
|
||||||
for (I = 0; I < OPTFUNC_COUNT; ++I) {
|
|
||||||
if (strcmp (OptFuncs[I]->Name, Name) == 0) {
|
|
||||||
/* Found */
|
|
||||||
return OptFuncs[I];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not found */
|
/* Not found */
|
||||||
AbEnd ("Optimization step `%s' not found", Name);
|
AbEnd ("Optimization step `%s' not found", Name);
|
||||||
return 0;
|
}
|
||||||
|
return F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1542,8 +1532,7 @@ void DisableOpt (const char* Name)
|
|||||||
OptFuncs[I]->Disabled = 1;
|
OptFuncs[I]->Disabled = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
OptFunc* F = FindOptStep (Name);
|
GetOptFunc(Name)->Disabled = 1;
|
||||||
F->Disabled = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1558,8 +1547,7 @@ void EnableOpt (const char* Name)
|
|||||||
OptFuncs[I]->Disabled = 0;
|
OptFuncs[I]->Disabled = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
OptFunc* F = FindOptStep (Name);
|
GetOptFunc(Name)->Disabled = 0;
|
||||||
F->Disabled = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1576,6 +1564,140 @@ void ListOptSteps (FILE* F)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void ReadOptStats (const char* Name)
|
||||||
|
/* Read the optimizer statistics file */
|
||||||
|
{
|
||||||
|
char Buf [256];
|
||||||
|
unsigned Lines;
|
||||||
|
|
||||||
|
/* Try to open the file */
|
||||||
|
FILE* F = fopen (Name, "r");
|
||||||
|
if (F == 0) {
|
||||||
|
/* Ignore the error */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read and parse the lines */
|
||||||
|
Lines = 0;
|
||||||
|
while (fgets (Buf, sizeof (Buf), F) != 0) {
|
||||||
|
|
||||||
|
char* B;
|
||||||
|
unsigned Len;
|
||||||
|
OptFunc* Func;
|
||||||
|
|
||||||
|
/* Fields */
|
||||||
|
char Name[32];
|
||||||
|
unsigned long TotalRuns;
|
||||||
|
unsigned long TotalChanges;
|
||||||
|
|
||||||
|
/* Count lines */
|
||||||
|
++Lines;
|
||||||
|
|
||||||
|
/* Remove trailing white space including the line terminator */
|
||||||
|
B = Buf;
|
||||||
|
Len = strlen (B);
|
||||||
|
while (Len > 0 && IsSpace (B[Len-1])) {
|
||||||
|
--Len;
|
||||||
|
}
|
||||||
|
B[Len] = '\0';
|
||||||
|
|
||||||
|
/* Remove leading whitespace */
|
||||||
|
while (IsSpace (*B)) {
|
||||||
|
++B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for empty and comment lines */
|
||||||
|
if (*B == '\0' || *B == ';' || *B == '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the line */
|
||||||
|
if (sscanf (B, "%31s %lu %*u %lu %*u", Name, &TotalRuns, &TotalChanges) != 3) {
|
||||||
|
/* Syntax error */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Search for the optimizer step. */
|
||||||
|
Func = FindOptFunc (Name);
|
||||||
|
if (Func == 0) {
|
||||||
|
/* Not found */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Found the step, set the fields */
|
||||||
|
Func->TotalRuns = TotalRuns;
|
||||||
|
Func->TotalChanges = TotalChanges;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the file, ignore errors here. */
|
||||||
|
fclose (F);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void WriteOptStats (const char* Name)
|
||||||
|
/* Write the optimizer statistics file */
|
||||||
|
{
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
/* Try to open the file */
|
||||||
|
FILE* F = fopen (Name, "w");
|
||||||
|
if (F == 0) {
|
||||||
|
/* Ignore the error */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the file */
|
||||||
|
for (I = 0; I < OPTFUNC_COUNT; ++I) {
|
||||||
|
const OptFunc* O = OptFuncs[I];
|
||||||
|
fprintf (F,
|
||||||
|
"%s %lu %lu %lu %lu\n",
|
||||||
|
O->Name,
|
||||||
|
O->TotalRuns,
|
||||||
|
O->LastRuns,
|
||||||
|
O->TotalChanges,
|
||||||
|
O->LastChanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the file, ignore errors here. */
|
||||||
|
fclose (F);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned RunOptFunc (CodeSeg* S, OptFunc* F, unsigned Max)
|
||||||
|
/* Run one optimizer function Max times or until there are no more changes */
|
||||||
|
{
|
||||||
|
unsigned Changes, C;
|
||||||
|
|
||||||
|
/* Don't run the function if it is disabled */
|
||||||
|
if (F->Disabled) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run this until there are no more changes */
|
||||||
|
Changes = 0;
|
||||||
|
do {
|
||||||
|
|
||||||
|
/* Run the function */
|
||||||
|
C = F->Func (S);
|
||||||
|
Changes += C;
|
||||||
|
|
||||||
|
/* Do statistics */
|
||||||
|
++F->TotalRuns;
|
||||||
|
++F->LastRuns;
|
||||||
|
F->TotalChanges += C;
|
||||||
|
F->LastChanges += C;
|
||||||
|
|
||||||
|
} while (--Max && C > 0);
|
||||||
|
|
||||||
|
/* Return the number of changes */
|
||||||
|
return Changes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void RunOptGroup1 (CodeSeg* S)
|
static void RunOptGroup1 (CodeSeg* S)
|
||||||
/* Run the first group of optimization steps. These steps translate known
|
/* Run the first group of optimization steps. These steps translate known
|
||||||
* patterns emitted by the code generator into more optimal patterns. Order
|
* patterns emitted by the code generator into more optimal patterns. Order
|
||||||
@ -1583,20 +1705,20 @@ static void RunOptGroup1 (CodeSeg* S)
|
|||||||
* the same patterns as later steps as subpatterns.
|
* the same patterns as later steps as subpatterns.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
RunOptStep (S, &DOptPtrStore1, 1);
|
RunOptFunc (S, &DOptPtrStore1, 1);
|
||||||
RunOptStep (S, &DOptPtrStore2, 1);
|
RunOptFunc (S, &DOptPtrStore2, 1);
|
||||||
RunOptStep (S, &DOptPtrLoad1, 1);
|
RunOptFunc (S, &DOptPtrLoad1, 1);
|
||||||
RunOptStep (S, &DOptPtrLoad2, 1);
|
RunOptFunc (S, &DOptPtrLoad2, 1);
|
||||||
RunOptStep (S, &DOptPtrLoad3, 1);
|
RunOptFunc (S, &DOptPtrLoad3, 1);
|
||||||
RunOptStep (S, &DOptPtrLoad4, 1);
|
RunOptFunc (S, &DOptPtrLoad4, 1);
|
||||||
RunOptStep (S, &DOptPtrLoad5, 1);
|
RunOptFunc (S, &DOptPtrLoad5, 1);
|
||||||
RunOptStep (S, &DOptNegAX1, 1);
|
RunOptFunc (S, &DOptNegAX1, 1);
|
||||||
RunOptStep (S, &DOptNegAX2, 1);
|
RunOptFunc (S, &DOptNegAX2, 1);
|
||||||
RunOptStep (S, &DOptNegAX3, 1);
|
RunOptFunc (S, &DOptNegAX3, 1);
|
||||||
RunOptStep (S, &DOptNegAX4, 1);
|
RunOptFunc (S, &DOptNegAX4, 1);
|
||||||
RunOptStep (S, &DOptAdd1, 1);
|
RunOptFunc (S, &DOptAdd1, 1);
|
||||||
RunOptStep (S, &DOptAdd2, 1);
|
RunOptFunc (S, &DOptAdd2, 1);
|
||||||
RunOptStep (S, &DOptShift1, 1);
|
RunOptFunc (S, &DOptShift1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1612,34 +1734,34 @@ static void RunOptGroup2 (CodeSeg* S)
|
|||||||
do {
|
do {
|
||||||
Changes = 0;
|
Changes = 0;
|
||||||
|
|
||||||
Changes += RunOptStep (S, &DOptPtrLoad6, 1);
|
Changes += RunOptFunc (S, &DOptPtrLoad6, 1);
|
||||||
Changes += RunOptStep (S, &DOptNegA1, 1);
|
Changes += RunOptFunc (S, &DOptNegA1, 1);
|
||||||
Changes += RunOptStep (S, &DOptNegA2, 1);
|
Changes += RunOptFunc (S, &DOptNegA2, 1);
|
||||||
Changes += RunOptStep (S, &DOptSub1, 1);
|
Changes += RunOptFunc (S, &DOptSub1, 1);
|
||||||
Changes += RunOptStep (S, &DOptSub2, 1);
|
Changes += RunOptFunc (S, &DOptSub2, 1);
|
||||||
Changes += RunOptStep (S, &DOptAdd3, 1);
|
Changes += RunOptFunc (S, &DOptAdd3, 1);
|
||||||
Changes += RunOptStep (S, &DOptJumpCascades, 1);
|
Changes += RunOptFunc (S, &DOptJumpCascades, 1);
|
||||||
Changes += RunOptStep (S, &DOptDeadJumps, 1);
|
Changes += RunOptFunc (S, &DOptDeadJumps, 1);
|
||||||
Changes += RunOptStep (S, &DOptRTS, 1);
|
Changes += RunOptFunc (S, &DOptRTS, 1);
|
||||||
Changes += RunOptStep (S, &DOptDeadCode, 1);
|
Changes += RunOptFunc (S, &DOptDeadCode, 1);
|
||||||
Changes += RunOptStep (S, &DOptJumpTarget, 1);
|
Changes += RunOptFunc (S, &DOptJumpTarget, 1);
|
||||||
Changes += RunOptStep (S, &DOptCondBranches, 1);
|
Changes += RunOptFunc (S, &DOptCondBranches, 1);
|
||||||
Changes += RunOptStep (S, &DOptRTSJumps, 1);
|
Changes += RunOptFunc (S, &DOptRTSJumps, 1);
|
||||||
Changes += RunOptStep (S, &DOptBoolTrans, 1);
|
Changes += RunOptFunc (S, &DOptBoolTrans, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp1, 1);
|
Changes += RunOptFunc (S, &DOptCmp1, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp2, 1);
|
Changes += RunOptFunc (S, &DOptCmp2, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp3, 1);
|
Changes += RunOptFunc (S, &DOptCmp3, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp4, 1);
|
Changes += RunOptFunc (S, &DOptCmp4, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp5, 1);
|
Changes += RunOptFunc (S, &DOptCmp5, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp6, 1);
|
Changes += RunOptFunc (S, &DOptCmp6, 1);
|
||||||
Changes += RunOptStep (S, &DOptCmp7, 1);
|
Changes += RunOptFunc (S, &DOptCmp7, 1);
|
||||||
Changes += RunOptStep (S, &DOptTest1, 1);
|
Changes += RunOptFunc (S, &DOptTest1, 1);
|
||||||
Changes += RunOptStep (S, &DOptUnusedLoads, 1);
|
Changes += RunOptFunc (S, &DOptUnusedLoads, 1);
|
||||||
Changes += RunOptStep (S, &DOptUnusedStores, 1);
|
Changes += RunOptFunc (S, &DOptUnusedStores, 1);
|
||||||
Changes += RunOptStep (S, &DOptDupLoads, 1);
|
Changes += RunOptFunc (S, &DOptDupLoads, 1);
|
||||||
Changes += RunOptStep (S, &DOptStoreLoad, 1);
|
Changes += RunOptFunc (S, &DOptStoreLoad, 1);
|
||||||
Changes += RunOptStep (S, &DOptTransfers, 1);
|
Changes += RunOptFunc (S, &DOptTransfers, 1);
|
||||||
Changes += RunOptStep (S, &DOptStackOps, 1);
|
Changes += RunOptFunc (S, &DOptStackOps, 1);
|
||||||
|
|
||||||
} while (Changes);
|
} while (Changes);
|
||||||
}
|
}
|
||||||
@ -1650,7 +1772,7 @@ static void RunOptGroup3 (CodeSeg* S)
|
|||||||
/* The last group of optimization steps. Adjust branches.
|
/* The last group of optimization steps. Adjust branches.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
RunOptStep (S, &DOptBranchDist, 3);
|
RunOptFunc (S, &DOptBranchDist, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1658,12 +1780,19 @@ static void RunOptGroup3 (CodeSeg* S)
|
|||||||
void RunOpt (CodeSeg* S)
|
void RunOpt (CodeSeg* S)
|
||||||
/* Run the optimizer */
|
/* Run the optimizer */
|
||||||
{
|
{
|
||||||
|
const char* StatFileName;
|
||||||
|
|
||||||
/* If we shouldn't run the optimizer, bail out */
|
/* If we shouldn't run the optimizer, bail out */
|
||||||
if (!Optimize) {
|
if (!Optimize) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if we are requested to write optimizer statistics */
|
||||||
|
StatFileName = getenv ("CC65_OPTSTATS");
|
||||||
|
if (StatFileName) {
|
||||||
|
ReadOptStats (StatFileName);
|
||||||
|
}
|
||||||
|
|
||||||
/* Print the name of the function we are working on */
|
/* Print the name of the function we are working on */
|
||||||
if (S->Func) {
|
if (S->Func) {
|
||||||
Print (stdout, 1, "Running optimizer for function `%s'\n", S->Func->Name);
|
Print (stdout, 1, "Running optimizer for function `%s'\n", S->Func->Name);
|
||||||
@ -1675,6 +1804,11 @@ void RunOpt (CodeSeg* S)
|
|||||||
RunOptGroup1 (S);
|
RunOptGroup1 (S);
|
||||||
RunOptGroup2 (S);
|
RunOptGroup2 (S);
|
||||||
RunOptGroup3 (S);
|
RunOptGroup3 (S);
|
||||||
|
|
||||||
|
/* Write statistics */
|
||||||
|
if (StatFileName) {
|
||||||
|
WriteOptStats (StatFileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user