Оптимизированы логические операции над операциями с несколькими модулями?

Легко видеть, что:

(i % 3 == 0) && (i % 5 == 0)

Можно упростить до:

(i % 15 == 0)

Однако глядя на вывод GCC, кажется, что это не делается даже при высоких уровнях оптимизации.

Делают ли какие-либо компиляторы такого рода оптимизации, или есть веская причина, по которой эти два теста семантически не эквивалентны?

Редактировать:В ответ на тех, кто говорит, что это второстепенный случай, ниже приведен аналогичный случай.:

(i < 3) && (i < 5)

Любое число меньше 3 всегда должно быть меньше 5. Второй тест является избыточным.

Я также хотел бы добавить следующее в ответ на ответ о том, что компилятор не может знать, затронута ли среда... Посмотрите на этот код:

void foo(void)
{
    int i;
    for (i = 0; i <= 10; i++)
    {
        if (i > 20)
        {
            puts("Hi");
        }
    }
}

Вся функция сокращена до "repz ret" GCC с -O2. Это гораздо сложнее, чем все, о чем я говорю.

8
задан Matt 18 April 2012 в 19:34
поделиться