浏览代码

* optimize <expr> and/or <expr> if they are equal and boolean

git-svn-id: trunk@14714 -
florian 15 年之前
父节点
当前提交
a58e07df38
共有 1 个文件被更改,包括 29 次插入0 次删除
  1. 29 0
      compiler/nadd.pas

+ 29 - 0
compiler/nadd.pas

@@ -744,6 +744,35 @@ implementation
              exit;
           end;
 
+        { the comparison is might be expensive and the nodes are usually only
+          equal if some previous optimizations were done so don't check
+          this simplification always
+        }
+        if (cs_opt_level2 in current_settings.optimizerswitches) and
+          is_boolean(left.resultdef) and is_boolean(right.resultdef) and
+          { since the expressions might have sideeffects, we may only remove them
+            if short boolean evaluation is turned on }
+          (nf_short_bool in flags) then
+            begin
+              if left.isequal(right) then
+                begin
+                  case nodetype of
+                    andn,orn:
+                      begin
+                        result:=left;
+                        left:=nil;
+                        exit;
+                      end;
+                    {
+                    xorn:
+                      begin
+                        result:=cordconstnode.create(0,resultdef,true);
+                        exit;
+                      end;
+                    }
+                  end;
+                end;
+            end;
       end;