mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 18:29:13 +02:00
+ introduce -Oofastmath
* limit the application of the tree transformation introduced in r21986 to safe cases and -Oofastmath git-svn-id: trunk@22040 -
This commit is contained in:
parent
8fd84376d7
commit
b330bba0bc
@ -1081,7 +1081,7 @@ Const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_tailrecursion,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_tailrecursion,
|
||||||
cs_opt_stackframe,cs_opt_nodecse,cs_opt_reorder_fields];
|
cs_opt_stackframe,cs_opt_nodecse,cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
@ -188,7 +188,7 @@ Const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_tailrecursion,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_tailrecursion,
|
||||||
cs_opt_stackframe,cs_opt_nodecse,cs_opt_reorder_fields];
|
cs_opt_stackframe,cs_opt_nodecse,cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
cpuflagsstr : array[tcpuflags] of string[20] =
|
cpuflagsstr : array[tcpuflags] of string[20] =
|
||||||
('AVR_HAS_JMP_CALL',
|
('AVR_HAS_JMP_CALL',
|
||||||
'AVR_HAS_MOVW',
|
'AVR_HAS_MOVW',
|
||||||
|
@ -244,7 +244,7 @@ interface
|
|||||||
cs_opt_regvar,cs_opt_uncertain,cs_opt_size,cs_opt_stackframe,
|
cs_opt_regvar,cs_opt_uncertain,cs_opt_size,cs_opt_stackframe,
|
||||||
cs_opt_peephole,cs_opt_asmcse,cs_opt_loopunroll,cs_opt_tailrecursion,cs_opt_nodecse,
|
cs_opt_peephole,cs_opt_asmcse,cs_opt_loopunroll,cs_opt_tailrecursion,cs_opt_nodecse,
|
||||||
cs_opt_nodedfa,cs_opt_loopstrength,cs_opt_scheduler,cs_opt_autoinline,cs_useebp,
|
cs_opt_nodedfa,cs_opt_loopstrength,cs_opt_scheduler,cs_opt_autoinline,cs_useebp,
|
||||||
cs_opt_reorder_fields
|
cs_opt_reorder_fields,cs_opt_fastmath
|
||||||
);
|
);
|
||||||
toptimizerswitches = set of toptimizerswitch;
|
toptimizerswitches = set of toptimizerswitch;
|
||||||
|
|
||||||
@ -269,7 +269,7 @@ interface
|
|||||||
'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'
|
'ORDERFIELDS','FASTMATH'
|
||||||
);
|
);
|
||||||
WPOptimizerSwitchStr : array [twpoptimizerswitch] of string[14] = (
|
WPOptimizerSwitchStr : array [twpoptimizerswitch] of string[14] = (
|
||||||
'DEVIRTCALLS','OPTVMTS','SYMBOLLIVENESS'
|
'DEVIRTCALLS','OPTVMTS','SYMBOLLIVENESS'
|
||||||
|
@ -103,7 +103,7 @@ Const
|
|||||||
[cs_opt_peephole,cs_opt_regvar,cs_opt_stackframe,
|
[cs_opt_peephole,cs_opt_regvar,cs_opt_stackframe,
|
||||||
cs_opt_asmcse,cs_opt_loopunroll,cs_opt_uncertain,
|
cs_opt_asmcse,cs_opt_loopunroll,cs_opt_uncertain,
|
||||||
cs_opt_tailrecursion,cs_opt_nodecse,cs_useebp,
|
cs_opt_tailrecursion,cs_opt_nodecse,cs_useebp,
|
||||||
cs_opt_reorder_fields];
|
cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches + [cs_opt_peephole];
|
level1optimizerswitches = genericlevel1optimizerswitches + [cs_opt_peephole];
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
@ -76,7 +76,7 @@ Const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
||||||
cs_opt_reorder_fields];
|
cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
@ -69,7 +69,7 @@ Const
|
|||||||
|
|
||||||
{ Supported optimizations, only used for information }
|
{ Supported optimizations, only used for information }
|
||||||
supported_optimizerswitches = [cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
supported_optimizerswitches = [cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
||||||
cs_opt_reorder_fields];
|
cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = [];
|
level1optimizerswitches = [];
|
||||||
level2optimizerswitches = level1optimizerswitches + [cs_opt_regvar,cs_opt_stackframe,cs_opt_nodecse];
|
level2optimizerswitches = level1optimizerswitches + [cs_opt_regvar,cs_opt_stackframe,cs_opt_nodecse];
|
||||||
|
@ -50,7 +50,7 @@ unit optcse;
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
globtype,
|
globtype,globals,
|
||||||
cclasses,
|
cclasses,
|
||||||
verbose,
|
verbose,
|
||||||
nutils,
|
nutils,
|
||||||
@ -249,7 +249,21 @@ unit optcse;
|
|||||||
B C
|
B C
|
||||||
Because A could be another tree of this kind, the whole process is done in a while loop
|
Because A could be another tree of this kind, the whole process is done in a while loop
|
||||||
}
|
}
|
||||||
if (n.nodetype in [andn,orn,addn,muln]) then
|
if (n.nodetype in [andn,orn,addn,muln]) and
|
||||||
|
(n.nodetype=tbinarynode(n).left.nodetype) and
|
||||||
|
{ do is optimizations only for integers, reals (no currency!), vectors and sets }
|
||||||
|
(is_integer(n.resultdef) or is_real(n.resultdef) or is_vector(n.resultdef) or is_set(n.resultdef)) and
|
||||||
|
{ either if fastmath is on }
|
||||||
|
((cs_opt_fastmath in current_settings.optimizerswitches) or
|
||||||
|
{ or for the logical operators, they cannot overflow }
|
||||||
|
(n.nodetype in [andn,orn]) or
|
||||||
|
{ or for integers if range checking is off }
|
||||||
|
((is_integer(n.resultdef) and
|
||||||
|
(n.localswitches*[cs_check_range,cs_check_overflow]=[]) and
|
||||||
|
(tbinarynode(n).left.localswitches*[cs_check_range,cs_check_overflow]=[]))) or
|
||||||
|
{ for sets, we can do this always }
|
||||||
|
(is_set(n.resultdef))
|
||||||
|
) then
|
||||||
while n.nodetype=tbinarynode(n).left.nodetype do
|
while n.nodetype=tbinarynode(n).left.nodetype do
|
||||||
begin
|
begin
|
||||||
csedomain:=true;
|
csedomain:=true;
|
||||||
|
@ -78,7 +78,7 @@ Const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
||||||
cs_opt_tailrecursion,cs_opt_reorder_fields];
|
cs_opt_tailrecursion,cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches + [cs_opt_regvar,cs_opt_nodecse,cs_opt_tailrecursion];
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches + [cs_opt_regvar,cs_opt_nodecse,cs_opt_tailrecursion];
|
||||||
|
@ -70,7 +70,7 @@ const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_nodecse,
|
||||||
cs_opt_tailrecursion,cs_opt_reorder_fields];
|
cs_opt_tailrecursion,cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
@ -78,7 +78,7 @@ const
|
|||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,
|
[cs_opt_regvar,cs_opt_loopunroll,
|
||||||
cs_opt_tailrecursion,cs_opt_nodecse,
|
cs_opt_tailrecursion,cs_opt_nodecse,
|
||||||
cs_opt_reorder_fields];
|
cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
@ -91,7 +91,7 @@ Const
|
|||||||
{ no need to write info about those }
|
{ no need to write info about those }
|
||||||
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
[cs_opt_level1,cs_opt_level2,cs_opt_level3]+
|
||||||
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_stackframe,
|
[cs_opt_regvar,cs_opt_loopunroll,cs_opt_stackframe,
|
||||||
cs_opt_tailrecursion,cs_opt_nodecse,cs_opt_reorder_fields];
|
cs_opt_tailrecursion,cs_opt_nodecse,cs_opt_reorder_fields,cs_opt_fastmath];
|
||||||
|
|
||||||
level1optimizerswitches = genericlevel1optimizerswitches;
|
level1optimizerswitches = genericlevel1optimizerswitches;
|
||||||
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
|
||||||
|
Loading…
Reference in New Issue
Block a user