+ FindRegAllocBackward

* search reg. allocations backward in RemoveSuperfluousMove because the changed instruction could be the first one in a list

git-svn-id: trunk@25289 -
This commit is contained in:
florian 2013-08-18 18:56:56 +00:00
parent bca6dafbc5
commit 2806947a8f
2 changed files with 40 additions and 4 deletions

View File

@ -289,13 +289,23 @@ Unit AoptObj;
{ returns true if the operands o1 and o2 are completely equal }
Function OpsEqual(const o1,o2:toper): Boolean;
{ Returns the next ait_alloc object with ratype ra_dealloc for
{ Returns the next ait_alloc object with ratype ra_alloc for
Reg is found in the block
of Tai's starting with StartPai and ending with the next "real"
instruction. If none is found, it returns
nil }
nil
}
Function FindRegAlloc(Reg: TRegister; StartPai: Tai): tai_regalloc;
{ Returns the last ait_alloc object with ratype ra_alloc for
Reg is found in the block
of Tai's starting with StartPai and ending with the next "real"
instruction. If none is found, it returns
nil
}
Function FindRegAllocBackward(Reg : TRegister; StartPai : Tai) : tai_regalloc;
{ Returns the next ait_alloc object with ratype ra_dealloc
for Reg which is found in the block of Tai's starting with StartPai
and ending with the next "real" instruction. If none is found, it returns
@ -1048,6 +1058,33 @@ Unit AoptObj;
End;
Function TAOptObj.FindRegAllocBackward(Reg: TRegister; StartPai: Tai): tai_regalloc;
Begin
Result:=nil;
Repeat
While Assigned(StartPai) And
((StartPai.typ in (SkipInstr - [ait_regAlloc])) Or
((StartPai.typ = ait_label) and
Not(Tai_Label(StartPai).labsym.Is_Used))) Do
StartPai := Tai(StartPai.Previous);
If Assigned(StartPai) And
(StartPai.typ = ait_regAlloc) Then
Begin
if (tai_regalloc(StartPai).ratype=ra_alloc) and
(getregtype(tai_regalloc(StartPai).Reg) = getregtype(Reg)) and
(getsupreg(tai_regalloc(StartPai).Reg) = getsupreg(Reg)) then
begin
Result:=tai_regalloc(StartPai);
exit;
end;
StartPai := Tai(StartPai.Previous);
End
else
exit;
Until false;
End;
function TAOptObj.FindRegDeAlloc(Reg: TRegister; StartPai: Tai): tai_regalloc;
Begin
Result:=nil;

View File

@ -375,9 +375,8 @@ Implementation
{ taicpu(p).oper[0]^.reg is not used anymore, try to find its allocation
and remove it if possible }
GetLastInstruction(p,hp1);
asml.Remove(dealloc);
alloc:=FindRegAlloc(taicpu(p).oper[0]^.reg,tai(hp1.Next));
alloc:=FindRegAllocBackward(taicpu(p).oper[0]^.reg,tai(p.previous));
if assigned(alloc) then
begin
asml.Remove(alloc);