Size: a a a

Compiler Development

2020 February 19

VI

Vladimir Ivanov in Compiler Development
EgorBo
вернее не свой, а мы тупо сейфпоинты при генерации ллвм эмитили, а это плохо для оптимизаций, их надо после оптимизаций вставлять
Получается у вас в safepoint’ах только oop map’ы для GC лежат, а не все состояние абстрактной VM?
В поддержке принудительной деоптимизации особой нужды нет?
источник

E

EgorBo in Compiler Development
Vladimir Ivanov
Получается у вас в safepoint’ах только oop map’ы для GC лежат, а не все состояние абстрактной VM?
В поддержке принудительной деоптимизации особой нужды нет?
я к стыду вообще про гц очень поверхностно знаю, не моя область.
Но сп у нас это проверка некого булевого флажка и если он выставлен - надо замерЕть, так все треды кооперативно договариваются о сборе, что дальше и какие транзишны, как сканится стек и т.п. - вообще не имею понятия :) моя задача была толкьо реализовать механизм их расстановки при помощи PlaceSafepointPass и оказалось там все просто - просто создай ф-цию с фиксированным названием и тремя бб-ками
источник

E

EgorBo in Compiler Development
у нас три режима: coop, preemprive, hybrid
источник

KR

K R in Compiler Development
Dmitry Ponyatov
legacy код большая проблема, особенно в командах в которых нет культуры разработки
вот такие тулзы в комплекте с language server и отладчиком необходимы
https://www.youtube.com/watch?v=649qbIkBd-I
Это отладчик. А как насчёт полного графа возможных вызовов?
источник

VI

Vladimir Ivanov in Compiler Development
EgorBo
я к стыду вообще про гц очень поверхностно знаю, не моя область.
Но сп у нас это проверка некого булевого флажка и если он выставлен - надо замерЕть, так все треды кооперативно договариваются о сборе, что дальше и какие транзишны, как сканится стек и т.п. - вообще не имею понятия :) моя задача была толкьо реализовать механизм их расстановки при помощи PlaceSafepointPass и оказалось там все просто - просто создай ф-цию с фиксированным названием и тремя бб-ками
Да, при наличии достаточной типовой информации на уровне IR (primitive vs reference vs derived ptr) построить GC map в произвольной точке кода не составляет большой проблемы.

А по поводу принудительной деоптимизации: у вас CHA есть? Если да, то как реализована поддержка в runtime? То есть «соптимизировали, запустили код, пришёл запрос на загрузку нарушающий инвариант». Что дальше?
источник

E

EgorBo in Compiler Development
Vladimir Ivanov
Да, при наличии достаточной типовой информации на уровне IR (primitive vs reference vs derived ptr) построить GC map в произвольной точке кода не составляет большой проблемы.

А по поводу принудительной деоптимизации: у вас CHA есть? Если да, то как реализована поддержка в runtime? То есть «соптимизировали, запустили код, пришёл запрос на загрузку нарушающий инвариант». Что дальше?
а что такое СНА?
деоптимизаций у нас нет и начальник вроде строго против нее :)
источник

E

EgorBo in Compiler Development
у нас есть АОТ для всего всего. для горячих методов АОТ выкидывается и слоенный джит на тиер2 пересобирает их, при этом используя информацию с АОТ (веса, какой-то коэффицент сложности инструкций по факту (нужно для инлайнинга))
источник

VI

Vladimir Ivanov in Compiler Development
Ну, тогда другое дело :-)
CHA = Class Hierarchy Analysis
источник

E

EgorBo in Compiler Development
ааа я понял про что ты
источник

E

EgorBo in Compiler Development
это то что вы там прикидываете что-то к носу и решаете что вместо животного тут всегда будет собака
источник

E

EgorBo in Compiler Development
про это? :)
источник

E

EgorBo in Compiler Development
особенно когда собака - это единственный наследник от животного в контексте в данный момент
источник

VI

Vladimir Ivanov in Compiler Development
Как один из частных случаев можно уточнять тип.
источник

VI

Vladimir Ivanov in Compiler Development
В контексте девиртуализации, это определение методов которые могут быть вызваны.
источник

VI

Vladimir Ivanov in Compiler Development
Для «расширяемых» иерархий классов такие анализы могут быть только оптимистичными и требуется дополнительная поддержка на случай нарушения инварианта.
источник

E

EgorBo in Compiler Development
в C# все методы невиртуальные по-умолчанию, есть девиртуализация когда джит может сквозь инлайны проследить переменную что ей присвоили конкретный тип - тогда девиртуализирует. Есть подкрученная девиртуализация для некоторых базовых типов, которые часто попадают в hot path, и есть Guarded devirtualization, когда джит по сути эмити проверку на тип и если что все методы вызывает уже прямо (но эта штука выключена по умолчанию)
источник

E

EgorBo in Compiler Development
и есть 4ый тип девиртуализации: это FullAOT режим без динамических подгрузок (например для iOS)
где можно смело еще даже для байткода пробежать и всё нафиг девиртуализировать что можно :-))
источник

VI

Vladimir Ivanov in Compiler Development
Сразу чувствуется влияние вашего начальника (который не жалует деопты) :-)
источник

E

EgorBo in Compiler Development
видел как в ллвм в самом даже раскидана инфраструктура для деоптимзаций :)
источник

E

EgorBo in Compiler Development
те же explicit null checks там были упоминания про деопт
источник