mirror of https://git.wuffs.org/MWCC
167 lines
5.6 KiB
C
167 lines
5.6 KiB
C
|
#include "parser.h"
|
||
|
|
||
|
Boolean setOldOptimizerOptions;
|
||
|
|
||
|
typedef struct {
|
||
|
Boolean commonsubs;
|
||
|
Boolean loopinvariants;
|
||
|
Boolean propagation;
|
||
|
Boolean deadstore;
|
||
|
Boolean strengthreduction;
|
||
|
Boolean deadcode;
|
||
|
Boolean lifetimes;
|
||
|
} PIROptimizer; // assumed name
|
||
|
|
||
|
static PIROptimizer pIrOptimizer = {0};
|
||
|
|
||
|
Pragma irPragmas[] = {
|
||
|
&pIrOptimizer.commonsubs, "opt_common_subs", 0,
|
||
|
&pIrOptimizer.loopinvariants, "opt_loop_invariants", 0,
|
||
|
&pIrOptimizer.propagation, "opt_propagation", 0,
|
||
|
&pIrOptimizer.deadstore, "opt_dead_assignments", 0,
|
||
|
&pIrOptimizer.deadcode, "opt_dead_code", 0,
|
||
|
&pIrOptimizer.strengthreduction, "opt_strength_reduction", 0,
|
||
|
&pIrOptimizer.lifetimes, "opt_lifetimes", 0,
|
||
|
0, 0, 0
|
||
|
};
|
||
|
|
||
|
int SetPragmaOptimizationsToUnspecified(const char *opt, void *, const char *, int) {
|
||
|
if (setOldOptimizerOptions)
|
||
|
Option_Warning(CLPStr62);
|
||
|
|
||
|
memset(&pIrOptimizer, 0, sizeof(pIrOptimizer));
|
||
|
TargetSetPragmaOptimizationsToUnspecified();
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int SetOptFlags(const char *opt, void *str, const char *, int flags) {
|
||
|
// this is very similar to ToolHelper
|
||
|
// might also fail to match
|
||
|
unsigned char *ptr;
|
||
|
Boolean set;
|
||
|
Boolean no;
|
||
|
UInt16 flag;
|
||
|
|
||
|
ptr = (unsigned char *) str;
|
||
|
no = (Boolean) ((flags & PARAMPARSEFLAGS_8) >> 3);
|
||
|
set = (Boolean) (no ^ 1);
|
||
|
|
||
|
while (*ptr) {
|
||
|
if (*ptr == '+') {
|
||
|
set = !no;
|
||
|
} else if (*ptr == '-') {
|
||
|
set = no;
|
||
|
} else if (*ptr == '|') {
|
||
|
set = (Boolean) (no ^ 1);
|
||
|
} else {
|
||
|
flag = (ptr[0] << 8) | ptr[1];
|
||
|
|
||
|
if ((flag >= 'G0' && flag <= 'G4') || (flag == 'Gs') || (flag == 'Gp'))
|
||
|
SetPragmaOptimizationsToUnspecified(opt, NULL, NULL, 0);
|
||
|
|
||
|
switch (flag) {
|
||
|
case 'Cs':
|
||
|
pIrOptimizer.commonsubs = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Li':
|
||
|
pIrOptimizer.loopinvariants = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Pr':
|
||
|
pIrOptimizer.propagation = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Ds':
|
||
|
pIrOptimizer.deadstore = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Sr':
|
||
|
pIrOptimizer.strengthreduction = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Dc':
|
||
|
pIrOptimizer.deadcode = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'Lt':
|
||
|
pIrOptimizer.lifetimes = set ? 1 : 2;
|
||
|
setOldOptimizerOptions = 1;
|
||
|
break;
|
||
|
case 'G0':
|
||
|
pGlobalOptimizer.optimizationlevel = set ? 0 : 0;
|
||
|
break;
|
||
|
case 'G1':
|
||
|
pGlobalOptimizer.optimizationlevel = set ? 1 : 0;
|
||
|
break;
|
||
|
case 'G2':
|
||
|
pGlobalOptimizer.optimizationlevel = set ? 2 : 0;
|
||
|
break;
|
||
|
case 'G3':
|
||
|
pGlobalOptimizer.optimizationlevel = set ? 3 : 0;
|
||
|
break;
|
||
|
case 'G4':
|
||
|
pGlobalOptimizer.optimizationlevel = set ? 4 : 0;
|
||
|
break;
|
||
|
case 'Gs':
|
||
|
pGlobalOptimizer.optfor = set ? 1 : 0;
|
||
|
break;
|
||
|
case 'Gp':
|
||
|
pGlobalOptimizer.optfor = set ? 0 : 1;
|
||
|
break;
|
||
|
default:
|
||
|
if (!TargetSetOptFlags(flag, set))
|
||
|
CLPFatalError("Bad optimizer settings in %s (%c%c)\n", str, ptr[0], ptr[1]);
|
||
|
}
|
||
|
|
||
|
++ptr;
|
||
|
}
|
||
|
|
||
|
++ptr;
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int DisplayOptimizationOptions() {
|
||
|
SInt32 oldsize;
|
||
|
Handle h;
|
||
|
|
||
|
h = NewHandle(0);
|
||
|
if (!h)
|
||
|
exit(-23);
|
||
|
|
||
|
HPrintF(h, "\t- global optimizer level %d\n", pGlobalOptimizer.optimizationlevel);
|
||
|
HPrintF(h, "\t- global optimize for %s\n", (pGlobalOptimizer.optfor == 0) ? "speed" : "size");
|
||
|
|
||
|
oldsize = GetHandleSize(h);
|
||
|
if (pIrOptimizer.commonsubs)
|
||
|
HPrintF(h, "\t- common subexpression elimination %s\n", (pIrOptimizer.commonsubs == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.loopinvariants)
|
||
|
HPrintF(h, "\t- loop invariants %s\n", (pIrOptimizer.loopinvariants == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.commonsubs)
|
||
|
HPrintF(h, "\t- constant propagation %s\n", (pIrOptimizer.propagation == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.deadstore)
|
||
|
HPrintF(h, "\t- dead store elimination %s\n", (pIrOptimizer.deadstore == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.deadcode)
|
||
|
HPrintF(h, "\t- dead code elimination %s\n", (pIrOptimizer.deadcode == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.strengthreduction)
|
||
|
HPrintF(h, "\t- strength reduction %s\n", (pIrOptimizer.strengthreduction == 1) ? "on" : "off");
|
||
|
if (pIrOptimizer.lifetimes)
|
||
|
HPrintF(h, "\t- variable lifetimes %s\n", (pIrOptimizer.lifetimes == 1) ? "on" : "off");
|
||
|
|
||
|
if (oldsize == GetHandleSize(h))
|
||
|
HPrintF(h, "\t- no extra global optimizations\n");
|
||
|
|
||
|
HPrintF(h, "Backend-specific optimizer options:\n");
|
||
|
|
||
|
oldsize = GetHandleSize(h);
|
||
|
TargetDisplayOptimizationOptions(h);
|
||
|
if (oldsize == GetHandleSize(h))
|
||
|
HPrintF(h, "\t- no extra backend-specific optimizations\n");
|
||
|
|
||
|
ShowTextHandle(NULL, h);
|
||
|
DisposeHandle(h);
|
||
|
return 1;
|
||
|
}
|