Browse Source

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

git-svn-id: trunk@36053 -

nickysn 8 years ago
parent
commit
881cb790a9
3 changed files with 299 additions and 0 deletions
  1. 2 0
      .gitattributes
  2. 134 0
      tests/tbs/tb0627a.pp
  3. 163 0
      tests/tbs/tb0627b.pp

+ 2 - 0
.gitattributes

@@ -11144,6 +11144,8 @@ tests/tbs/tb0624.pp svneol=native#text/pascal
 tests/tbs/tb0625.pp svneol=native#text/pascal
 tests/tbs/tb0625.pp svneol=native#text/pascal
 tests/tbs/tb0626.pp svneol=native#text/pascal
 tests/tbs/tb0626.pp svneol=native#text/pascal
 tests/tbs/tb0627.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/tb205.pp svneol=native#text/plain
 tests/tbs/tb610.pp svneol=native#text/pascal
 tests/tbs/tb610.pp svneol=native#text/pascal
 tests/tbs/tb613.pp svneol=native#text/plain
 tests/tbs/tb613.pp svneol=native#text/plain

+ 134 - 0
tests/tbs/tb0627a.pp

@@ -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 - 0
tests/tbs/tb0627b.pp

@@ -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.