mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 13:59:28 +02:00
+ 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:
parent
bca6dafbc5
commit
2806947a8f
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user