summaryrefslogtreecommitdiff
path: root/compiler/nld.pas
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-03-12 07:49:37 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-03-12 07:49:37 +0000
commit0635f5e2071b33e815f918d3725b143c15ddc7ac (patch)
tree17fcf63f98be79186b62256e8d63ce345b9ed69b /compiler/nld.pas
parent8b127b358d7bf6bce3036229975987ea44fb59f2 (diff)
downloadfpc-0635f5e2071b33e815f918d3725b143c15ddc7ac.tar.gz
* do +/-/pred/succ to inc/dec optimizations only at an appropriate optimziation level
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@35569 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/nld.pas')
-rw-r--r--compiler/nld.pas116
1 files changed, 61 insertions, 55 deletions
diff --git a/compiler/nld.pas b/compiler/nld.pas
index e1e90b0e3a..ca91bfd433 100644
--- a/compiler/nld.pas
+++ b/compiler/nld.pas
@@ -566,62 +566,68 @@ implementation
not equal_defs(right.resultdef,left.resultdef) then
inserttypeconv(right,left.resultdef);
- { replace i:=succ/pred(i) by inc/dec(i)? }
- if (right.nodetype=inlinen) and
- ((tinlinenode(right).inlinenumber=in_succ_x) or (tinlinenode(right).inlinenumber=in_pred_x)) and
- (tinlinenode(right).left.isequal(left)) and
- ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
- ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
- valid_for_var(tinlinenode(right).left,false) and
- not(might_have_sideeffects(tinlinenode(right).left)) then
+ if cs_opt_level2 in current_settings.optimizerswitches then
begin
- if tinlinenode(right).inlinenumber=in_succ_x then
- newinlinenodetype:=in_inc_x
- else
- newinlinenodetype:=in_dec_x;
- result:=cinlinenode.createintern(
- newinlinenodetype,false,ccallparanode.create(
- left,nil));
- left:=nil;
- exit;
- end;
- { replace i:=i+k/i:=i-k by inc/dec(i,k)? }
- if (right.nodetype in [addn,subn]) and
- (taddnode(right).left.isequal(left)) and
- is_integer(taddnode(right).left.resultdef) and
- is_integer(taddnode(right).right.resultdef) and
- ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
- ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
- valid_for_var(taddnode(right).left,false) and
- not(might_have_sideeffects(taddnode(right).left)) then
- begin
- if right.nodetype=addn then
- newinlinenodetype:=in_inc_x
- else
- newinlinenodetype:=in_dec_x;
- result:=cinlinenode.createintern(
- newinlinenodetype,false,ccallparanode.create(
- left,ccallparanode.create(taddnode(right).right,nil)));
- left:=nil;
- taddnode(right).right:=nil;
- exit;
- end;
- { replace i:=k+i by inc(i,k)? }
- if (right.nodetype=addn) and
- (taddnode(right).right.isequal(left)) and
- is_integer(taddnode(right).left.resultdef) and
- is_integer(taddnode(right).right.resultdef) and
- ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
- ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
- valid_for_var(taddnode(right).right,false) and
- not(might_have_sideeffects(taddnode(right).right)) then
- begin
- result:=cinlinenode.createintern(
- in_inc_x,false,ccallparanode.create(
- left,ccallparanode.create(taddnode(right).left,nil)));
- left:=nil;
- taddnode(right).left:=nil;
- exit;
+ { replace i:=succ/pred(i) by inc/dec(i)? }
+ if (right.nodetype=inlinen) and
+ ((tinlinenode(right).inlinenumber=in_succ_x) or (tinlinenode(right).inlinenumber=in_pred_x)) and
+ (tinlinenode(right).left.isequal(left)) and
+ ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ valid_for_var(tinlinenode(right).left,false) and
+ not(might_have_sideeffects(tinlinenode(right).left)) then
+ begin
+ if tinlinenode(right).inlinenumber=in_succ_x then
+ newinlinenodetype:=in_inc_x
+ else
+ newinlinenodetype:=in_dec_x;
+ result:=cinlinenode.createintern(
+ newinlinenodetype,false,ccallparanode.create(
+ left,nil));
+ left:=nil;
+ exit;
+ end;
+ if cs_opt_level3 in current_settings.optimizerswitches then
+ begin
+ { replace i:=i+k/i:=i-k by inc/dec(i,k)? }
+ if (right.nodetype in [addn,subn]) and
+ (taddnode(right).left.isequal(left)) and
+ is_integer(taddnode(right).left.resultdef) and
+ is_integer(taddnode(right).right.resultdef) and
+ ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ valid_for_var(taddnode(right).left,false) and
+ not(might_have_sideeffects(taddnode(right).left)) then
+ begin
+ if right.nodetype=addn then
+ newinlinenodetype:=in_inc_x
+ else
+ newinlinenodetype:=in_dec_x;
+ result:=cinlinenode.createintern(
+ newinlinenodetype,false,ccallparanode.create(
+ left,ccallparanode.create(taddnode(right).right,nil)));
+ left:=nil;
+ taddnode(right).right:=nil;
+ exit;
+ end;
+ { replace i:=k+i by inc(i,k)? }
+ if (right.nodetype=addn) and
+ (taddnode(right).right.isequal(left)) and
+ is_integer(taddnode(right).left.resultdef) and
+ is_integer(taddnode(right).right.resultdef) and
+ ((localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ ((right.localswitches*[cs_check_overflow,cs_check_range])=[]) and
+ valid_for_var(taddnode(right).right,false) and
+ not(might_have_sideeffects(taddnode(right).right)) then
+ begin
+ result:=cinlinenode.createintern(
+ in_inc_x,false,ccallparanode.create(
+ left,ccallparanode.create(taddnode(right).left,nil)));
+ left:=nil;
+ taddnode(right).left:=nil;
+ exit;
+ end;
+ end;
end;
end;