diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-03-12 07:49:37 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-03-12 07:49:37 +0000 |
commit | 0635f5e2071b33e815f918d3725b143c15ddc7ac (patch) | |
tree | 17fcf63f98be79186b62256e8d63ce345b9ed69b /compiler/nld.pas | |
parent | 8b127b358d7bf6bce3036229975987ea44fb59f2 (diff) | |
download | fpc-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.pas | 116 |
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; |