Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Оптимизирующие преобразования программ. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
849 Кб
Скачать

Аналогично могут2.2быть. Базовые удаленыпреобразованияипрограммдругие копии тела цикла, кроме последней. В последней копии тела цикла вместо счётчика цикла стоит его последнее значение. Таким образом, исходный цикл эквивалентно преобразован к виду, описанному в условии теоремы.

Пример 17. Цикл

FOR (I=5; I<=100; I = I + 10); {

эквивалентенX = A+B;оператору} КонецX = A+B;примера.

Пример 18. Цикл

FOR (I=5; I<=100; I = I + 10); {

не эквивалентенX = A+X;} оператору КонецX = A+X;примера.

Пример 19. Цикл

FOR (I=5; I<=100; I = I + 10); {

не эквивалентенX = A[I]+B;оператору}

(ПоследняяX = A[100]+B;итерация исходного цикла происходит при I = 95, и поэтому исходный цикл должен быть заменён на оператор

99 X = A[95]+B).

Конец примера.

Пример 20. Цикл

FOR (I=5; I<=100; I = I + 10); {

эквивалентенX = A[I]+B*I;оператору}

КонецX = A[95]+95*B;примера.

31

Пример 21. Цикл

2. Преобразования программ

 

FOR (I=5; I<=100; I = I + 10); {

не эквивалентенX = X+1;} оператору КонецX = X+1;примера.

Условный 2оператор.2.5. Удалениеможноусловныхудалить,оператесли егоровлогическое выражение тождественно истинно или тождественно ложно.

Пример 22. Фрагмент программы

IF (True)

D = T+C ;

равносиленX = D-следующемуC ; :

D = T+C ;

КонецX = Dпримера-C ; .

Пример 23. Фрагмент программы

IF (False)

D = T+C ;

равносиленX = D-следующемуC ; :

КонецX = Dпримера-C ; .

Иногда программу можно привести к виду, в котором логическое выражение тождественно истинно или тождественно ложно.

Пример 24.

FOR (I=1; I<=100; I = I++); { IF (I<10)

D[I] = T[I]+C ;

32

2.2. Базовые преобразования программ

else

X[I] = D[I]-C ;

}

FOR (I=1; I<10; I = I++); { D[I] = T[I]+C ;

}

FOR (I=10; I<=100; I = I++); { X[I] = D[I]-C ;

}

2.2.6. Приведение выражения к стандартному виду

Для некоторых («приведениепреобразованийподобных»)важно, чтобы выражения программы были приведены к некоторому стандартному виду. Особенно это необходимо при построении графа информационных связей. Без такого стандарта трудно понять, что вхождения

X(2*I+1), X(1+I*2), X(2*I+2-1), X(I+1+I) информационно зависимы.

В данной работе предлагаются следующие стандартные требования к записи выражений:

1. Аргументы коммутативной бинарной операции должны следовать в алфавитном порядке. Например, P*Q, а не Q*P.

2. Если в выражении некоторая одновременно и коммутативная, и ассоциативная операция должна выполняться несколько раз подряд, то все аргументы должны быть отсортированы по алфавиту. Например, A+B-X (вычитание в этой записи следует понимать как сложение с переменной с унарным минусом A+B+(-X)).

3. Сумма двух одинаковых выражений с (может быть, разными) числовыми множителями заменяется таким выражением с множителем, который равен сумме исходных: 3*I-I => 2*I.

4. Можно выносить общий множитель-переменную, пользуясь законом дистрибутивности. Но при вызове такой процедуры надо указывать, какие множители нам следует выносить. Такая процедура может выполняться благополучно лишь тогда, когда исходное

33

выражение линейно зависит2. Преобразованияот совокупностипрограмм указанных перемен-

ных (если их несколько). Например, A*B+A*C+B*C => A*B+(A+B)*C,

если выражение надо приводить относительно переменной C. Заметим, что в этом примере невозможно привести исходное выражение относительно переменных A и B одновременно, поскольку выражение нелинейно зависит от их совокупности. Если выносимый множитель является не константой, а переменной или подвыражением, то он пишется слева или справа, в зависимости от алфавитного порядка, с переменной, относительно которой множитель выносится.

5. При записи отношений будем использовать «<» вместо «>» и

« » вместо « ». Например, (x+2)<0 вместо 0>(x+2).

6. Булевывыражения следует приводить к ДНФ (дизъюнктивной нормальной форме), в которой аргументы конъюнкций и дизъюнкций расположены в алфавитном порядке. При этом выражение без отрицания должно записываться раньше такого же выражения с отрицанием. Например, Not(A) and B and Z or B and Y or not(B) and C.

