Генерация высококачественного кода для программ, написанных на СИ | страница 5
приводит к логическому эквиваленту:
>T1 = y * 3;
>if(a == 0)
> a = T1;
>else
> b = T1;
Рисунок 1 демонстрирует практический выигрыш от выделения общих подвыражений в реальном коде.
--------------------------------------------------------------¬
¦РИСУНОК 1: Выделение общих подвыражений ¦
+-------------------------------------------------------------+
¦Исходный текст на Си BORLAND LATTICE ¦
¦ Turbo C 1.5 MS-DOS C 3.2 ¦
+-------------------------------------------------------------+
¦if((h3 + k3) < 0 || mov AX,h3 mov AX,h3 ¦
¦ (h3 + k3) > 5) add AX,k3 add AX,k3 ¦
¦ printf("Common\ jl @18 js L0187 ¦
¦ subexpression\ mov AX,h3 cmp AX,5 ¦
¦ elimination"); add AX,k3 jle L0193 ¦
¦ cmp AX,5 L0187: ¦
¦ jle @17 mov AX,01.0000 ¦
¦ @18: push AX ¦
¦ mov AX,offset s@ call printf ¦
¦ push AX add SP,2 ¦
¦ call printf L0193: ¦
¦ mov SP,BP ¦
¦ @17: ¦
+-------------------------------------------------------------+
¦Многократные вхождения вычислений заменяются значением, ¦
¦которое является результатом единственного вхождения ¦
¦вычисления. Borland Turbo C вычисляет значение выделенного ¦
¦выражения h3+k3 дважды, тогда как LATTICE MS-DOS C и другие ¦
¦применяют выделение общих подвыражений и вычисляют ¦
¦выражение только один раз. ¦
L--------------------------------------------------------------
"Снижение мощности" подразумевает замещение операций, которые требуют большего времени выполнения, более быстрыми. Компилятор может применять снижение мощности несколькими способами. Например, применяя снижение мощности к сгенерированному коду, компилятор может подменять операции, которые умножают или делят целые числа на степени двойки, операциями сдвига.