Browse Source

* avoid overflow during register allocation

git-svn-id: trunk@49285 -
florian 4 years ago
parent
commit
837b433abc
1 changed files with 8 additions and 4 deletions
  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,
                     so it will selected for spilling with a lower priority than
                     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);
                 end;
             end;
@@ -2878,8 +2880,10 @@ unit rgobj;
                     set weigth of the newly allocated register higher than the old one,
                     so it will selected for spilling with a lower priority than
                     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;