* changed backwards_was_first and extended_backwards from supregsets into

tbitsets so that they can grow as necessary and so that we don't have
    to fill the entire 8KiB all the time

git-svn-id: trunk@15604 -
This commit is contained in:
Jonas Maebe 2010-07-18 22:00:55 +00:00
parent c072eb5a34
commit b475d03612

View File

@ -199,7 +199,7 @@ unit rgobj;
coalesced_moves, coalesced_moves,
constrained_moves : Tlinkedlist; constrained_moves : Tlinkedlist;
extended_backwards, extended_backwards,
backwards_was_first : tsuperregisterset; backwards_was_first : tbitset;
{$ifdef EXTDEBUG} {$ifdef EXTDEBUG}
procedure writegraph(loopidx:longint); procedure writegraph(loopidx:longint);
@ -372,9 +372,6 @@ unit rgobj;
if high(Ausable)=-1 then if high(Ausable)=-1 then
internalerror(200210181); internalerror(200210181);
live_range_direction:=rad_forward; live_range_direction:=rad_forward;
// initialised by newinstance
// supregset_reset(extended_backwards,false,high(tsuperregister));
// supregset_reset(backwards_was_first,false,high(tsuperregister));
first_imaginary:=Afirst_imaginary; first_imaginary:=Afirst_imaginary;
maxreg:=Afirst_imaginary; maxreg:=Afirst_imaginary;
regtype:=Aregtype; regtype:=Aregtype;
@ -420,6 +417,8 @@ unit rgobj;
live_registers.done; live_registers.done;
worklist_moves.free; worklist_moves.free;
dispose_reginfo; dispose_reginfo;
extended_backwards.free;
backwards_was_first.free;
end; end;
procedure Trgobj.dispose_reginfo; procedure Trgobj.dispose_reginfo;
@ -689,11 +688,19 @@ unit rgobj;
begin begin
if (dir in [rad_backwards,rad_backwards_reinit]) then if (dir in [rad_backwards,rad_backwards_reinit]) then
begin begin
if (dir=rad_backwards_reinit) then if not assigned(extended_backwards) then
supregset_reset(extended_backwards,false,high(tsuperregister)); begin
{ create expects a "size", not a "max bit" parameter -> +1 }
backwards_was_first:=tbitset.create(maxreg+1);
extended_backwards:=tbitset.create(maxreg+1);
end
else
begin
if (dir=rad_backwards_reinit) then
extended_backwards.clear;
backwards_was_first.clear;
end;
int_live_range_direction:=rad_backwards; int_live_range_direction:=rad_backwards;
{ new registers may be allocated }
supregset_reset(backwards_was_first,false,high(tsuperregister));
end end
else else
int_live_range_direction:=rad_forward; int_live_range_direction:=rad_forward;
@ -723,19 +730,19 @@ unit rgobj;
end end
else else
begin begin
if not supregset_in(extended_backwards,supreg) then if not extended_backwards.isset(supreg) then
begin begin
supregset_include(extended_backwards,supreg); extended_backwards.include(supreg);
live_start := instr; live_start := instr;
if not assigned(live_end) then if not assigned(live_end) then
begin begin
supregset_include(backwards_was_first,supreg); backwards_was_first.include(supreg);
live_end := instr; live_end := instr;
end; end;
end end
else else
begin begin
if supregset_in(backwards_was_first,supreg) then if backwards_was_first.isset(supreg) then
live_end := instr; live_end := instr;
end end
end end