|
@@ -170,6 +170,7 @@ unit rgobj;
|
|
const r:Tsuperregisterset;
|
|
const r:Tsuperregisterset;
|
|
const spilltemplist:Tspill_temp_list): boolean;virtual;
|
|
const spilltemplist:Tspill_temp_list): boolean;virtual;
|
|
private
|
|
private
|
|
|
|
+ do_extend_live_range_backwards: boolean;
|
|
{# First imaginary register.}
|
|
{# First imaginary register.}
|
|
first_imaginary : Tsuperregister;
|
|
first_imaginary : Tsuperregister;
|
|
{# Highest register allocated until now.}
|
|
{# Highest register allocated until now.}
|
|
@@ -191,6 +192,9 @@ unit rgobj;
|
|
frozen_moves,
|
|
frozen_moves,
|
|
coalesced_moves,
|
|
coalesced_moves,
|
|
constrained_moves : Tlinkedlist;
|
|
constrained_moves : Tlinkedlist;
|
|
|
|
+ extended_backwards,
|
|
|
|
+ backwards_was_first : tsuperregisterset;
|
|
|
|
+
|
|
{$ifdef EXTDEBUG}
|
|
{$ifdef EXTDEBUG}
|
|
procedure writegraph(loopidx:longint);
|
|
procedure writegraph(loopidx:longint);
|
|
{$endif EXTDEBUG}
|
|
{$endif EXTDEBUG}
|
|
@@ -227,6 +231,9 @@ unit rgobj;
|
|
procedure select_spill;
|
|
procedure select_spill;
|
|
procedure assign_colours;
|
|
procedure assign_colours;
|
|
procedure clear_interferences(u:Tsuperregister);
|
|
procedure clear_interferences(u:Tsuperregister);
|
|
|
|
+ procedure set_live_range_backwards(b: boolean);
|
|
|
|
+ public
|
|
|
|
+ property extend_live_range_backwards: boolean read do_extend_live_range_backwards write set_live_range_backwards;
|
|
end;
|
|
end;
|
|
|
|
|
|
const
|
|
const
|
|
@@ -358,6 +365,7 @@ unit rgobj;
|
|
{ empty super register sets can cause very strange problems }
|
|
{ empty super register sets can cause very strange problems }
|
|
if high(Ausable)=0 then
|
|
if high(Ausable)=0 then
|
|
internalerror(200210181);
|
|
internalerror(200210181);
|
|
|
|
+ extend_live_range_backwards := false;
|
|
first_imaginary:=Afirst_imaginary;
|
|
first_imaginary:=Afirst_imaginary;
|
|
maxreg:=Afirst_imaginary;
|
|
maxreg:=Afirst_imaginary;
|
|
regtype:=Aregtype;
|
|
regtype:=Aregtype;
|
|
@@ -662,6 +670,20 @@ unit rgobj;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure trgobj.set_live_range_backwards(b: boolean);
|
|
|
|
+ begin
|
|
|
|
+ if (b) then
|
|
|
|
+ begin
|
|
|
|
+ { new registers may be allocated }
|
|
|
|
+ supregset_reset(extended_backwards,false,high(tsuperregister));
|
|
|
|
+ supregset_reset(backwards_was_first,false,high(tsuperregister));
|
|
|
|
+ do_extend_live_range_backwards := true;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ do_extend_live_range_backwards := false;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure trgobj.add_reg_instruction(instr:Tai;r:tregister);
|
|
procedure trgobj.add_reg_instruction(instr:Tai;r:tregister);
|
|
var
|
|
var
|
|
supreg : tsuperregister;
|
|
supreg : tsuperregister;
|
|
@@ -674,9 +696,30 @@ unit rgobj;
|
|
if supreg>=first_imaginary then
|
|
if supreg>=first_imaginary then
|
|
with reginfo[supreg] do
|
|
with reginfo[supreg] do
|
|
begin
|
|
begin
|
|
- if not assigned(live_start) then
|
|
|
|
- live_start:=instr;
|
|
|
|
- live_end:=instr;
|
|
|
|
|
|
+ if not(extend_live_range_backwards) then
|
|
|
|
+ begin
|
|
|
|
+ if not assigned(live_start) then
|
|
|
|
+ live_start:=instr;
|
|
|
|
+ live_end:=instr;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ if not supregset_in(extended_backwards,supreg) then
|
|
|
|
+ begin
|
|
|
|
+ supregset_include(extended_backwards,supreg);
|
|
|
|
+ live_start := instr;
|
|
|
|
+ if not assigned(live_end) then
|
|
|
|
+ begin
|
|
|
|
+ supregset_include(backwards_was_first,supreg);
|
|
|
|
+ live_end := instr;
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ if supregset_in(backwards_was_first,supreg) then
|
|
|
|
+ live_end := instr;
|
|
|
|
+ end
|
|
|
|
+ end
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|