Browse Source

* first small steps towards an oop optimizer

Jonas Maebe 22 years ago
parent
commit
db7d93495b
4 changed files with 301 additions and 240 deletions
  1. 17 12
      compiler/i386/aopt386.pas
  2. 4 2
      compiler/i386/csopt386.pas
  3. 270 214
      compiler/i386/daopt386.pas
  4. 10 12
      compiler/i386/popt386.pas

+ 17 - 12
compiler/i386/aopt386.pas

@@ -50,6 +50,7 @@ Begin
   slowopt := (cs_slowoptimize in aktglobalswitches);
   slowopt := (cs_slowoptimize in aktglobalswitches);
   pass := 0;
   pass := 0;
   changed := false;
   changed := false;
+  dfa := TDFAObj.create(asml);
   repeat
   repeat
      lastLoop :=
      lastLoop :=
        not(slowopt) or
        not(slowopt) or
@@ -58,8 +59,8 @@ Begin
        (pass = 4);
        (pass = 4);
      changed := false;
      changed := false;
    { Setup labeltable, always necessary }
    { Setup labeltable, always necessary }
-     BlockStart := Tai(AsmL.First);
-     BlockEnd := DFAPass1(AsmL, BlockStart);
+     blockstart := tai(asml.first);
+     blockend := dfa.pass_1(blockstart);
    { Blockend now either contains an ait_marker with Kind = AsmBlockStart, }
    { Blockend now either contains an ait_marker with Kind = AsmBlockStart, }
    { or nil                                                                }
    { or nil                                                                }
      While Assigned(BlockStart) Do
      While Assigned(BlockStart) Do
@@ -74,11 +75,7 @@ Begin
         { Data flow analyzer }
         { Data flow analyzer }
          If (cs_fastoptimize in aktglobalswitches) Then
          If (cs_fastoptimize in aktglobalswitches) Then
            begin
            begin
-             If DFAPass2(
-{$ifdef statedebug}
-                         AsmL,
-{$endif statedebug}
-                               BlockStart, BlockEnd) Then
+             if dfa.pass_2 then
               { common subexpression elimination }
               { common subexpression elimination }
                changed := CSE(asmL, blockStart, blockEnd, pass) or changed;
                changed := CSE(asmL, blockStart, blockEnd, pass) or changed;
            end;
            end;
@@ -86,8 +83,10 @@ Begin
          PeepHoleOptPass2(AsmL, BlockStart, BlockEnd);
          PeepHoleOptPass2(AsmL, BlockStart, BlockEnd);
          if lastLoop then
          if lastLoop then
            PostPeepHoleOpts(AsmL, BlockStart, BlockEnd);
            PostPeepHoleOpts(AsmL, BlockStart, BlockEnd);
-        { Dispose labeltabel }
-         ShutDownDFA;
+
+        { Free memory }
+        dfa.clear;
+
         { Continue where we left off, BlockEnd is either the start of an }
         { Continue where we left off, BlockEnd is either the start of an }
         { assembler block or nil                                         }
         { assembler block or nil                                         }
          BlockStart := BlockEnd;
          BlockStart := BlockEnd;
@@ -106,19 +105,25 @@ Begin
                  (Tai_Marker(HP).Kind <> AsmBlockStart)) Then
                  (Tai_Marker(HP).Kind <> AsmBlockStart)) Then
              { There is no assembler block anymore after the current one, so }
              { There is no assembler block anymore after the current one, so }
              { optimize the next block of "normal" instructions              }
              { optimize the next block of "normal" instructions              }
-               BlockEnd := DFAPass1(AsmL, BlockStart)
+               BlockEnd := dfa.pass_1(blockstart)
              { Otherwise, skip the next assembler block }
              { Otherwise, skip the next assembler block }
-             Else BlockStart := HP;
+             else
+               blockStart := hp;
            End;
            End;
        End;
        End;
      inc(pass);
      inc(pass);
   until lastLoop;
   until lastLoop;
