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

View File

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

View File

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