Browse Source

* changed specific bugfix (which was actually wrong implemented, but did the
right thing in most cases nevertheless) to general bugfix
* fixed bug that caused
mov (ebp), edx mov (ebp), edx
mov (edx), edx

Jonas Maebe 27 years ago
parent
commit
d8c11fa743
2 changed files with 61 additions and 38 deletions
  1. 19 10
      compiler/csopt386.pas
  2. 42 28
      compiler/daopt386.pas

+ 19 - 10
compiler/csopt386.pas

@@ -84,9 +84,11 @@ Begin {CheckSequence}
   While (RegCounter <= R_EDI) Do
   While (RegCounter <= R_EDI) Do
     Begin
     Begin
       FillChar(RegInfo, SizeOf(RegInfo), 0);
       FillChar(RegInfo, SizeOf(RegInfo), 0);
-      RegInfo.RegsEncountered := [ProcInfo.FramePointer, R_ESP];
-      RegInfo.SubstRegs[ProcInfo.FramePointer] := ProcInfo.FramePointer;
-      RegInfo.SubstRegs[R_ESP] := R_ESP;
+      RegInfo.NewRegsEncountered := [ProcInfo.FramePointer, R_ESP];
+      RegInfo.OldRegsEncountered := RegInfo.NewRegsEncountered;
+      RegInfo.New2OldReg[ProcInfo.FramePointer] := ProcInfo.FramePointer;
+      RegInfo.New2OldReg[R_ESP] := R_ESP;
+      RegInfo.Old2NewReg := RegInfo.New2OldReg;
       Found := 0;
       Found := 0;
       hp2 := PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod;
       hp2 := PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod;
       If (PrevNonRemovablePai <> PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod)
       If (PrevNonRemovablePai <> PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod)
@@ -339,21 +341,21 @@ Begin
                   If (RegCounter in RegInfo.RegsLoadedForRef) Then
                   If (RegCounter in RegInfo.RegsLoadedForRef) Then
                     Begin
                     Begin
              hp5 := new(pai_asm_comment,init(strpnew('New: '+att_reg2str[RegCounter]+', Old: '+
              hp5 := new(pai_asm_comment,init(strpnew('New: '+att_reg2str[RegCounter]+', Old: '+
-                                                    att_reg2str[RegInfo.SubstRegs[RegCounter]])));
+                                                    att_reg2str[RegInfo.New2OldReg[RegCounter]])));
              InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp5);
              InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp5);
                     End;
                     End;
 {$EndIf CSDebug}
 {$EndIf CSDebug}
                                      For RegCounter := R_EAX To R_EDI Do
                                      For RegCounter := R_EAX To R_EDI Do
                                        Begin
                                        Begin
-                                         If (RegInfo.SubstRegs[RegCounter] <> R_NO) Then
+                                         If (RegInfo.New2OldReg[RegCounter] <> R_NO) Then
                                            If Not(RegCounter In RegInfo.RegsLoadedForRef) And
                                            If Not(RegCounter In RegInfo.RegsLoadedForRef) And
-                                                          {new reg              old reg}
-                                              (RegInfo.SubstRegs[RegCounter] <> RegCounter) Then
+                                                          {old reg              new reg}
+                                              (RegInfo.New2OldReg[RegCounter] <> RegCounter) Then
 
 
                                              Begin
                                              Begin
                                                hp3 := New(Pai386,Op_Reg_Reg(A_MOV, S_L,
                                                hp3 := New(Pai386,Op_Reg_Reg(A_MOV, S_L,
                                                                     {old reg          new reg}
                                                                     {old reg          new reg}
-                                                      RegInfo.SubstRegs[RegCounter], RegCounter));
+                                                      RegInfo.New2OldReg[RegCounter], RegCounter));
                                                hp3^.fileinfo := hp2^.fileinfo;
                                                hp3^.fileinfo := hp2^.fileinfo;
                                                hp3^.fileinfo.line := PPaiProp(hp2^.fileinfo.line)^.LineSave;
                                                hp3^.fileinfo.line := PPaiProp(hp2^.fileinfo.line)^.LineSave;
                                                InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp3);
                                                InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp3);
@@ -366,7 +368,7 @@ Begin
                                              Begin
                                              Begin
  {load Cnt2 with the total number of instructions of this sequence}
  {load Cnt2 with the total number of instructions of this sequence}
                                                Cnt2 := PPaiProp(hp4^.fileinfo.line)^.
                                                Cnt2 := PPaiProp(hp4^.fileinfo.line)^.
