Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Починил ещё 8 тестов

Теперь падает 3. Учитывая, что починится минимум 4 теста, можно переходить на новый инлайнер в качестве основного.

Сэкономить проходы не удалось, пришлось пойти по пути четвёртого прохода.

Интересно будет посмотреть, как оно там выстроится в стройную систему в будущем, когда я таки пойму, как хуплом пользоваться композабельно.

Параллельно пришлось (основные строки по количеству - там) запилить корректный импорт фактов из предыдущего прохода в последующий, и корректную передаточную функцию.

Теперь надо разобраться с падающими тестами - теми, которые падают сейчас, но работают со старым инлайнером, и теми, которые помечены как падающие и не запускаются.

Затем почистить код, и если окажется, что инлайнер работает удовлетоворительно - можно подобраться к циклам while. Идея у меня их функционально энкодить, типа

whileF :: (a -> Bool) -> (a -> a) -> a
whileF cond body start = import_from_ffi
а в cишном коде генерить как
auto p = start;
while (cond(p))
{
   p = body(p);
};
return p;
Если cond и body инлайнить - получится весьма удовлетворительно на выходе. Cобственно, я об этом неоднократно писал, и для этого мне понадобился рабочий инлайнер. А сейчас этот инлайнер близок как никогда, пусть даже на полухаках.

Upd: по итогам починил 13 тестов, поломал 3. В падающих зато обнаружил ошибки кодогенерации С++. Я уж думал, что эту тему закрыл. Теряются куски замыканий. Причём бывает, что оптимизатор нормально отрабатывает, а кодогенератор генерит по правильному соптимизированному .hn левый .cpp. Ну, то есть, починил я новым оптимизатором больше, чем 13, но часть падает по другим причинам. Теперь надо бы проверить, не записан ли где-нибудь битый С++ в ожидаемых тестами корректных значениях. Одно время было легко это делать - поставил всё билдиться, MSVC сказал, что побито. Но сейчас там прогнило, хоть снова Забиватора проси.

14 тестов, помеченных как падающие, отличаются разнообразием способов падения:

isDigit, allDigits, allDigits-ho и allDigits-ho-1 лепят разные идентификаторы под одним именем в один скоуп (баг GraphDecompiler) и не инлайнят определения-синонимы, типа let foo = bar in baz foo foo. А чё, foo честно 2 раза используется, нафиг копипасту разводить? :) (отсутствие фичи оптимизатора)

euler1 и euler6-1 просто не инлайнят синонимы.

allDigits-ho-2 и hoand заходят в одну и ту же нереализованную ветку оптимизатора

comp-1 недоинлайнивает (но такое и не было предусмотрено - обратите внимание, как далеко х надо ехать):

ii = let h x = incr (incr 5) in h

вместо

ii x = incr (incr 5)

euler48 теряет узлы. Переменная есть, а её определение утеряно.

euler5 как-то вообще неправильно восстанавливает скоупы. В результате переменная используется вне своего скоупа и валится проверка типов.

euler6-2 оптимизится нормально, но проглатывается локальная функция в С++, причём даже не замыкание.

euler6 зацикливается

hasChar как-то неправильно удаляет аргументы. В результате код чудом сохранил корректность, но поменялся по смыслу.
Tags: hn0
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments