* the arm rescheduler has not only to move instructions but also associated register allocations

git-svn-id: trunk@20707 -
This commit is contained in:
florian 2012-04-04 21:21:52 +00:00
parent 1f154028da
commit 9867f34398

View File

@ -52,7 +52,7 @@ Implementation
cutils,
verbose,
cgbase,cgutils,
aasmbase,aasmcpu;
aasmbase,aasmdata,aasmcpu;
function CanBeCond(p : tai) : boolean;
begin
@ -464,9 +464,11 @@ Implementation
{ TODO : schedule also forward }
{ TODO : schedule distance > 1 }
var
hp1,hp2 : tai;
hp1,hp2,hp3,hp4 : tai;
list : TAsmList;
begin
result:=true;
list:=TAsmList.Create;
p := BlockStart;
{ UsedRegs := []; }
while (p <> BlockEnd) Do
@ -516,16 +518,34 @@ Implementation
not(RegModifiedByInstruction(taicpu(hp1).oper[1]^.ref^.index,p))
) then
begin
hp3:=tai(p.Previous);
asml.Remove(p);
{ if there is a reg. dealloc instruction associated with p, move it together with p }
while assigned(hp3) and (hp3.typ<>ait_instruction) do
begin
if (hp3.typ=ait_regalloc) and (tai_regalloc(hp3).ratype in [ra_dealloc]) and
RegInInstruction(tai_regalloc(hp3).reg,p) then
begin
hp4:=hp3;
hp3:=tai(hp3.Previous);
asml.Remove(hp4);
list.Concat(hp4);
end
else
hp3:=tai(hp3.Previous);
end;
list.Concat(p);
asml.Remove(hp1);
{$ifdef DEBUG_PREREGSCHEDULER}
asml.InsertBefore(tai_comment.Create(strpnew('Rescheduled')),hp2);
{$endif DEBUG_PREREGSCHEDULER}
asml.InsertBefore(hp1,hp2);
asml.InsertBefore(p,hp2);
asml.InsertListBefore(hp2,list);
end;
p := tai(p.next)
end;
list.Free;
end;