瀏覽代碼

* optimize case statements with a single branch into if statements (ord const only)

git-svn-id: trunk@43766 -
florian 5 年之前
父節點
當前提交
abb79553d2
共有 1 個文件被更改,包括 24 次插入1 次删除
  1. 24 1
      compiler/nset.pas

+ 24 - 1
compiler/nset.pas

@@ -919,8 +919,31 @@ implementation
            end;
            end;
            result:=cifnode.create(left,node_thenblock,node_elseblock);
            result:=cifnode.create(left,node_thenblock,node_elseblock);
            left:=nil;
            left:=nil;
+           exit;
          end;
          end;
-      end;
+       { convert single case branch into if-statement }
+       if (flabels^.greater=nil) and (flabels^.less=nil) then
+         if flabels^.label_type=ltOrdinal then
+           begin
+             if flabels^._low=flabels^._high then
+               begin
+                 result:=cifnode.create_internal(
+                   caddnode.create_internal(equaln,left.getcopy,cordconstnode.create(flabels^._low,left.resultdef,false)),
+                   pcaseblock(blocks[flabels^.blockid])^.statement.getcopy,elseblock);
+               end
+             else
+               begin
+                 result:=cifnode.create_internal(
+                   caddnode.create_internal(andn,
+                     caddnode.create_internal(gten,left.getcopy,cordconstnode.create(flabels^._low,left.resultdef,false)),
+                     caddnode.create_internal(lten,left.getcopy,cordconstnode.create(flabels^._high,left.resultdef,false))
+                   ),
+                   pcaseblock(blocks[flabels^.blockid])^.statement.getcopy,elseblock);
+               end;
+             elseblock:=nil;
+             exit;
+           end;
+        end;
 
 
 
 
     function tcasenode.simplify(forinline:boolean):tnode;
     function tcasenode.simplify(forinline:boolean):tnode;