Explorar el Código

+ tai_regalloc.keep to force register deallocations to be keep

git-svn-id: trunk@22187 -
florian hace 13 años
padre
commit
b6608e716b
Se han modificado 2 ficheros con 5 adiciones y 1 borrados
  1. 1 0
      compiler/aasmtai.pas
  2. 4 1
      compiler/aopt.pas

+ 1 - 0
compiler/aasmtai.pas

@@ -644,6 +644,7 @@ interface
        tai_regalloc = class(tai)
           reg     : tregister;
           ratype  : TRegAllocType;
+          keep    : boolean;
           { reg(de)alloc belongs to this instruction, this
             is only used for automatic inserted (de)alloc for
             imaginary register and required for spilling code }

+ 4 - 1
compiler/aopt.pas

@@ -25,6 +25,8 @@ Unit aopt;
 
 {$i fpcdefs.inc}
 
+{ $define DEBUG_OPTALLOC}
+
   Interface
 
     Uses
@@ -195,13 +197,14 @@ Unit aopt;
 {$endif DEBUG_OPTALLOC}
                             AsmL.Remove(p);
                             InsertLLItem(hp2, tai(hp2.Next), p);
+                            tai_regalloc(p).keep:=true;
 {$ifdef DEBUG_OPTALLOC}
                             AsmL.InsertAfter(tai_comment.Create(strpnew('Moved deallocation of '+std_regname(tai_regalloc(p).Reg)+' here')),hp2);
 {$endif DEBUG_OPTALLOC}
                             p := hp1;
                           End
                         else if findregalloc(tai_regalloc(p).reg, tai(p.next))
-                          and getnextinstruction(p,hp1) then
+                          and getnextinstruction(p,hp1) and not(tai_regalloc(p).keep) then
                           begin
                             hp1 := tai(p.previous);
 {$ifdef DEBUG_OPTALLOC}