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,
                     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;