7. Арифметические подвыражения над константами следует заменять их числовыми значениями. Например, числом –5 можно заменить выражение (3-4*2).

8. Унарный минус «-» можно выносить как множитель, если это особо оговорено в параметрах процедуры.

Пример 25.

X(I)*2-2*X(I-1) = > 2*X(I)-2*X(I-1)

X(I)*A(I)-2*X(I) => (A(I)-2)* X(I)

КонецX(I)*Y(I)примера-2*X(I). => X(I) *(Y(I)-2)

Для реализации пункта 4 требований к стандартному виду выражения может быть полезным предварительное раскрытие скобок по закону дистрибутивности.

5*(X-Y)+(A+1)*(X+Y) => 5*X-5*Y+(A+1)*X+(A+1)*Y => (5+(A+1))*XПример 26.+(-5+(A+1))*Y => (A+6)*X +(A-4)*Y

Конец примера.

34

Заметим, что 2приведение.3. Преобразован я линейныхвыраженийучастков программык стандартному виду всегда является эквивалентным преобразованием.

Данное преобразование «приведение выражений к стандартному виду» в ОРС реализуется функцией «линеаризация выражений». Это преобразование используется при построении графа информационных связей, поскольку, например, устанавливает тождество индексных выражений у вхождений переменных X[I+1] и X[1+I]. Это преобразование позволяет находить одинаковые выражения для уменьшения количества операций – например, позво-

ляет заменять код X = B+1+A[J+2] - 3*(B+2+A[1+J+1]-1) более простым кодом X = -2*(A[J+2]+B+1).

2.3. Преобразования линейных участков программы

Линейный участок программы – это фрагмент кода без ветвлений. Это частный случай базового блока, который может содержать ветвления (условные операторы), но не может содержать циклы. Большинство преобразований базовых блоков делаются оптимизирующими компиляторами GCC и LLVM на основе специального внутреннего (промежуточного) представления SSA-form (Single Static Assignment form) – форма с однократным присваиванием.

В данной работе приводится несколько преобразований линейных участков в высокоуровневом представлении. Эти преобразования понадобятся для других преобразований как вспомогательные.

Данное2.3.1. Перестпреобразованиеновка фрагментовсостоит в том(блоков), чтобыпрогфрагментммы программы

S1

..........

S(k-1) Sk

35

2. Преобразования программ

S(k+1)

..........

заменитьSm фрагментом программы

S(k+1)

 

..........

 

Sm

 

S1

 

..........

 

S(k-1)

 

Sk

 

Здесь S1,...,Sm – операторы программы.

Теорема 8. Пусть для фрагментов программы S1,...,Sk и

S(k+1),...,Sm операторы S1 и S(k+1) являются единственными точ-

ками входа, а операторы Sk и Sm – единственными точками выхо-

да соответственно. Будем считать, что между этими фрагмента-

ми нет условных или безусловных переходов. Кроме того, будем

предполагать, что для фрагмента S1,...,Sk, S(k+1),...,Sm оператор S1

является единственным входом, а Sm – единственным выходом.

Предположим, что в графе информационных связей НЕ существу-

ет такой дуги циклически независимой зависимости (v1,v2), что v1

принадлежит одному из переставляемых фрагментов программы,

а v2 – другому. Тогда рассматриваемая перестановка фрагментов

Доказательство.

 

программы эквивалентна.

 

Корректность перестановки вытекает

из того, что каждый из фрагментов S1,...,Sk, S(k+1),...,Sm, S1,...,Sk и

S(k+1),...,Sm имеет по одной точке входа и одной точке выхода.

Из отсутствия переходов между фрагментами вытекает, что

не существует цикла, содержащего хотя бы по одному оператору

из каждого из двух рассматриваемых фрагментов, который мог бы

разрушиться от перестановки фрагментов. С другой стороны, пе-

рестановка этих фрагментов не создаст новых циклов.

Два фрагмента программы эквивалентны тогда и только тог-

да, когда при одних и тех же исходных данных на их выходе полу-

36

чаются одинаковые2.3.значенияПреобразованиярезультирующихлинейных участков программыданных. Предполо-

жим, что фрагменты программы S1,...,Sk, S(k+1),...,Sm и S(k+1),...,Sm, S1,...,Sk неэквивалентны. Тогда найдётся некоторая переменная, обозначим её A, принимающая разные значения после выполнения этих фрагментов. Это возможно лишь в двух случаях:

1) последнее значение переменной A в этих фрагментах вычисляют разные операторы;

2) последнее значение переменной A вычисляет один и тот же оператор, но этот оператор использует разные значения некоторой переменной, которую будем обозначать B.

