Hi
I've read some code of compiler (try to understand how it work)
and I notice, that tNode.isequal is invoked very often but has not optimal (by me) implementation


my proposition is (one assigned less):


  function tnode.isequal(p : tnode) : boolean;
    begin
       if assigned(self) then   begin
           result:=(assigned(p) and
               (p.classtype=classtype) and
               (p.nodetype=nodetype) and
               (flags*flagsequal=p.flags*flagsequal) and
               docompare(p));
       end  else
         result:=not assigned(p);
    end;
(*    *original*
       isequal:=   (not assigned(self) and not assigned(p)) or
         (assigned(self) and assigned(p) and
          { optimized subclasses have the same nodetype as their        }
{ superclass (for compatibility), so also check the classtype (JM) }
          (p.classtype=classtype) and
          (p.nodetype=nodetype) and
          (flags*flagsequal=p.flags*flagsequal) and
          docompare(p));

*)



and second:

make isequal inlined,  then in function

  function tunarynode.docompare(p : tnode) : boolean;
    begin
       docompare:=(inherited docompare(p) and
         (not assigned(left) or left.isequal(tunarynode(p).left))
       );
    end;

compiler can fold two equal node : not assigned(left) or ((assigned(p) and
          { optimized subclasses have the same nodetype as their        }
{ superclass (for compatibility), so also check the classtype (JM) }
          (p.classtype=classtype) and
          (p.nodetype=nodetype) and
          (flags*flagsequal=p.flags*flagsequal) and
          docompare(p));



Will those optimization give better code?
Can compiler remove unnecessary nodes in boolean operation after inline unfolding?

--

Darek


_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to