+ added tests that check side effect removal behaviour for the simplifications

added/changed today

git-svn-id: trunk@36053 -
This commit is contained in:
nickysn 2017-05-01 21:01:26 +00:00
parent 7821d729cd
commit 881cb790a9
3 changed files with 299 additions and 0 deletions

2
.gitattributes vendored
View File

@ -11144,6 +11144,8 @@ tests/tbs/tb0624.pp svneol=native#text/pascal
tests/tbs/tb0625.pp svneol=native#text/pascal
tests/tbs/tb0626.pp svneol=native#text/pascal
tests/tbs/tb0627.pp svneol=native#text/pascal
tests/tbs/tb0627a.pp svneol=native#text/pascal
tests/tbs/tb0627b.pp svneol=native#text/pascal
tests/tbs/tb205.pp svneol=native#text/plain
tests/tbs/tb610.pp svneol=native#text/pascal
tests/tbs/tb613.pp svneol=native#text/plain

134
tests/tbs/tb0627a.pp Normal file
View File

@ -0,0 +1,134 @@
{ %OPT=-O3 }
program tb0627a;
{ tests for correctness various simplifications, done by the compiler }
{ this test checks that these simplifications aren't done at -O3 level
or less, when they will remove an expression that has side effects }
{$mode objfpc}
var
SideEffectsHappened: Boolean = False;
function s32_SideEffects: LongInt;
begin
SideEffectsHappened := True;
Result := LongInt(Random($ffffffff));
end;
function u8_SideEffects: Byte;
begin
SideEffectsHappened := True;
Result := Random(256);
end;
procedure CheckSideEffectsHappened;
begin
if not SideEffectsHappened then
begin
Writeln('Error! Side effects were removed!');
Halt(1);
end;
SideEffectsHappened := False;
end;
procedure Check(i64, expected_value: Int64);
begin
if i64<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure Check(qw, expected_value: QWord);
begin
if qw<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure Check(b, expected_value: Boolean);
begin
if b<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure NoCheck(i64, expected_value: Int64);
begin
if i64<>expected_value then
Write('.')
else
Write(',');
end;
procedure NoCheck(qw, expected_value: QWord);
begin
if qw<>expected_value then
Write('.')
else
Write(',');
end;
procedure NoCheck(b, expected_value: Boolean);
begin
if b<>expected_value then
Write('.')
else
Write(',');
end;
var
I: Integer;
begin
for I := 1 to 100 do
begin
{ many of these are now optimized at various -O settings }
NoCheck(s32_SideEffects-s32_SideEffects,0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects xor s32_SideEffects,0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects>=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<>s32_SideEffects, False); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<s32_SideEffects, False); CheckSideEffectsHappened;
NoCheck(s32_SideEffects>s32_SideEffects, False); CheckSideEffectsHappened;
NoCheck(0*s32_SideEffects, 0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects*0, 0); CheckSideEffectsHappened;
NoCheck(0 and s32_SideEffects, 0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects and 0, 0); CheckSideEffectsHappened;
NoCheck(0 shr s32_SideEffects, 0); CheckSideEffectsHappened;
NoCheck(0 shl s32_SideEffects, 0); CheckSideEffectsHappened;
NoCheck(SarShortInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(SarShortInt(ShortInt($ff), u8_SideEffects), -1); CheckSideEffectsHappened;
NoCheck(SarSmallInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(SarSmallInt(SmallInt($ffff), u8_SideEffects), -1); CheckSideEffectsHappened;
NoCheck(SarLongInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(SarLongInt(LongInt($ffffffff), u8_SideEffects), -1); CheckSideEffectsHappened;
NoCheck(SarInt64(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(SarInt64(Int64($ffffffffffffffff), u8_SideEffects), -1); CheckSideEffectsHappened;
NoCheck(RorByte(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RolByte(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RorWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RolWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RorDWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RolDWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RorQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RolQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
NoCheck(RorByte($ff, u8_SideEffects), $ff); CheckSideEffectsHappened;
NoCheck(RolByte($ff, u8_SideEffects), $ff); CheckSideEffectsHappened;
NoCheck(RorWord($ffff, u8_SideEffects), $ffff); CheckSideEffectsHappened;
NoCheck(RolWord($ffff, u8_SideEffects), $ffff); CheckSideEffectsHappened;
NoCheck(RorDWord($ffffffff, u8_SideEffects), $ffffffff); CheckSideEffectsHappened;
NoCheck(RolDWord($ffffffff, u8_SideEffects), $ffffffff); CheckSideEffectsHappened;
NoCheck(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
NoCheck(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
end;
Writeln('Ok!');
end.

163
tests/tbs/tb0627b.pp Normal file
View File

@ -0,0 +1,163 @@
{ %OPT=-O4 }
program tb0627b;
{ tests for correctness various simplifications, done by the compiler }
{ we allow some expressions with side effects to be removed at the -O4
optimization level, but we still disallow removing them for some of
the simplificationss. This test checks that behaviour. }
{$mode objfpc}
{$ifdef CPU64}
{$define CPU_HAS_INLINE_ROX_QWORD}
{$endif}
var
SideEffectsHappened: Boolean = False;
function s32_SideEffects: LongInt;
begin
SideEffectsHappened := True;
Result := LongInt(Random($ffffffff));
end;
function u8_SideEffects: Byte;
begin
SideEffectsHappened := True;
Result := Random(256);
end;
procedure CheckSideEffectsHappened;
begin
if not SideEffectsHappened then
begin
Writeln('Error! Side effects were removed!');
Halt(1);
end;
SideEffectsHappened := False;
end;
procedure CheckNoSideEffectsHappened;
begin
if SideEffectsHappened then
begin
Writeln('Error! Side effects were expected to be removed, by they were not!');
Halt(1);
end;
SideEffectsHappened := False;
end;
procedure Check(i64, expected_value: Int64);
begin
if i64<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure Check(qw, expected_value: QWord);
begin
if qw<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure Check(b, expected_value: Boolean);
begin
if b<>expected_value then
begin
Writeln('Error!');
Halt(1);
end;
end;
procedure NoCheck(i64, expected_value: Int64);
begin
if i64<>expected_value then
Write('.')
else
Write(',');
end;
procedure NoCheck(qw, expected_value: QWord);
begin
if qw<>expected_value then
Write('.')
else
Write(',');
end;
procedure NoCheck(b, expected_value: Boolean);
begin
if b<>expected_value then
Write('.')
else
Write(',');
end;
var
I: Integer;
begin
for I := 1 to 100 do
begin
{ many of these are now optimized at various -O settings }
{ we don't remove side effects for these: }
NoCheck(s32_SideEffects-s32_SideEffects,0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects xor s32_SideEffects,0); CheckSideEffectsHappened;
NoCheck(s32_SideEffects=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects>=s32_SideEffects, True); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<>s32_SideEffects, False); CheckSideEffectsHappened;
NoCheck(s32_SideEffects<s32_SideEffects, False); CheckSideEffectsHappened;
NoCheck(s32_SideEffects>s32_SideEffects, False); CheckSideEffectsHappened;
{ we remove side effects for these: }
Check(0*s32_SideEffects, 0); CheckNoSideEffectsHappened;
Check(s32_SideEffects*0, 0); CheckNoSideEffectsHappened;
Check(0 and s32_SideEffects, 0); CheckNoSideEffectsHappened;
Check(s32_SideEffects and 0, 0); CheckNoSideEffectsHappened;
Check(0 shr s32_SideEffects, 0); CheckNoSideEffectsHappened;
Check(0 shl s32_SideEffects, 0); CheckNoSideEffectsHappened;
Check(SarShortInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(SarShortInt(ShortInt($ff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
Check(SarSmallInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(SarSmallInt(SmallInt($ffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
Check(SarLongInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(SarLongInt(LongInt($ffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
Check(SarInt64(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(SarInt64(Int64($ffffffffffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
Check(RorByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RolByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RorWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RolWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RorDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RolDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
{$ifdef CPU_HAS_INLINE_ROX_QWORD}
Check(RorQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
Check(RolQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
{$else CPU_HAS_INLINE_ROX_QWORD}
Check(RorQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
Check(RolQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
{$endif CPU_HAS_INLINE_ROX_QWORD}
Check(RorByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
Check(RolByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
Check(RorWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
Check(RolWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
Check(RorDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
Check(RolDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
{$ifdef CPU_HAS_INLINE_ROX_QWORD}
Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
{$else CPU_HAS_INLINE_ROX_QWORD}
Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
{$endif CPU_HAS_INLINE_ROX_QWORD}
end;
Writeln('Ok!');
end.