2
0
Эх сурвалжийг харах

* optimize shortstring concatenations if they're on the right side of an assignment to directly use the left side instead of a temporary

Sven/Sarah Barth 2 жил өмнө
parent
commit
02aac653d2

+ 7 - 1
compiler/nadd.pas

@@ -3382,7 +3382,13 @@ implementation
               { create the call to the concat routine both strings as arguments }
               { create the call to the concat routine both strings as arguments }
               if assigned(aktassignmentnode) and
               if assigned(aktassignmentnode) and
                   (aktassignmentnode.right=self) and
                   (aktassignmentnode.right=self) and
-                  (aktassignmentnode.left.resultdef=resultdef) and
+                  (
+                    (aktassignmentnode.left.resultdef=resultdef) or
+                    (
+                      is_shortstring(aktassignmentnode.left.resultdef) and
+                      is_shortstring(resultdef)
+                    )
+                  ) and
                   valid_for_var(aktassignmentnode.left,false) then
                   valid_for_var(aktassignmentnode.left,false) then
                 begin
                 begin
                   para:=ccallparanode.create(
                   para:=ccallparanode.create(

+ 7 - 1
compiler/nopt.pas

@@ -341,7 +341,13 @@ begin
   arrp.allow_array_constructor:=true;
   arrp.allow_array_constructor:=true;
   if assigned(aktassignmentnode) and
   if assigned(aktassignmentnode) and
      (aktassignmentnode.right=p) and
      (aktassignmentnode.right=p) and
-     (aktassignmentnode.left.resultdef=p.resultdef) and
+     (
+       (aktassignmentnode.left.resultdef=p.resultdef) or
+       (
+         is_shortstring(aktassignmentnode.left.resultdef) and
+         is_shortstring(p.resultdef)
+       )
+     ) and
      valid_for_var(aktassignmentnode.left,false) then
      valid_for_var(aktassignmentnode.left,false) then
     begin
     begin
       para:=ccallparanode.create(
       para:=ccallparanode.create(