mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 15:29:23 +02:00
* avoid overflows of execution weight
git-svn-id: trunk@39623 -
This commit is contained in:
parent
75251913b1
commit
ea32ddd5b2
@ -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
|
||||||
|
@ -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}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user