Browse Source

* various optimizations by Dave Richards (mantis #12440)

git-svn-id: trunk@13204 -
Jonas Maebe 16 years ago
parent
commit
15b0711ca0
1 changed files with 16 additions and 19 deletions
  1. 16 19
      compiler/optbase.pas

+ 16 - 19
compiler/optbase.pas

@@ -83,17 +83,11 @@ unit optbase;
     procedure DFASetInclude(var s : tdfaset;e : integer);
       var
         i,
-        oldhigh,
         e8 : Integer;
       begin
         e8:=e div 8;
         if e8>high(s) then
-          begin
-            oldhigh:=high(s);
-            SetLength(s,e8+1);
-            for i:=oldhigh+1 to high(s) do
-              s[i]:=0;
-          end;
+          SetLength(s,e8+1);
         s[e8]:=s[e8] or (1 shl (e mod 8));
       end;
 
@@ -114,9 +108,8 @@ unit optbase;
         e8 : Integer;
       begin
         e8:=e div 8;
-        if e8>high(s) then
-          SetLength(s,e8+1);
-        s[e8]:=s[e8] and not(1 shl (e mod 8));
+        if e8<=high(s) then
+          s[e8]:=s[e8] and not(1 shl (e mod 8));
       end;
 
 
@@ -124,11 +117,11 @@ unit optbase;
       var
         e8 : Integer;
       begin
-        result:=false;
         e8:=e div 8;
-        if e8>high(s) then
-          exit;
-        result:=(s[e8] and (1 shl (e mod 8)))<>0;
+        if e8<=high(s) then
+          result:=(s[e8] and (1 shl (e mod 8)))<>0
+        else
+          result:=false;
       end;
 
 
@@ -137,10 +130,14 @@ unit optbase;
         i : integer;
       begin
         SetLength(d,max(Length(s1),Length(s2)));
-        for i:=0 to high(s1) do
-          d[i]:=s1[i];
-        for i:=0 to high(s2) do
-          d[i]:=d[i] or s2[i];
+        for i:=0 to min(high(s1),high(s2)) do
+          d[i]:=s1[i] or s2[i];
+        if high(s1)<high(s2) then
+          for i:=high(s1)+1 to high(s2) do
+            d[i]:=s2[i]
+        else
+          for i:=high(s2)+1 to high(s1) do
+            d[i]:=s1[i];
       end;
 
 
@@ -149,7 +146,7 @@ unit optbase;
         i : integer;
       begin
         SetLength(d,min(Length(s1),Length(s2)));
-        for i:=0 to min(high(s1),high(s2)) do
+        for i:=0 to high(d) do
           d[i]:=s1[i] and s2[i];
       end;