Баг в оптимизаторе?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Баг в оптимизаторе?

Сообщение Mirage » 10.04.2008 18:46:56

Недавно были очередные дебаты Delphi vs C++, в результате которых был создан бенчмарк, измеряющий скорость FPU-кода.
Как ни странно, от этого получилась польза, в виде следующего куска кода, стабильно глючащего в FPC, если включена оптимизация выше второго уровня.
По идее Digest должен быть равен 80 по окончании, однако с оптимизацией это не так - получается какое-то левое, увеличивающееся (вместе с текущим временем?) от запуска к запуску число.
Засабмитил баг:
http://bugs.freepascal.org/view.php?id=11053
Однако фиксить не спешат. Может в более новых версиях FPC его нет? Или проявляется только под виндой?
Мне особенно интересно, потому как мой проект тоже глючит, будучи собранным с оптимизациями выше второго уровня.

Просьба потестировать данный код:

Код: Выделить всё
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

const height = 1;
      width = 1;

var pix: array [0..height-1,0..width-1] of Integer;

procedure Main;
var
    dx, dy: Integer;
    Color, digest: cardinal;
    cx, cy, zx, zy: Double;
    time: Integer;
    scale: Double;
    deep: Integer;

begin
  FillChar(pix, SizeOf(pix), $f0);
        scale := 0.05;
        deep := 30;
        Digest := 0;

  time := GetTickCount();

      for dy := 0 to height -1 do
      begin
        cy := (dy - height / 2) * scale;
        for dx := 0 to width - 1 do
        begin
          color := 0;
          cx := (dx - width / 2) * scale;

          zx := cx;
          zy := cy;

          while zx * zx + zy * zy < 1 do
          begin
            zx := zx * zx - zy * zy + cx;
            zy := 2 * zx * zy + cy;
            Inc( color );
            if color > Cardinal(deep) then break;
          end;
          pix[ dy, dx ] := color;
        end;
      end;

  pix[ 0, 0 ] := 80;

  time := GetTickCount() - time;

  Digest := 0;
  for dy := 0 to height -1 do for dx := 0 to width - 1 do Digest := Digest + pix[dy, dx];

  WriteLn( time,
          ' ', digest // should be 80
          );

  Readln;
end;
begin
  Main;
end.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение alexs » 10.04.2008 19:36:24

Какие конкретно ключи использовал? Я попробовал - вроде похоже (в алгоритм особо не вникал)
Вот вывод - проверял в WinXP SP2
Код: Выделить всё
C:\!\a1>fpc -O3 Project1.pas
Hint: End of reading config file C:\Lazarus\pp\bin\i386-win32\fpc.cfg
Free Pascal Compiler version 2.3.1 [2008/04/10] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Win32 for i386
Compiling Project1.pas
Project1.pas(57,76) Warning: Mixing signed expressions and longwords gives a 64bit result
Linking Project1.exe
66 lines compiled, 0.2 sec, 26000 bytes code, 1448 bytes data
1 warning(s) issued
2 hint(s) issued

C:\!\a1>Project1.exe
0 80
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Mirage » 10.04.2008 21:17:29

В FPC.cfg:
-O2
-MDelphi
этого достаточно.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение alexs » 10.04.2008 21:49:43

нормальн всё
пробовал указанные параметр в комнадной строке и в файле fpc.cfg - результат тот, что ожидается
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Mirage » 10.04.2008 22:20:51

Значит в 2.3.1 бага уже нет. Этo хорошо.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение bw » 11.04.2008 06:19:50

Linux 2.6.24.4, FPC 2.2.0, с указанными ключами, а так же с ключом O3, проблем не возникает. Результат всегда равен 80. (Для компиляции под линухом я убрал модуль Windows и не трогал GetTickCount).

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Mirage » 11.04.2008 08:58:51

Ох... Я не написал версию FPC, которая глючит - 2.2.0.
На совершенно разных машинах, с Win2K и WinXP SP2.
О том, что глюк проявляется только в режиме совместимости с Delphi я узнал только вчера.:)
GetTickCount убирать нельзя и даже бессмысленный двойной цикл нельзя - глюк пропадает. Вообще судя по выдаваемым значениям неверное значение от GetTickCount и берется.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение alexs » 11.04.2008 09:06:34

Я твой код не правил :-).
Вывод - обновляй версию FPC.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Mirage » 11.04.2008 10:08:24

Кстати, где взять 2.3.1? Как-то через SVN? А прямо никак?
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение Alexx2000 » 11.04.2008 12:39:50

Еще можно скачать Snapshot отсюда http://www.freepascal.org/develop.var
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 489
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение Vadim » 11.04.2008 15:46:30

Mirage
Проверил на FPC 2.2 WinXP SP2 с -О2 -MDelphi.
Тоже бага никакого нет, выходит 0 80.
Вывод. Похоже ты нам не обо всём рассказал... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение *vmr » 11.04.2008 15:57:39

Mirage
Напиши пожалуйста полностью командную строку со всеми параметрами
Хорошо б было если б ты скинул асм-листинг глючной проги и экзешник в придачу
Будем сверять с листингами "не глючащих" прог, и разными версиями компиляторов :)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Сообщение Mirage » 11.04.2008 16:40:03

Странно...
Вообще потер локальный fpc.cfg - начал писать:
"Project1.dpr(57,76) Warning: Mixing signed expressions and longwords gives a 64bit result"
Уже лучше, но результат неверный.
Командная строка:
Z:\FPC\2.2.0\bin\i386-win32\fpc -O2 -MDelphi Project1.dpr

Исходник, экзешник, асм, bat для запуска и дефолтный (вроде туда руками не лазил) fpc.cfg можно взять тут:
http://casteng.com/temp/fpc.zip
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение Vadim » 11.04.2008 18:16:04

Mirage
Да, что-то подозрительно. Откомпилировал Project1 твоим батником, выдаёт как и ожидалось - 0 80, сколько бы раз ни запускал. А вот экзешник в архиве выдаёт разные результаты.
Давай разберёмся с компилятором. По какой ссылке его скачивал?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Mirage » 11.04.2008 18:33:45

С сайта freepascal.org. Они что, разные бывают?
Мой выдает при запуске:
Free Pascal Compiler version 2.2.0 [2007/09/09] for i386

Скачал новый - fpcbuild.zip, но там есть все, кроме fpc.exe. Видимо, надо собирать.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru