From 2806947a8f014eb45928154fd1a9042d6f191158 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 18 Aug 2013 18:56:56 +0000 Subject: [PATCH] + FindRegAllocBackward * search reg. allocations backward in RemoveSuperfluousMove because the changed instruction could be the first one in a list git-svn-id: trunk@25289 - --- compiler/aoptobj.pas | 41 ++++++++++++++++++++++++++++++++++++++-- compiler/arm/aoptcpu.pas | 3 +-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/compiler/aoptobj.pas b/compiler/aoptobj.pas index 4f78498501..664fc993d2 100644 --- a/compiler/aoptobj.pas +++ b/compiler/aoptobj.pas @@ -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; diff --git a/compiler/arm/aoptcpu.pas b/compiler/arm/aoptcpu.pas index c71a939d30..1dd0734037 100644 --- a/compiler/arm/aoptcpu.pas +++ b/compiler/arm/aoptcpu.pas @@ -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);