Browse Source

* don't switch a+/-/sqr(b) into an fma statement if b is too complex

florian 2 years ago
parent
commit
f9a4631adf
1 changed files with 28 additions and 22 deletions
  1. 28 22
      compiler/nadd.pas

+ 28 - 22
compiler/nadd.pas

@@ -3983,32 +3983,38 @@ implementation
               end
             else if (left.nodetype=inlinen) and (tinlinenode(left).inlinenumber=in_sqr_real) then
               begin
-                if nodetype=subn then
-                  result:=cinlinenode.create(inlinennr,false,ccallparanode.create(cunaryminusnode.create(right),
-                    ccallparanode.create(tinlinenode(left).left.getcopy,
-                    ccallparanode.create(tinlinenode(left).left.getcopy,nil
-                    ))))
-                else
-                  result:=cinlinenode.create(inlinennr,false,ccallparanode.create(right,
-                    ccallparanode.create(tinlinenode(left).left.getcopy,
-                    ccallparanode.create(tinlinenode(left).left.getcopy,nil
-                    ))));
-                right:=nil;
+                if node_complexity(tinlinenode(left).left)=0 then
+                  begin
+                    if nodetype=subn then
+                      result:=cinlinenode.create(inlinennr,false,ccallparanode.create(cunaryminusnode.create(right),
+                        ccallparanode.create(tinlinenode(left).left.getcopy,
+                        ccallparanode.create(tinlinenode(left).left.getcopy,nil
+                        ))))
+                    else
+                      result:=cinlinenode.create(inlinennr,false,ccallparanode.create(right,
+                        ccallparanode.create(tinlinenode(left).left.getcopy,
+                        ccallparanode.create(tinlinenode(left).left.getcopy,nil
+                        ))));
+                    right:=nil;
+                  end;
               end
             { we get here only if right is a sqr node }
             else if (right.nodetype=inlinen) and (tinlinenode(right).inlinenumber=in_sqr_real) then
               begin
-                if nodetype=subn then
-                  result:=cinlinenode.create(inlinennr,false,ccallparanode.create(left,
-                    ccallparanode.create(cunaryminusnode.create(tinlinenode(right).left.getcopy),
-                    ccallparanode.create(tinlinenode(right).left.getcopy,nil
-                    ))))
-                else
-                  result:=cinlinenode.create(inlinennr,false,ccallparanode.create(left,
-                    ccallparanode.create(tinlinenode(right).left.getcopy,
-                    ccallparanode.create(tinlinenode(right).left.getcopy,nil
-                    ))));
-                left:=nil;
+                if node_complexity(tinlinenode(right).left)=0 then
+                  begin
+                    if nodetype=subn then
+                      result:=cinlinenode.create(inlinennr,false,ccallparanode.create(left,
+                        ccallparanode.create(cunaryminusnode.create(tinlinenode(right).left.getcopy),
+                        ccallparanode.create(tinlinenode(right).left.getcopy,nil
+                        ))))
+                    else
+                      result:=cinlinenode.create(inlinennr,false,ccallparanode.create(left,
+                        ccallparanode.create(tinlinenode(right).left.getcopy,
+                        ccallparanode.create(tinlinenode(right).left.getcopy,nil
+                        ))));
+                    left:=nil;
+                  end;
               end;
           end;
       end;