Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, vdimas, Вы писали:
V>>Я прошёлся по куче компиляторов — даже когда is_max не уничтожается (подавал не константу компиляции) — эффект был тот же на -O2, всё те же oops для первоначального варианта. )) CC>Алгоритмические оптимизации делаются во фронтэнде. И если он решил что тут будет всегда false, потому что на абстрактное (x + 1) < x он смотрел без учёта размерностей, то бэкенд именно return false, как ему сказали и сгенерирует.
В современных компиляторах — нет. В старом ICC это, наверное, было так — поэтому, в частности, вам удалось сбить его с толку введением временной переменной.
А сейчас так не делают — все вот эти алгебраические эквивалентности фронтендерам делать лень; у них и так хватает работы по разбору синтаксиса. Всё это делается уже потом, при анализе CFG в IR.
И никакого "без учёта размерностей" тут нету — ведь для unsigned типов этот код всегда компилируется совершенно корректно. То есть почему-то компилятор считает, что беззнаковый инкремент может уменьшить x, а вот знаковый "почему-то" не может. Вот как раз потому он так и считает, что для знакового инкремента переполнение — UB, а для беззнакового — нет.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.