LINUX.ORG.RU

История изменений

Исправление ckotinko, (текущая версия) :

внезапно, баг довольно странный.

там же кодогенератор внутри. он видит некое дерево операторов на входе у них константы. по идее он должен заменять каждый оператор от констант на константу результат. так он домотает до операции записи в массив, где у него должна стоять проверка адреса. проверка адреса не выкидывается если адрес константа, а в нашем случае проверка дает фиксированный результат - по идее это отброс проверки и обрезка недостижимых путей исполнения. останется кидок исключения. это в теории так должен отработать оптимизатор и заметь: это простые, тривиальные оптимизации.

а вот тут выкинулась проверка но не выкинулась ветвь исполнения. ассемблерная инструкция

mov    DWORD PTR [eax*4+0xa521b98],0x12345678
ничего не напоминает?
m32[((1-ff(NaN) >>> 0) % 0xdc4e153) & v] = 0x12345678;
по идее, тут надо задуматься еще и что делает перед нами константа 0xa521b98. не хороша она, ох не хороша. какая-то большая проблема в кодогенераторе V8. она очень велика для смещения. а выделенный массив лежит не по фиксированному адресу, и к нему она тоже отношения не имеет. откуда же такая гадость вылезла?

я слабо представляю, как нормальными оптимизациями добиться появления такой константы.

Исходная версия ckotinko, :

внезапно, баг довольно странный.

там же кодогенератор внутри. он видит некое дерево операторов на входе у них константы. по идее он должен заменять каждый оператор от констант на константу результат. так он домотает до операции записи в массив, где у него должна стоять проверка адреса. проверка адреса не выкидывается если адрес константа, а в нашем случае проверка дает фиксированный результат - по идее это отброс проверки и обрезка недостижимых путей исполнения. останется кидок исключения. это в теории так должен отработать оптимизатор и заметь: это простые, тривиальные оптимизации.

а вот тут выкинулась проверка но не выкинулась ветвь исполнения. ассемблерная инструкция

mov    DWORD PTR [eax*4+0xa521b98],0x12345678
ничего не напоминает?
m32[((1-ff(NaN) >>> 0) % 0xdc4e153) & v] = 0x12345678;
по идее, тут надо задуматься еще и что делает перед нами константа 0xa521b98. не хороша она, ох не хороша. какая-то большая проблема в кодогенераторе V8.