* patch by J. Gareth Moreton: handle register allocations correctly in MovMov2Mov 3, resolves #38703

git-svn-id: trunk@49128 -
(cherry picked from commit 503fc85dff)
This commit is contained in:
florian 2021-04-06 15:50:28 +00:00
parent 6d97cff2e3
commit c565900c41
2 changed files with 57 additions and 0 deletions

View File

@ -1362,6 +1362,7 @@ unit aoptx86;
mov mem, %reg"
}
AllocRegBetween(taicpu(hp1).oper[1]^.reg,p,hp1,usedregs);
taicpu(p).loadoper(1,taicpu(hp1).oper[1]^);
DebugMsg(SPeepholeOptimization + 'MovMov2Mov 3 done',p);
asml.remove(hp1);

56
tests/webtbs/tw38703.pp Normal file
View File

@ -0,0 +1,56 @@
{ %opt=-O4 }
{$mode objfpc}
{$R+}
program project1;
const
MaxLoopDepth = 4;
type
TES = record
LoopDepth: Integer;
Sums: array [1..MaxLoopDepth] of Double;
end;
PES = ^TES;
TE = class
ThreadStates: array of PES;
end;
TSF = class
public
function NI(Evaluator: TE; var a:array of Double): Double; virtual;
end;
var
E: TE;
ES: TES;
D: Double;
SF: TSF;
threadvar
ThreadIndex: Integer;
function TSF.NI(Evaluator: TE; var a: array of Double): Double;
begin
with Evaluator.ThreadStates[ThreadIndex-1]^ do begin
Sums[LoopDepth] := Sums[LoopDepth] + a[0];
Result := Sums[LoopDepth];
end;
end;
begin
ThreadIndex := 2;
SF := TSF.Create;
E := TE.Create;
SetLength(E.ThreadStates,2);
E.ThreadStates[1] := @ES;
ES.LoopDepth := 1;
ES.Sums[1] := 0;
D := 27;
SF.NI(E, D);
SF.NI(E, D);
WriteLn(ES.Sums[1]); { should write 54 }
if (ES.Sums[1]<53.999) or (ES.Sums[1]>54.001) then
halt(1);
writeln('ok');
end.