+  dfa.free;
+
 End;
 End;
 
 
 End.
 End.
 {
 {
   $Log$
   $Log$
-  Revision 1.8  2003-02-26 21:15:43  daniel
+  Revision 1.9  2003-06-08 18:48:03  jonas
+    * first small steps towards an oop optimizer
+
+  Revision 1.8  2003/02/26 21:15:43  daniel
     * Fixed the optimizer
     * Fixed the optimizer
 
 
   Revision 1.7  2002/07/01 18:46:29  peter
   Revision 1.7  2002/07/01 18:46:29  peter

+ 4 - 2
compiler/i386/csopt386.pas

@@ -1980,7 +1980,6 @@ begin
             p := Tai(p.next);;
             p := Tai(p.next);;
           End;
           End;
     End;
     End;
-    FreeMem(TaiPropBlock, NrOfTaiObjs*SizeOf(TTaiProp))
 End;
 End;
 
 
 function CSE(AsmL: TAAsmOutput; First, Last: Tai; pass: longint): boolean;
 function CSE(AsmL: TAAsmOutput; First, Last: Tai; pass: longint): boolean;
@@ -1997,7 +1996,10 @@ End.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.47  2003-06-03 21:09:05  peter
+  Revision 1.48  2003-06-08 18:48:03  jonas
+    * first small steps towards an oop optimizer
+
+  Revision 1.47  2003/06/03 21:09:05  peter
     * internal changeregsize for optimizer
     * internal changeregsize for optimizer
     * fix with a hack to not remove the first instruction of a block
     * fix with a hack to not remove the first instruction of a block
       which will leave blockstart pointing to invalid memory
       which will leave blockstart pointing to invalid memory

+ 270 - 214
compiler/i386/daopt386.pas

@@ -197,30 +197,51 @@ Function InstructionsEquivalent(p1, p2: Tai; Var RegInfo: TRegInfo): Boolean;
 function sizescompatible(loadsize,newsize: topsize): boolean;
 function sizescompatible(loadsize,newsize: topsize): boolean;
 Function OpsEqual(const o1,o2:toper): Boolean;
 Function OpsEqual(const o1,o2:toper): Boolean;
 
 
-Function DFAPass1(AsmL: TAAsmOutput; BlockStart: Tai): Tai;
-Function DFAPass2(
-{$ifdef statedebug}
-                   AsmL: TAAsmOutPut;
-{$endif statedebug}
-                                      BlockStart, BlockEnd: Tai): Boolean;
-Procedure ShutDownDFA;
 
 
-Function FindLabel(L: tasmlabel; Var hp: Tai): Boolean;
+type
+  tdfaobj = class
+    constructor create(_list: taasmoutput); virtual;
 
 
-Procedure IncState(Var S: Byte; amount: longint);
+    function pass_1(_blockstart: tai): tai;
+    function pass_2: boolean;
+    procedure clear;
 
 
-{******************************* Variables *******************************}
+    function getlabelwithsym(sym: tasmlabel): tai;
 
 
-Var
-{the amount of TaiObjects in the current assembler list}
-  NrOfTaiObjs: Longint;
+   private
+    { Walks through the list to find the lowest and highest label number, inits the }
+    { labeltable and fixes/optimizes some regallocs                                 }
+     procedure initlabeltable;
+
+    function initdfapass2: boolean;
+    procedure dodfapass2;
 
 
-{Array which holds all TTaiProps}
-  TaiPropBlock: PTaiPropBlock;
+    { asm list we're working on }
+    list: taasmoutput;
 
 
-  LoLab, HiLab, LabDif: Longint;
+    { current part of the asm list }
+    blockstart, blockend: tai;
 
 
-  LTable: PLabelTable;
+    { the amount of TaiObjects in the current part of the assembler list }
+    nroftaiobjs: longint;
+
+    { Array which holds all TTaiProps }
+    taipropblock: ptaipropblock;
+
+    { all labels in the current block: their value mapped to their location }
+    lolab, hilab, labdif: longint;
+    labeltable: plabeltable;
+  end;
+
+
+Function FindLabel(L: tasmlabel; Var hp: Tai): Boolean;
+
+Procedure IncState(Var S: Byte; amount: longint);
+
+{******************************* Variables *******************************}
+
+var
+  dfa: tdfaobj;
 
 
 {*********************** End of Interface section ************************}
 {*********************** End of Interface section ************************}
 
 
@@ -312,40 +333,6 @@ End;
 
 
 {************************ Create the Label table ************************}
 {************************ Create the Label table ************************}
 
 
-Function FindLoHiLabels(Var LowLabel, HighLabel, LabelDif: Longint; BlockStart: Tai): Tai;
-{Walks through the TAAsmlist to find the lowest and highest label number}
-Var LabelFound: Boolean;
-    P, lastP: Tai;
-Begin
-  LabelFound := False;
-  LowLabel := MaxLongint;
-  HighLabel := 0;
-  P := BlockStart;
-  lastP := p;
-  While Assigned(P) Do
-    Begin
-      If (Tai(p).typ = ait_label) Then
-        If not labelCanBeSkipped(Tai_label(p))
-          Then
-            Begin
-              LabelFound := True;
-              If (Tai_Label(p).l.labelnr < LowLabel) Then
-                LowLabel := Tai_Label(p).l.labelnr;
-              If (Tai_Label(p).l.labelnr > HighLabel) Then
-                HighLabel := Tai_Label(p).l.labelnr;
-            End;
-      lastP := p;
-      GetNextInstruction(p, p);
-    End;
-  if (lastP.typ = ait_marker) and
-     (Tai_marker(lastp).kind = asmBlockStart) then
-    FindLoHiLabels := lastP
-  else FindLoHiLabels := nil;
-  If LabelFound
-    Then LabelDif := HighLabel+1-LowLabel
-    Else LabelDif := 0;
-End;
-
 Function FindRegAlloc(Reg: Tregister; StartTai: Tai; alloc: boolean): Boolean;
 Function FindRegAlloc(Reg: Tregister; StartTai: Tai; alloc: boolean): Boolean;
 { Returns true if a ait_alloc object for Reg is found in the block of Tai's }
 { Returns true if a ait_alloc object for Reg is found in the block of Tai's }
 { starting with StartTai and ending with the next "real" instruction        }
 { starting with StartTai and ending with the next "real" instruction        }
@@ -477,71 +464,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-Procedure BuildLabelTableAndFixRegAlloc(asmL: TAAsmOutput; Var LabelTable: PLabelTable; LowLabel: Longint;
-            Var LabelDif: Longint; BlockStart, BlockEnd: Tai);
-{Builds a table with the locations of the labels in the TAAsmoutput.
- Also fixes some RegDeallocs like "# %eax released; push (%eax)"}
-Var p, hp1, hp2, lastP: Tai;
-    regCounter: TRegister;
-    UsedRegs, noDeallocRegs: TRegSet;
-Begin
-  UsedRegs := [];
-  If (LabelDif <> 0) Then
-    Begin
-      GetMem(LabelTable, LabelDif*SizeOf(TLabelTableItem));
-      FillChar(LabelTable^, LabelDif*SizeOf(TLabelTableItem), 0);
-    End;
-  p := BlockStart;
-  lastP := p;
-  While (P <> BlockEnd) Do
-    Begin
-      Case p.typ Of
-        ait_Label:
-          If not labelCanBeSkipped(Tai_label(p)) Then
-            LabelTable^[Tai_Label(p).l.labelnr-LowLabel].TaiObj := p;
-        ait_regAlloc:
-          { ESI and EDI are (de)allocated manually, don't mess with them }
-          if not(tai_regalloc(p).Reg.enum in [R_EDI]) then
-            begin
-              if tai_regalloc(p).Allocation then
-                Begin
-                  If Not(tai_regalloc(p).Reg.enum in UsedRegs) Then
-                    UsedRegs := UsedRegs + [tai_regalloc(p).Reg.enum]
-                  Else
-                    addRegDeallocFor(asmL, tai_regalloc(p).reg, p);
-                End
-              else
-                begin
-                  UsedRegs := UsedRegs - [tai_regalloc(p).Reg.enum];
-                  hp1 := p;
-                  hp2 := nil;
-                  While Not(FindRegAlloc(tai_regalloc(p).Reg, Tai(hp1.Next),true)) And
-                        GetNextInstruction(hp1, hp1) And
-                        RegInInstruction(tai_regalloc(p).Reg.enum, hp1) Do
-                    hp2 := hp1;
-                  If hp2 <> nil Then
-                    Begin
-                      hp1 := Tai(p.previous);
-                      AsmL.Remove(p);
-                      InsertLLItem(AsmL, hp2, Tai(hp2.Next), p);
-                      p := hp1;
-                    end;
-                end;
-            end;
-      end;
-      repeat
-        lastP := p;
-        P := Tai(P.Next);
-      until not(Assigned(p)) or
-            not(p.typ in (SkipInstr - [ait_regalloc]));
-    End;
-  { don't add deallocation for function result variable or for regvars}
-  getNoDeallocRegs(noDeallocRegs);
-  usedRegs := usedRegs - noDeallocRegs;
-  for regCounter.enum := R_EAX to R_EDI do
-    if regCounter.enum in usedRegs then
-      addRegDeallocFor(asmL,regCounter,lastP);
-End;
+
 
 
 {************************ Search the Label table ************************}
 {************************ Search the Label table ************************}
 
 
@@ -2025,15 +1948,6 @@ Begin
   End;
   End;
 End;
 End;
 
 
-Function DFAPass1(AsmL: TAAsmOutput; BlockStart: Tai): Tai;
-{gathers the RegAlloc data... still need to think about where to store it to
- avoid global vars}
-Var BlockEnd: Tai;
-Begin
-  BlockEnd := FindLoHiLabels(LoLab, HiLab, LabDif, BlockStart);
-  BuildLabelTableAndFixRegAlloc(AsmL, LTable, LoLab, LabDif, BlockStart, BlockEnd);
-  DFAPass1 := BlockEnd;
-End;
 
 
 Procedure AddInstr2RegContents({$ifdef statedebug} asml: TAAsmoutput; {$endif}
 Procedure AddInstr2RegContents({$ifdef statedebug} asml: TAAsmoutput; {$endif}
 p: Taicpu; reg: TRegister);
 p: Taicpu; reg: TRegister);
@@ -2089,11 +2003,196 @@ Begin
     End
     End
 End;
 End;
 
 
-Procedure DoDFAPass2(
-{$Ifdef StateDebug}
-AsmL: TAAsmOutput;
-{$endif statedebug}
-BlockStart, BlockEnd: Tai);
+
+{*************************************************************************************}
+{************************************** TDFAOBJ **************************************}
+{*************************************************************************************}
+
+constructor tdfaobj.create(_list: taasmoutput);
+begin
+  list := _list;
+  blockstart := nil;
+  blockend := nil;
+  nroftaiobjs := 0;
+  taipropblock := nil;
+  lolab := 0;
+  hilab := 0;
+  labdif := 0;
+  labeltable := nil;  
+end;
+
+
+procedure tdfaobj.initlabeltable;
+var
+  labelfound: boolean;
+  p, prev: tai;
+  hp1, hp2: Tai;
+{$ifdef i386}
+  regcounter: tregister;
+{$endif i386}
+  usedregs, nodeallocregs: tregset;
+begin
+  labelfound := false;
+  lolab := maxlongint;
+  hilab := 0;
+  p := blockstart;
+  prev := p;
+  while assigned(p) do
+    begin
+      if (tai(p).typ = ait_label) then
+        if not labelcanbeskipped(tai_label(p)) then
+          begin
+            labelfound := true;
+             if (tai_Label(p).l.labelnr < lolab) then
+               lolab := tai_label(p).l.labelnr;
+             if (tai_Label(p).l.labelnr > hilab) then
+               hilab := tai_label(p).l.labelnr;
+          end;
+      prev := p;
+      getnextinstruction(p, p);
+    end;
+  if (prev.typ = ait_marker) and
+     (tai_marker(prev).kind = asmblockstart) then
+    blockend := prev
+  else blockend := nil;
+  if labelfound then
+    labdif := hilab+1-lolab
+  else labdif := 0;
+
+  usedregs := [];
+  if (labdif <> 0) then
+    begin
+      getmem(labeltable, labdif*sizeof(tlabeltableitem));
+      fillchar(labeltable^, labdif*sizeof(tlabeltableitem), 0);
+    End;
+  p := blockstart;
+  prev := p;
+  while (p <> blockend) do
+    begin
+      case p.typ of
+        ait_label:
+          if not labelcanbeskipped(tai_label(p)) then
+            labeltable^[tai_label(p).l.labelnr-lolab].taiobj := p;
+{$ifdef i386}
+        ait_regalloc:
+          { EDI is (de)allocated manually, don't mess with it }
+          if not(tai_regalloc(p).reg.enum in [R_EDI]) then
+            begin
+              if tai_regalloc(p).allocation then
+                begin
+                  if not(tai_regalloc(p).reg.enum in usedregs) then
+                    usedregs := usedregs + [tai_regalloc(p).reg.enum]
+                  else
+                    addregdeallocfor(list, tai_regalloc(p).reg, p);
+                end
+              else
+                begin
+                  usedregs := Usedregs - [tai_regalloc(p).reg.enum];
+                  hp1 := p;
+                  hp2 := nil;
+                  while not(findregalloc(tai_regalloc(p).reg, tai(hp1.next),true)) and
+                        getnextinstruction(hp1, hp1) and
+                        regininstruction(tai_regalloc(p).reg.enum, hp1) Do
+                    hp2 := hp1;
+                  if hp2 <> nil then
+                    begin
+                      hp1 := tai(p.previous);
+                      list.remove(p);
+                      insertllitem(list, hp2, tai(hp2.next), p);
+                      p := hp1;
+                    end;
+                end;
+            end;
+{$endif i386}
+      end;
+      repeat
+        prev := p;
+        p := tai(p.next);
+      until not(assigned(p)) or
+            not(p.typ in (skipinstr - [ait_regalloc]));
+    end;
+{$ifdef i386}
+  { don't add deallocation for function result variable or for regvars}
+  getNoDeallocRegs(noDeallocRegs);
+  usedRegs := usedRegs - noDeallocRegs;
+  for regCounter.enum := R_EAX to R_EDI do
+    if regCounter.enum in usedRegs then
+      addRegDeallocFor(list,regCounter,prev);
+{$endif i386}
+end;
+
+
+function tdfaobj.pass_1(_blockstart: tai): tai;
+begin
+  blockstart := _blockstart;
+  initlabeltable;
+  pass_1 := blockend;
+end;
+
+
+
+function tdfaobj.initdfapass2: boolean;
+{reserves memory for the PTaiProps in one big memory block when not using
+ TP, returns False if not enough memory is available for the optimizer in all
+ cases}
+var
+  p: Tai;
+  count: Longint;
+{    TmpStr: String; }
+begin
+  p := blockstart;
+  skiphead(p);
+  nroftaiobjs := 0;
+  while (p <> blockend) do
+    begin
+{$IfDef JumpAnal}
+      case p.typ of
+        ait_label:
+          begin
+            if not labelcanbeskipped(tai_label(p)) then
+              labeltable^[tai_label(p).l.labelnr-lolab].instrnr := nroftaiobjs
+          End;
+        ait_instruction:
+          begin
+            if taicpu(p).is_jmp then
+             begin
+               if (tasmlabel(taicpu(p).oper[0].sym).labelnr >= lolab) And
+                  (tasmlabel(taicpu(p).oper[0].sym).labelnr <= hilab) Then
+                 inc(labeltable^[tasmlabel(taicpu(p).oper[0].sym).labelnr-lolab].refsfound);
+             end;
+          end;
+{        ait_instruction:
+          Begin
+           If (Taicpu(p).opcode = A_PUSH) And
+              (Taicpu(p).oper[0].typ = top_symbol) And
+              (PCSymbol(Taicpu(p).oper[0])^.offset = 0) Then
+             Begin
+               TmpStr := StrPas(PCSymbol(Taicpu(p).oper[0])^.symbol);
+               If}
+      End;
+{$EndIf JumpAnal}
+      inc(NrOfTaiObjs);
+      getnextinstruction(p,p);
+    End;
+  if nroftaiobjs <> 0 Then
+    begin
+      initdfapass2 := True;
+      getmem(taipropblock, nroftaiobjs*sizeof(ttaiprop));
+      fillchar(taiPropblock^,nroftaiobjs*sizeof(ttaiprop),0);
+      p := blockstart;
+      skiphead(p);
+      for count := 1 To nroftaiobjs do
+        begin
+          ptaiprop(p.optinfo) := @taipropblock^[count];
+          getnextinstruction(p, p);
+        end;
+    end
+  else
+    initdfapass2 := false;
+end;
+
+
+procedure tdfaobj.dodfapass2;
 {Analyzes the Data Flow of an assembler list. Starts creating the reg
 {Analyzes the Data Flow of an assembler list. Starts creating the reg
  contents for the instructions starting with p. Returns the last Tai which has
  contents for the instructions starting with p. Returns the last Tai which has
  been processed}
  been processed}
@@ -2640,96 +2739,53 @@ Begin
     End;
     End;
 End;
 End;
 
 
-Function InitDFAPass2(BlockStart, BlockEnd: Tai): Boolean;
-{reserves memory for the PTaiProps in one big memory block when not using
- TP, returns False if not enough memory is available for the optimizer in all
- cases}
-Var p: Tai;
-    Count: Longint;
-{    TmpStr: String; }
-Begin
-  P := BlockStart;
-  SkipHead(P);
-  NrOfTaiObjs := 0;
-  While (P <> BlockEnd) Do
-    Begin
-{$IfDef JumpAnal}
-      Case p.Typ Of
-        ait_label:
-          Begin
-            If not labelCanBeSkipped(Tai_label(p)) Then
-              LTable^[Tai_Label(p).l^.labelnr-LoLab].InstrNr := NrOfTaiObjs
-          End;
-        ait_instruction:
-          begin
-            if Taicpu(p).is_jmp then
-             begin
-               If (tasmlabel(Taicpu(p).oper[0].sym).labelnr >= LoLab) And
-                  (tasmlabel(Taicpu(p).oper[0].sym).labelnr <= HiLab) Then
-                 Inc(LTable^[tasmlabel(Taicpu(p).oper[0].sym).labelnr-LoLab].RefsFound);
-             end;
-          end;
-{        ait_instruction:
-          Begin
-           If (Taicpu(p).opcode = A_PUSH) And
-              (Taicpu(p).oper[0].typ = top_symbol) And
-              (PCSymbol(Taicpu(p).oper[0])^.offset = 0) Then
-             Begin
-               TmpStr := StrPas(PCSymbol(Taicpu(p).oper[0])^.symbol);
-               If}
-      End;
-{$EndIf JumpAnal}
-      Inc(NrOfTaiObjs);
-      GetNextInstruction(p, p);
-    End;
-{Uncomment the next line to see how much memory the reloading optimizer needs}
-{  Writeln(NrOfTaiObjs*SizeOf(TTaiProp));}
-{no need to check mem/maxavail, we've got as much virtual memory as we want}
-  If NrOfTaiObjs <> 0 Then
-    Begin
-      InitDFAPass2 := True;
-      GetMem(TaiPropBlock, NrOfTaiObjs*SizeOf(TTaiProp));
-      fillchar(TaiPropBlock^,NrOfTaiObjs*SizeOf(TTaiProp),0);
-      p := BlockStart;
-      SkipHead(p);
-      For Count := 1 To NrOfTaiObjs Do
-        Begin
-          PTaiProp(p.OptInfo) := @TaiPropBlock^[Count];
-          GetNextInstruction(p, p);
-        End;
-    End
-  Else InitDFAPass2 := False;
-End;
 
 
-Function DFAPass2(
-{$ifdef statedebug}
-                   AsmL: TAAsmOutPut;
-{$endif statedebug}
-                                      BlockStart, BlockEnd: Tai): Boolean;
-Begin
-  If InitDFAPass2(BlockStart, BlockEnd) Then
-    Begin
-      DoDFAPass2(
-{$ifdef statedebug}
-         asml,
-{$endif statedebug}
-         BlockStart, BlockEnd);
-      DFAPass2 := True
-    End
-  Else DFAPass2 := False;
-End;
+function tdfaobj.pass_2: boolean;
+begin
+  if initdfapass2 Then
+    begin
+      dodfapass2;
+      pass_2 := true
+    end
+  else
+    pass_2 := false;
+end;
 
 
-Procedure ShutDownDFA;
-Begin
-  If LabDif <> 0 Then
-    FreeMem(LTable, LabDif*SizeOf(TLabelTableItem));
-End;
 
 
-End.
+function tdfaobj.getlabelwithsym(sym: tasmlabel): tai;
+begin
+  if (sym.labelnr >= lolab) and
+     (sym.labelnr <= hilab) then   { range check, a jump can go past an assembler block! }
+    getlabelwithsym := labeltable^[sym.labelnr-lolab].taiobj
+  else
+    getlabelwithsym := nil;
+end;
+
+
+
+procedure tdfaobj.clear;
+begin
+  if labdif <> 0 then
+    begin
+      freemem(labeltable);
+      labeltable := nil;
+    end;
+  if assigned(taipropblock) then
+    begin
+      freemem(taipropblock, nroftaiobjs*sizeof(ttaiprop));
+      taipropblock := nil;
+    end;
+end;
+
+
+end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.51  2003-06-03 21:09:05  peter
+  Revision 1.52  2003-06-08 18:48:03  jonas
+    * first small steps towards an oop optimizer
+
+  Revision 1.51  2003/06/03 21:09:05  peter
     * internal changeregsize for optimizer
     * internal changeregsize for optimizer
     * fix with a hack to not remove the first instruction of a block
     * fix with a hack to not remove the first instruction of a block
       which will leave blockstart pointing to invalid memory
       which will leave blockstart pointing to invalid memory

+ 10 - 12
compiler/i386/popt386.pas

@@ -472,11 +472,9 @@ Var
     if level > 20 then
     if level > 20 then
       exit;
       exit;
     GetfinalDestination := false;
     GetfinalDestination := false;
-    If (tasmlabel(hp.oper[0].sym).labelnr >= LoLab) and
-       (tasmlabel(hp.oper[0].sym).labelnr <= HiLab) and   {range check, a jump can go past an assembler block!}
-       Assigned(LTable^[tasmlabel(hp.oper[0].sym).labelnr-LoLab].TaiObj) Then
-      Begin
-        p1 := LTable^[tasmlabel(hp.oper[0].sym).labelnr-LoLab].TaiObj; {the jump's destination}
+    p1 := dfa.getlabelwithsym(tasmlabel(hp.oper[0].sym));
+    if assigned(p1) then
+      begin
         SkipLabels(p1,p1);
         SkipLabels(p1,p1);
         If (Tai(p1).typ = ait_instruction) and
         If (Tai(p1).typ = ait_instruction) and
            (Taicpu(p1).is_jmp) Then
            (Taicpu(p1).is_jmp) Then
@@ -635,8 +633,7 @@ Begin
                               Taicpu(p).condition:=inverse_cond[Taicpu(p).condition]
                               Taicpu(p).condition:=inverse_cond[Taicpu(p).condition]
                              else
                              else
                               begin
                               begin
-                                If (LabDif <> 0) Then
-                                  GetFinalDestination(asml, Taicpu(p),0);
+                                GetFinalDestination(asml, Taicpu(p),0);
                                 p:=Tai(p.next);
                                 p:=Tai(p.next);
                                 continue;
                                 continue;
                               end;
                               end;
@@ -645,12 +642,10 @@ Begin
                              Taicpu(p).oper[0].sym.increfs;
                              Taicpu(p).oper[0].sym.increfs;
                              asml.remove(hp1);
                              asml.remove(hp1);
                              hp1.free;
                              hp1.free;
-                             If (LabDif <> 0) Then
-                               GetFinalDestination(asml, Taicpu(p),0);
+                             GetFinalDestination(asml, Taicpu(p),0);
                            end
                            end
                          else
                          else
-                           If (LabDif <> 0) Then
-                             GetFinalDestination(asml, Taicpu(p),0);
+                           GetFinalDestination(asml, Taicpu(p),0);
                      end;
                      end;
                  end;
                  end;
              end
              end
@@ -2063,7 +2058,10 @@ End.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.46  2003-06-03 21:09:05  peter
+  Revision 1.47  2003-06-08 18:48:03  jonas
+    * first small steps towards an oop optimizer
+
+  Revision 1.46  2003/06/03 21:09:05  peter
     * internal changeregsize for optimizer
     * internal changeregsize for optimizer
     * fix with a hack to not remove the first instruction of a block
     * fix with a hack to not remove the first instruction of a block
       which will leave blockstart pointing to invalid memory
       which will leave blockstart pointing to invalid memory