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