+ make empty proc. removal switchable by removeemptyprocs

git-svn-id: trunk@23621 -
This commit is contained in:
florian 2013-02-14 21:40:04 +00:00
parent bcd48ac1a1
commit 63f6afffd5
4 changed files with 10 additions and 7 deletions

View File

@ -257,7 +257,9 @@ interface
explicit side-effects, only implicit side-effects (like the ones explicit side-effects, only implicit side-effects (like the ones
mentioned before) can disappear. mentioned before) can disappear.
} }
cs_opt_dead_values cs_opt_dead_values,
{ compiler checks for empty procedures/methods and removes calls to them if possible }
cs_opt_remove_emtpy_proc
); );
toptimizerswitches = set of toptimizerswitch; toptimizerswitches = set of toptimizerswitch;
@ -284,12 +286,12 @@ interface
end; end;
const const
OptimizerSwitchStr : array[toptimizerswitch] of string[11] = ('', OptimizerSwitchStr : array[toptimizerswitch] of string[16] = ('',
'LEVEL1','LEVEL2','LEVEL3', 'LEVEL1','LEVEL2','LEVEL3',
'REGVAR','UNCERTAIN','SIZE','STACKFRAME', 'REGVAR','UNCERTAIN','SIZE','STACKFRAME',
'PEEPHOLE','ASMCSE','LOOPUNROLL','TAILREC','CSE', 'PEEPHOLE','ASMCSE','LOOPUNROLL','TAILREC','CSE',
'DFA','STRENGTH','SCHEDULE','AUTOINLINE','USEEBP', 'DFA','STRENGTH','SCHEDULE','AUTOINLINE','USEEBP',
'ORDERFIELDS','FASTMATH','DEADVALUES' 'ORDERFIELDS','FASTMATH','DEADVALUES','REMOVEEMPTYPROCS'
); );
WPOptimizerSwitchStr : array [twpoptimizerswitch] of string[14] = ( WPOptimizerSwitchStr : array [twpoptimizerswitch] of string[14] = (
'DEVIRTCALLS','OPTVMTS','SYMBOLLIVENESS' 'DEVIRTCALLS','OPTVMTS','SYMBOLLIVENESS'
@ -310,7 +312,7 @@ interface
{ switches being applied to all CPUs at the given level } { switches being applied to all CPUs at the given level }
genericlevel1optimizerswitches = [cs_opt_level1]; genericlevel1optimizerswitches = [cs_opt_level1];
genericlevel2optimizerswitches = [cs_opt_level2]; genericlevel2optimizerswitches = [cs_opt_level2,cs_opt_remove_emtpy_proc];
genericlevel3optimizerswitches = [cs_opt_level3]; genericlevel3optimizerswitches = [cs_opt_level3];
genericlevel4optimizerswitches = [cs_opt_reorder_fields,cs_opt_dead_values,cs_opt_fastmath]; genericlevel4optimizerswitches = [cs_opt_reorder_fields,cs_opt_dead_values,cs_opt_fastmath];

View File

@ -3461,7 +3461,7 @@ implementation
Message(parser_e_no_category_as_types); Message(parser_e_no_category_as_types);
{ can we get rid of the call? } { can we get rid of the call? }
if (cs_opt_level2 in current_settings.optimizerswitches) and if (cs_opt_remove_emtpy_proc in current_settings.optimizerswitches) and
not(cnf_return_value_used in callnodeflags) and not(cnf_return_value_used in callnodeflags) and
(procdefinition.typ=procdef) and (procdefinition.typ=procdef) and
tprocdef(procdefinition).isempty and tprocdef(procdefinition).isempty and

View File

@ -1573,7 +1573,7 @@ implementation
internalerror(200611083); internalerror(200611083);
if (po_abstractmethod in vmtpd.procoptions) then if (po_abstractmethod in vmtpd.procoptions) then
procname:='FPC_ABSTRACTERROR' procname:='FPC_ABSTRACTERROR'
else if (cs_opt_level2 in current_settings.optimizerswitches) and RedirectToEmpty(vmtpd) then else if (cs_opt_remove_emtpy_proc in current_settings.optimizerswitches) and RedirectToEmpty(vmtpd) then
procname:='FPC_EMPTYMETHOD' procname:='FPC_EMPTYMETHOD'
else if not wpoinfomanager.optimized_name_for_vmt(_class,vmtpd,procname) then else if not wpoinfomanager.optimized_name_for_vmt(_class,vmtpd,procname) then
procname:=vmtpd.mangledname; procname:=vmtpd.mangledname;

View File

@ -1268,7 +1268,8 @@ implementation
if cs_opt_nodecse in current_settings.optimizerswitches then if cs_opt_nodecse in current_settings.optimizerswitches then
do_optcse(code); do_optcse(code);
if (procdef.proctypeoption in [potype_operator,potype_procedure,potype_function]) and if (cs_opt_remove_emtpy_proc in current_settings.optimizerswitches) and
(procdef.proctypeoption in [potype_operator,potype_procedure,potype_function]) and
(code.nodetype=blockn) and (tblocknode(code).statements=nil) then (code.nodetype=blockn) and (tblocknode(code).statements=nil) then
procdef.isempty:=true; procdef.isempty:=true;