Если компилятор не в состоянии это доказать, то он обязан не делать эту оптимизацию.
А в целом, компиляторы и так не делают много из того, что могли бы, если б не их опасения о нас родимых. Скажем, ссылки позволяют компилятору куда больше, чем указатели на их месте.
Так а если убрать UB из Стандарта, то насколько сильно это свяжет руки оптимизаторам? Действительно ли намертво свяжет и -O3 практически перестанет отличаться от -O0?
Сильно свяжет. Ещё раз: мы же хотим, чтобы компилятор всё сделал за нас. Нынче мы получаем от них объектный код, который в большинстве случаев идеален или недалёк от него для этого типа процессоров. За счёт чего, как думаешь? Риторический вопрос.
Добавлено
И вообще, если б мы хотели более полной свободы в самовыражении своих идей, оставив всю заботу о технических аспектах компилятору, мы б просто взяли другой язык. Не так ли?