Первый случай означает, что в каждом из фрагментов S1,...,Sk и S(k+1),...,Sm есть операторы присваивания, вычисляющие A в один и тот же момент выполнения фрагмента S1,...,Sm. Но это означает существование такой дуги (v1,v2) типа out-out в графе информационных связей, что v1 принадлежит фрагменту S1,...,Sk, v2 – фрагменту S(k+1),...,Sm и оба вхождения обращаются к одной и той же ячейке памяти в один и тот же момент выполнения фрагмента S1,...,Sm (т. е. существует циклически независимая дуга). Противоречие.

Второй случай означает, что в одном из фрагментов S1,...,Sk или S(k+1),...,Sm находится оператор, вычисляющий A и использующий B, а в другом – оператор, вычисляющий B. Но, как и в предыдущем случае, это означает существование такой дуги (v1,v2) типа in-out либо out-in в графе информационных связей, что v1 принадлежит фрагменту S1,...,Sk, v2 – фрагменту S(k+1),...,Sm и оба вхождения обращаются к одной и той же ячейке памяти (в данном случае B) в один и тот же момент выполнения фрагмента S1,...,Sm (это дуга циклически независимой зависимости).

Конец доказательства.

Необходимость условий данной теоремы проиллюстрируем следующими примерами.

Пример 27. Фрагмент программы

X[K] = A[I+1]

A[I+1] = 1

37

НЕ равносилен следующему2. Преобразования: программ

A[I+1] = 1

(ЗдесьX[K]зависимость= A[I+1]между вхождениями переменной A является циклически независимой.) Действительно, при начальных значениях I=1; K=1; A[2]=2; первый фрагмент вычисляет X[1]=2 , а второй X[1]=1.

Конец примера.

Пример 28. Фрагмент программы

X[K] = A[I+1]

равносиленA[I] =следующему1 :

A[I] = 1

(ЗдесьX[K]зависимость= A[I+1]между вхождениями переменной A не является циклически независимой.)

Конец примера.

Пример 29. Фрагмент программы

X[K] = A[I+1]

НЕ равносиленK = 1 следующему:

K = 1

(ЗдесьX[K]зависимость= A[I+1]между вхождениями переменной K является циклически независимой.) Действительно, при начальных значе-

ниях I=1; K=2; A[2]=1; X[1]=2, первый фрагмент вычисляет X[1]=2,

а второй X[1]=1. Конец примера.

Пример 30. Фрагмент программы

10 IF [C<0)

15 L = A[I+1]

НЕ равносилен20 B = X[K]следующему:

38

2.3. Преобразования линейных участков программы

10 IF [C<0)

20 B = X[K]

(Здесь15вLисходном= A[I+1]фрагменте у оператора 20 два входа.) Конец примера.

Пример 31. Фрагмент программы

IF (C<0)

L = A[I+1]

равносиленB = X[K]следующему:

B = X[K]

IF (C<0)

КонецL = A[I+1]примера.

Пример 32. Фрагмент программы

K = X+1 goto 99

K = I-1

НЕ равносилен99 A = K следующему:

K = X+1

K = I-1

goto 99

(Здесь99уAвсего= Kфрагмента из двух переставляемых операторов в целом два выхода.)

Конец примера.

Пример 33. Фрагмент программы

С = 1 goto 99

...

88 С = 2

39

2. Преобразования программ

НЕ99 равносиленA = K следующему:

С = 1 goto 99

...

99 A = K

(88ЗдесьСу=фрагмента2 из оператора 99 два входа. У результирующего фрагмента на выходе всегда C=2, а у исходного может быть и C=1.)

Конец примера.

Пример 34. Фрагмент программы

write(F,10)

НЕ равносиленwrite(F,20)следующему:

write(F,20)

Здесьwrite(F,10)вхождения F связаны выходной зависимостью. Конец примера.

Предыдущую теорему несложно обобщить на случай перестановки фрагментов программы, между которыми есть ещё один фрагмент.

Пусть имеется фрагмент программы S1,...,Sm, представляющийТеоремасобой9. последовательность трёх подряд идущих фраг-

ментов S1,...,Sk; S(k+1),...,Sr; S(r+1),...,Sm. Операторы S1, S(k+1), S(r+1)

являются единственными точками входа, а операторы Sk, Sr и Sm – единственными точками выхода этих фрагментов соответственно. Кроме того, будем предполагать, что для всего фрагмента S1,...,Sm оператор S1 является единственным входом, а Sm – единственным выходом. Предположим, что в графе информационных связей НЕ существует такой циклически независимой дуги (v1,v2), что v1

принадлежит фрагменту S1,...,Sk; а v2 – S(k+1),...,Sr; S(r+1),...,Sm или v1 принадлежит S1,...,Sk; S(k+1),...,Sr; а v2 принадлежит фрагменту

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]