Bläddra i källkod

* avoid overflow during register allocation

git-svn-id: trunk@49285 -
florian 4 år sedan
förälder
incheckning
837b433abc
1 ändrade filer med 8 tillägg och 4 borttagningar
  1. 8 4
      compiler/rgobj.pas

+ 8 - 4
compiler/rgobj.pas

@@ -2846,8 +2846,10 @@ unit rgobj;
                     set weigth of the newly allocated register higher than the old one,
                     set weigth of the newly allocated register higher than the old one,
                     so it will selected for spilling with a lower priority than
                     so it will selected for spilling with a lower priority than
                     the original one, this prevents an endless spilling loop if orgreg
                     the original one, this prevents an endless spilling loop if orgreg
-                    is short living, see e.g. tw25164.pp }
-                  add_reg_instruction(instr,loadreg,reginfo[orgreg].weight+1);
+                    is short living, see e.g. tw25164.pp
+
+                    the min trick is needed to avoid an overflow in case weight=high(weight which might happen }
+                  add_reg_instruction(instr,loadreg,min(high(reginfo[orgreg].weight)-1,reginfo[orgreg].weight)+1);
                   ungetregisterinline(list,loadreg);
                   ungetregisterinline(list,loadreg);
                 end;
                 end;
             end;
             end;
@@ -2878,8 +2880,10 @@ unit rgobj;
                     set weigth of the newly allocated register higher than the old one,
                     set weigth of the newly allocated register higher than the old one,
                     so it will selected for spilling with a lower priority than
                     so it will selected for spilling with a lower priority than
                     the original one, this prevents an endless spilling loop if orgreg
                     the original one, this prevents an endless spilling loop if orgreg
-                    is short living, see e.g. tw25164.pp }
-                  add_reg_instruction(instr,storereg,reginfo[orgreg].weight+1);
+                    is short living, see e.g. tw25164.pp
+
+                    the min trick is needed to avoid an overflow in case weight=high(weight which might happen }
+                  add_reg_instruction(instr,storereg,min(high(reginfo[orgreg].weight)-1,reginfo[orgreg].weight)+1);
                 end;
                 end;
             end;
             end;