Есть программка. Мне сказали что она делает решето Эратосфена, но на самом деле это не важно.
int main()
{
int n = 500000000;
int *a = new int[n + 1];
for (int i = 0; i <= n; i++)
{
a[i] = i;
}
for (int i = 2; i * i <= n; i++)
{
if (a[i])
{
for (int j = i * i; j <= n; j += i)
{
a[j] = 0;
}
}
}
delete[] a;
return 0;
}
Вопрос. Почему ни gcc ни clang даже под -O3 не понимают что это всё можно упростить до return 0; т.к. результат вычислений никуда не используется? Пробовал заменять new/delete на аллокацию на стэке, не помогает.
Update: в GCC был
баг, но теперь его починили и
ВЖУХ он оптимизирует весь этот код вникуда.