* avoid overflows of execution weight

git-svn-id: trunk@39623 -
This commit is contained in:
florian 2018-08-16 20:45:36 +00:00
parent 75251913b1
commit ea32ddd5b2
3 changed files with 33 additions and 5 deletions

View File

@ -42,9 +42,11 @@ interface
{# Returns the minimal value between @var(a) and @var(b) }
function min(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
function min(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
function min(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
{# Returns the maximum value between @var(a) and @var(b) }
function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
function max(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
{ These functions are intenionally put here and not in the constexp unit.
Since Tconstexprint may be automatically converted to int, which causes
@ -227,6 +229,18 @@ implementation
end;
function min(a,b : qword) : qword;
{
return the minimal of a and b
}
begin
if a<=b then
min:=a
else
min:=b;
end;
function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
{
return the maximum of a and b
@ -251,6 +265,18 @@ implementation
end;
function max(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
{
return the maximum of a and b
}
begin
if a>=b then
max:=a
else
max:=b;
end;
function max(const a,b : Tconstexprint) : Tconstexprint;{$ifdef USEINLINE}inline;{$endif}
{
return the maximum of a and b

View File

@ -58,9 +58,7 @@ procedure secondpass(p : tnode);
implementation
uses
{$ifdef EXTDEBUG}
cutils,
{$endif}
globtype,verbose,
globals,
aasmdata,
@ -194,7 +192,7 @@ implementation
current_settings.localswitches:=p.localswitches;
codegenerror:=false;
if assigned(p.optinfo) then
cg.executionweight:=p.optinfo^.executionweight
cg.executionweight:=min(p.optinfo^.executionweight,QWord(high(cg.executionweight)))
else
cg.executionweight:=100;
{$ifdef EXTDEBUG}

View File

@ -830,8 +830,12 @@ unit rgobj;
if supreg>=first_imaginary then
with reginfo[supreg] do
begin
// if aweight>weight then
inc(weight,aweight);
{ avoid overflow }
if high(weight)-aweight<weight then
weight:=high(weight)
else
inc(weight,aweight);
if (live_range_direction=rad_forward) then
begin
if not assigned(live_start) then