Какие различия между оптимизатором GCC и clang приводят к тому, что этот код не оптимизируется?
Если я скомпилирую следующий код:
#include <boost/range/irange.hpp>
template<class Integer>
auto iota(Integer last)
{
return boost::irange(0, last);
}
template<class Integer, class StepSize>
auto iota(Integer last, StepSize step_size)
{
return boost::irange(0, last, step_size);
}
int main( )
{
int y = 0;
for (auto x : iota(5))
y += x;
return y;
}
С лязгом 3.9.0 и GCC 6.3.0 на -O1
Я получаю полную оптимизацию по GCC (просто возвращает конечный результат) и много-много Clang выходного кода. Смотрите этот эксперимент на GodBolt. Если я переключу Clang на -O2
Однако, это также компилирует все.
Какие различия в оптимизации между двумя компиляторами? -O1
режимы это вызывает?