-                                                       Regs[RegInfo.SubstRegs[RegCounter]].NrOfMods;
+                                                       Regs[RegInfo.New2OldReg[RegCounter]].NrOfMods;
  {sometimes, a register can not be removed from a sequence, because it's
  {sometimes, a register can not be removed from a sequence, because it's
   still used afterwards:
   still used afterwards:
 
 
@@ -564,7 +566,14 @@ End.
 
 
 {
 {
  $Log$
  $Log$
- Revision 1.12  1998-10-20 09:32:54  peter
+ Revision 1.13  1998-11-09 19:33:39  jonas
+   * changed specific bugfix (which was actually wrong implemented, but did the
+     right thing in most cases nevertheless) to general bugfix
+   * fixed bug that caused
+     mov (ebp), edx                                    mov (ebp), edx
+     mov (edx), edx
+
+ Revision 1.12  1998/10/20 09:32:54  peter
    * removed some unused vars
    * removed some unused vars
 
 
  Revision 1.11  1998/10/07 16:24:52  jonas
  Revision 1.11  1998/10/07 16:24:52  jonas

+ 42 - 28
compiler/daopt386.pas

@@ -42,9 +42,9 @@ Type
   TRegArray = Array[R_EAX..R_BL] of TRegister;
   TRegArray = Array[R_EAX..R_BL] of TRegister;
   TRegSet = Set of R_EAX..R_BL;
   TRegSet = Set of R_EAX..R_BL;
   TRegInfo = Record
   TRegInfo = Record
-                RegsEncountered: TRegSet;
+                NewRegsEncountered, OldRegsEncountered: TRegSet;
                 RegsLoadedForRef: TRegSet;
                 RegsLoadedForRef: TRegSet;
-                SubstRegs: TRegArray;
+                Old2NewReg, New2OldReg: TRegArray;
               End;
               End;
 
 
 {*********************** Procedures and Functions ************************}
 {*********************** Procedures and Functions ************************}
@@ -824,43 +824,55 @@ Begin
 End;
 End;
 
 
 Procedure AddReg2RegInfo(OldReg, NewReg: TRegister; Var RegInfo: TRegInfo);
 Procedure AddReg2RegInfo(OldReg, NewReg: TRegister; Var RegInfo: TRegInfo);
-{updates the RegsEncountered and SubstRegs fields of RegInfo. Assumes that
+{updates the ???RegsEncountered and ???2???Reg fields of RegInfo. Assumes that
  OldReg and NewReg have the same size (has to be chcked in advance with
  OldReg and NewReg have the same size (has to be chcked in advance with
  RegsSameSize) and that neither equals R_NO}
  RegsSameSize) and that neither equals R_NO}
 Begin
 Begin
   With RegInfo Do
   With RegInfo Do
     Begin
     Begin
-      RegsEncountered := RegsEncountered + [NewReg];
-      SubstRegs[NewReg] := OldReg;
+      NewRegsEncountered := NewRegsEncountered + [NewReg];
+      OldRegsEncountered := OldRegsEncountered + [OldReg];
+      New2OldReg[NewReg] := OldReg;
+      Old2NewReg[OldReg] := NewReg;
       Case OldReg Of
       Case OldReg Of
         R_EAX..R_EDI:
         R_EAX..R_EDI:
           Begin
           Begin
-            RegsEncountered := RegsEncountered + [Reg32toReg16(NewReg)];
-            SubstRegs[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg);
+            NewRegsEncountered := NewRegsEncountered + [Reg32toReg16(NewReg)];
+            OldRegsEncountered := OldRegsEncountered + [Reg32toReg16(OldReg)];
+            New2OldReg[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg);
+            Old2NewReg[Reg32toReg16(OldReg)] := Reg32toReg16(NewReg);
             If (NewReg in [R_EAX..R_EBX]) And
             If (NewReg in [R_EAX..R_EBX]) And
                (OldReg in [R_EAX..R_EBX]) Then
                (OldReg in [R_EAX..R_EBX]) Then
               Begin
               Begin
-                RegsEncountered := RegsEncountered + [Reg32toReg8(NewReg)];
-                SubstRegs[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg);
+                NewRegsEncountered := NewRegsEncountered + [Reg32toReg8(NewReg)];
+                OldRegsEncountered := OldRegsEncountered + [Reg32toReg8(OldReg)];
+                New2OldReg[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg);
+                Old2NewReg[Reg32toReg8(OldReg)] := Reg32toReg8(NewReg);
               End;
               End;
           End;
           End;
         R_AX..R_DI:
         R_AX..R_DI:
           Begin
           Begin
-            RegsEncountered := RegsEncountered + [Reg16toReg32(NewReg)];
-            SubstRegs[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg);
+            NewRegsEncountered := NewRegsEncountered + [Reg16toReg32(NewReg)];
+            OldRegsEncountered := OldRegsEncountered + [Reg16toReg32(OldReg)];
+            New2OldReg[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg);
+            Old2NewReg[Reg16toReg32(OldReg)] := Reg16toReg32(NewReg);
             If (NewReg in [R_AX..R_BX]) And
             If (NewReg in [R_AX..R_BX]) And
                (OldReg in [R_AX..R_BX]) Then
                (OldReg in [R_AX..R_BX]) Then
               Begin
               Begin
-                RegsEncountered := RegsEncountered + [Reg16toReg8(NewReg)];
-                SubstRegs[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg);
+                NewRegsEncountered := NewRegsEncountered + [Reg16toReg8(NewReg)];
+                OldRegsEncountered := OldRegsEncountered + [Reg16toReg8(OldReg)];
+                New2OldReg[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg);
+                Old2NewReg[Reg16toReg8(OldReg)] := Reg16toReg8(NewReg);
               End;
               End;
           End;
           End;
         R_AL..R_BL:
         R_AL..R_BL:
           Begin
           Begin
-            RegsEncountered := RegsEncountered + [Reg8toReg32(NewReg)]
+            NewRegsEncountered := NewRegsEncountered + [Reg8toReg32(NewReg)]
                                + [Reg8toReg16(NewReg)];
                                + [Reg8toReg16(NewReg)];
-            SubstRegs[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg);
-            SubstRegs[Reg8toReg16(NewReg)] := Reg8toReg16(OldReg);
+            OldRegsEncountered := OldRegsEncountered + [Reg8toReg32(OldReg)]
+                               + [Reg8toReg16(OldReg)];
+            New2OldReg[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg);
+            Old2NewReg[Reg8toReg16(OldReg)] := Reg8toReg16(NewReg);
           End;
           End;
       End;
       End;
     End;
     End;
@@ -893,12 +905,16 @@ Begin
  processed. This happens if it has been compared with a register that doesn't
  processed. This happens if it has been compared with a register that doesn't
  have an 8 bit component (such as EDI). In that case the 8 bit component is
  have an 8 bit component (such as EDI). In that case the 8 bit component is
  still set to R_NO and the comparison in the Else-part will fail}
  still set to R_NO and the comparison in the Else-part will fail}
-        If Not(Reg32(NewReg) in RegsEncountered) Then
+        If Not((Reg32(NewReg) in NewRegsEncountered) Or
+               (Reg32(OldReg) in OldRegsEncountered)) Then
           Begin
           Begin
             AddReg2RegInfo(OldReg, NewReg, RegInfo);
             AddReg2RegInfo(OldReg, NewReg, RegInfo);
             RegsEquivalent := True
             RegsEquivalent := True
           End
           End
-        Else RegsEquivalent := OldReg = SubstRegs[NewReg]
+        Else RegsEquivalent :=
+               (Reg32(NewReg) in NewRegsEncountered) And
+               (Reg32(OldReg) in OldRegsEncountered) And
+               (OldReg = New2OldReg[NewReg])
     Else RegsEquivalent := False
     Else RegsEquivalent := False
   Else RegsEquivalent := OldReg = NewReg
   Else RegsEquivalent := OldReg = NewReg
 End;
 End;
@@ -1355,18 +1371,9 @@ Begin {checks whether two Pai386 instructions are equal}
                   Writeln(att_reg2str[Reg32(TRegister(Pai386(p2)^.op2))], ' removed');
                   Writeln(att_reg2str[Reg32(TRegister(Pai386(p2)^.op2))], ' removed');
                 end;
                 end;
 {$endif csdebug}
 {$endif csdebug}
-            If (TRegister(Pai386(p1)^.op2) In RegInfo.RegsEncountered) Or
-               Not(RegInRef(TRegister(Pai386(p1)^.op2), TReference(Pai386(p2)^.op1^))) Then
-
-  { To avoid
-       movl  48(%esi), %esi                         movl  48(%esi), %esi
-       pushl %esi             getting changed to    pushl %esi
-       movl  48(%esi), %edi                         movl %esi, %edi }
-
               InstructionsEquivalent :=
               InstructionsEquivalent :=
                  OpsEquivalent(Pai386(p1)^.op1t, Pai386(p1)^.op1, Pai386(p2)^.op1, RegInfo) And
                  OpsEquivalent(Pai386(p1)^.op1t, Pai386(p1)^.op1, Pai386(p2)^.op1, RegInfo) And
                  OpsEquivalent(Pai386(p1)^.op2t, Pai386(p1)^.op2, Pai386(p2)^.op2, RegInfo)
                  OpsEquivalent(Pai386(p1)^.op2t, Pai386(p1)^.op2, Pai386(p2)^.op2, RegInfo)
-            Else InstructionsEquivalent := False
           End
           End
       Else
       Else
  {an instruction <> mov, movzx, movsx}
  {an instruction <> mov, movzx, movsx}
@@ -2000,7 +2007,14 @@ End.
 
 
 {
 {
  $Log$
  $Log$
- Revision 1.21  1998-11-02 23:17:49  jonas
+ Revision 1.22  1998-11-09 19:33:40  jonas
+   * changed specific bugfix (which was actually wrong implemented, but did the
+     right thing in most cases nevertheless) to general bugfix
+   * fixed bug that caused
+     mov (ebp), edx                                    mov (ebp), edx
+     mov (edx), edx
+
+ Revision 1.21  1998/11/02 23:17:49  jonas
    * fixed bug shown in sortbug program from fpc-devel list
    * fixed bug shown in sortbug program from fpc-devel list
 
 
  Revision 1.20  1998/10/22 13:24:51  jonas
  Revision 1.20  1998/10/22 13:24:51  jonas