* Moved spilling of registers which have the initial memory location and are used only once to a stage after coalescing is done. This produces a better code.

git-svn-id: trunk@46836 -
This commit is contained in:
yury 2020-09-11 13:32:18 +00:00
parent c06744b62b
commit b5abefe03e

View File

@ -641,17 +641,10 @@ unit rgobj;
i8086 where indexed memory access instructions allow only i8086 where indexed memory access instructions allow only
few registers as arguments and additionally the calling convention few registers as arguments and additionally the calling convention
provides no general purpose volatile registers. provides no general purpose volatile registers.
Also spill registers which have the initial memory location
and are used only once. This allows to access the memory location
directly, without preloading it to a register.
} }
for i:=first_imaginary to maxreg-1 do for i:=first_imaginary to maxreg-1 do
with reginfo[i] do with reginfo[i] do
if (real_reg_interferences>=usable_registers_cnt) or if real_reg_interferences>=usable_registers_cnt then
{ also spill registers which have the initial memory location
and are used only once }
((ri_has_initial_loc in flags) and (weight<=200)) then
spillednodes.add(i); spillednodes.add(i);
if spillednodes.length<>0 then if spillednodes.length<>0 then
begin begin
@ -1706,6 +1699,15 @@ unit rgobj;
for i:=selectstack.length downto 1 do for i:=selectstack.length downto 1 do
begin begin
n:=selectstack.buf^[i-1]; n:=selectstack.buf^[i-1];
{ Always spill the register if it has the initial memory location
and is used only once (weight<=200). This allows to access the
memory location directly, without preloading it to a register. }
with reginfo[n] do
if (ri_has_initial_loc in flags) and (weight<=200) then
begin
spillednodes.add(n);
continue;
end;
{Create a list of colours that we cannot assign to n.} {Create a list of colours that we cannot assign to n.}
adj_colours:=[]; adj_colours:=[];
adj:=reginfo[n].adjlist; adj:=reginfo[n].adjlist;