+ testcse2

This commit is contained in:
Jonas Maebe 2000-04-29 16:58:43 +00:00
parent 6e83066171
commit 6e996c65e5
2 changed files with 74 additions and 1 deletions

View File

@ -4,4 +4,5 @@ Register variables:
Readln ................................ testreg2.pp Readln ................................ testreg2.pp
Range checking ........................ testreg3.pp Range checking ........................ testreg3.pp
Common subexpression elimination (assembler) Common subexpression elimination (assembler)
Multidimensional array index operation. testcse1.pp Multidimensional array index operation. testcse1.pp
CSE and range checking ................ testcse2.pp

72
tests/testopt/testcse2.pp Normal file
View File

@ -0,0 +1,72 @@
{ $OPT=-OG2}
{$r+}
type
tsubr = 1..100000;
tarr = array[1..10] of longint;
function test(b: tsubr): longint;
begin
test := b;
end;
var
p: ^longint;
l: longint;
a, a2: tarr;
begin
getmem(p,4);
p^ := 100000;
l := 5;
{ clear the optimizer state }
asm
end;
{$r-}
{ get p^ in eax, the following statement generates the code }
{ movl A,%eax }
{ movl (%eax),%eax }
a[p^] := l;
{$r+}
{ now, p^ gets rangechecked, this generates the code }
{ movl A,%eax (1) }
{ movl (%eax),%ecx (1) }
{ ... }
{ call rangecheck_procedure }
{ pushl (%eax) }
{ }
{ With the bug in the optimizer, the instructions marked with (1) are }
{ replaced by }
{ movl %eax,%ecx }
{ }
{ and as such the "pushl (%eax)" pushes a wrong value afterwards }
l := test(p^);
if l <> 100000 then
begin
writeln('Problem 1!');
halt(1);
end;
p^ := 5;
l := 5;
{ clear the optimizer state }
asm
end;
{$r-}
{ the following moves p^ in %edx }
a2[l] := a[p^];
{$r+}
{ same test as before, but now the original value comes from edx }
{ instead of that it is already in eax (so check that it doesn't }
{ replace the }
{ movl P,%eax }
{ movl (%eax),%ecx }
{ with }
{ movl %edx,%ecx }
l := test(p^);
if l <> 5 then
begin
writeln('Problem 2!');
halt(1);
end;
freemem(p,4);
end.