[fpc-pascal] code optimization

Florian Klaempfl florian at freepascal.org
Mon Sep 27 09:05:26 CEST 2010


> 
> So to better optimise the original program with regular optimisation
> options, I guess we need a) full SSA support

Yes.

> b) better (node) CSE
> support

Enabling node cse on loadparentfpn nodes helps already slightly:

diff a/compiler/ncgld.pas b/compiler/ncgld.pas
index 028e51e..1ab6f11 100644
--- a/compiler/ncgld.pas
+++ b/compiler/ncgld.pas
@@ -410,7 +410,7 @@ implementation
                 if assigned(left) then
                   begin
                     secondpass(left);
-                    if left.location.loc<>LOC_REGISTER then
+                    if not(left.location.loc in
[LOC_REGISTER,LOC_CREGISTER]) then
                       internalerror(200309286);
                     if vs.localloc.loc<>LOC_REFERENCE then
                       internalerror(200409241);
diff a/compiler/nutils.pas b/compiler/nutils.pas
--- a/compiler/nutils.pas
+++ b/compiler/nutils.pas
@@ -703,6 +703,8 @@ implementation
                 end;
               loadn:
                 begin
+                  if assigned(tloadnode(p).left) then
+                    inc(result,node_complexity(tloadnode(p).left));
                   { threadvars need a helper call }
                   if (tloadnode(p).symtableentry.typ=staticvarsym) and
                      (vo_is_thread_var in
tstaticvarsym(tloadnode(p).symtableentry).varoptions) then
diff a/compiler/optcse.pas b/compiler/optcse.pas
--- a/compiler/optcse.pas
+++ b/compiler/optcse.pas
@@ -65,7 +65,7 @@ unit optcse;
       cseinvariant : set of tnodetype =
[loadn,addn,muln,subn,divn,slashn,modn,andn,orn,xorn,notn,vecn,
         derefn,equaln,unequaln,ltn,gtn,lten,gten,typeconvn,subscriptn,

inn,symdifn,shrn,shln,ordconstn,realconstn,unaryminusn,pointerconstn,stringconstn,setconstn,
-        isn,asn,starstarn,nothingn,temprefn {,callparan}];
+        isn,asn,starstarn,nothingn,temprefn,loadparentfpn {,callparan}];

     function searchsubdomain(var n:tnode; arg: pointer) :
foreachnoderesult;
       begin

Enabling it on dyn. array expressions could help further in theory,  if
the compiler would know that no addref/decref code is needed in this
case for the temp. dyn. array variables :)



More information about the fpc-pascal mailing list