Browse Source

m68k: attempt to make MOVE+OP+MOVE optmization more robust. this fixes random exceptions in tfmtbcd test among others

git-svn-id: trunk@36480 -
Károly Balogh 8 năm trước cách đây
mục cha
commit
40fb45aef6
1 tập tin đã thay đổi với 27 bổ sung16 xóa
  1. 27 16
      compiler/m68k/aoptcpu.pas

+ 27 - 16
compiler/m68k/aoptcpu.pas

@@ -135,6 +135,7 @@ unit aoptcpu;
     var
       next, next2: tai;
       opstr: string[15];
+      TmpUsedRegs : TAllUsedRegs;
     begin
       result:=false;
 
@@ -145,8 +146,11 @@ unit aoptcpu;
          (taicpu(p).oper[1]^.typ = top_reg) and
          MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[0]^) then
         begin
+          CopyUsedRegs(TmpUsedRegs);
+          UpdateUsedRegs(TmpUsedRegs, tai(next));
+
           if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[1]^)) and
-             RegEndOfLife(taicpu(next).oper[0]^.reg, taicpu(next)) then
+             not(RegUsedAfterInstruction(taicpu(next).oper[0]^.reg,next,TmpUsedRegs)) then
             begin
               opstr:=opname(p);
               case taicpu(p).oper[0]^.typ of
@@ -195,6 +199,7 @@ unit aoptcpu;
                   end;
               end;
             end;
+          ReleaseUsedRegs(TmpUsedRegs);
           exit;
         end;
 
@@ -216,24 +221,30 @@ unit aoptcpu;
           opstr:=opname(p);
 
           if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next2).oper[1]^)) and
-             not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[0]^)) and
-             RegEndOfLife(taicpu(p).oper[0]^.reg, taicpu(next2)) then
+             not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[0]^)) then
             begin
-              {  move %reg0, %tmpreg
-                 op   ???, %tmpreg
-                 move %tmpreg, %reg0
-                 to:
-                 op   ???, %reg0 }
-              if MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[taicpu(next).ops-1]^) then
+              CopyUsedRegs(TmpUsedRegs);
+              UpdateUsedRegs(TmpUsedRegs, tai(next));
+              UpdateUsedRegs(TmpUsedRegs, tai(next2));
+              if not(RegUsedAfterInstruction(taicpu(p).oper[1]^.reg,next2,TmpUsedRegs)) then
                 begin
-                  DebugMsg('Optimizer: '+opstr+' + OP + '+opstr+' to OP #1',next);
-                  taicpu(next).loadOper(taicpu(next).ops-1,taicpu(p).oper[0]^);
-                  asml.remove(p);
-                  asml.remove(next2);
-                  p.free;
-                  next2.free;
-                  result:=true;
+                  {  move %reg0, %tmpreg
+                     op   ???, %tmpreg
+                     move %tmpreg, %reg0
+                     to:
+                     op   ???, %reg0 }
+                  if MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[taicpu(next).ops-1]^) then
+                    begin
+                      DebugMsg('Optimizer: '+opstr+' + OP + '+opstr+' to OP #1',next);
+                      taicpu(next).loadOper(taicpu(next).ops-1,taicpu(p).oper[0]^);
+                      asml.remove(p);
+                      asml.remove(next2);
+                      p.free;
+                      next2.free;
+                      result:=true;
+                    end;
                 end;
+              ReleaseUsedRegs(TmpUsedRegs);
             end;
         end;
     end;