Теория к заданиям — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 123: | Строка 123: | ||
<strong>Примечание от нерадивых студентов.</strong> Вы также можете почерпнуть некоторую дополнительную информацию в соответствующей статье на [https://ru.wikipedia.org/wiki/SSA Wikipedia]. | <strong>Примечание от нерадивых студентов.</strong> Вы также можете почерпнуть некоторую дополнительную информацию в соответствующей статье на [https://ru.wikipedia.org/wiki/SSA Wikipedia]. | ||
+ | |||
+ | == Граница доминирования == | ||
+ | Из лекций: | ||
+ | Границей доминирования n, DF(n), называется множество узлов m, удоволетворяющих условиям: | ||
+ | # n является доминатором предшественника m | ||
+ | #: <code>p ∈ Pred(m) & n ∈ Dom(p)</code> | ||
+ | # n не является строгим доминатором m | ||
+ | #: <code>n ∉ (Dom (m) – {m})</code> | ||
+ | |||
+ | <strong>Примечание от нерадивых студентов.</strong> | ||
+ | |||
+ | == Бесполезный код == |
Текущая версия на 18:23, 5 апреля 2018
Содержание
Множества Gen и Kill[править]
В лекциях определения этих множеств даются в рамках темы "Достигающие определения" (Тема №2. Построение множеств Input и Output).
- gen – множество определений, порождаемых инструкцией
- kill – множество определений, убиваемых инструкцией
Примечание от нерадивых студентов.
Попробуем сформулировать проще. Предположим в блоке Блок1
определена переменная с именем Переменная1
. Определим в качестве пары (Переменная1
, Блок1
). Тогда:
- множество
Gen
для блока - это множество всех переменных, которые объявляются в этом блоке; - множество
Kill
для блокаБлок1
определяется с помощью множестваGen
следующим образом. Для каждой переменной блокаБлок1
(в нашем случае это будет толькоПеременная1
), сопоставляя её с множествомGen
для блокаБлок1
, проверяется наличие переменной с таким же именем в множествахGen
всех других блоков программы, и, в случае, если вхождение присутствует, переменная (в нашем случаеПеременная1
) входит в множествоKill
блокаБлок1
.
Достигающие определения[править]
Из лекций:
- Определением переменной x называется инструкция, которая
присваивает значение переменной х
.
- Использованием переменной x является инструкция, одним из
операндов которой является переменная х
.
- Каждое новое определение переменной x убивает ее предыдущее
определение.
- Определение
d
достигает точкиp
, если существует путь от точки, непосредственно следующей заd
, к точкеp
, такой, что вдоль этого путиd
остается живым.
Пример. (Из лекций). B1 i ← –, m, 1 j ← n a ← u1
B2 i ← +, i, 1 j ← -, j, 1 a
B3 a ← u2
B4 i ← u3
Начало блока B2 достигается определениями:
- (i, B1), (j, B1), (a, B1),
- (j, B2) (других определений j на пути от (j, B2) до начала блока B2 нет)
- (a, B3)
- (i, B4)
(i, B2) не достигает начала B2, так как его убивает (i, B4) (j, B2) убивает (j, B1), не позволяя ему достичь блоков B3 и B4
Примечание от нерадивых студентов. Возможно, Вам поможет статья на Wikipedia.
Множества Def и Use[править]
- def – множество переменных, определяемых в блоке В до их использования в этом блоке (любая переменная из defB мертва на входе в блок В).
- use – множество переменных, используемых в блоке В до их определения в этом блоке (любая переменная из useB жива на входе в блок В).
Пример. (Из лекций). B1 i ← –, m, 1 j ← n a ← u1
B2 i ← +, i, 1 j ← -, j, 1 a
B3 a ← u2
B4 i ← u3
- в блоке B2 переменные i и j используются до их переопределения, следовательно,
useB2 = {(i,B1), (i,B4), (j,B1)} = (1100001)
- в блоке B2 определяются новые значения переменных i и j, так что
defB2 = {(i,B2), (j,B2)} = (0001100)
Примечание от нерадивых студентов. Пример алгоритма и дополнительную информацию можно найти на github. Обратите внимание, в примерах следующего вида:
export function w $f(w %n, w %m) { @start %a =w add 1, 1 @end ret %a }
переменная %a
должна входить в use(ret)
.
Живые переменные[править]
Для определения переменной x в точке p программы выяснить, будет ли указанное значение x использоваться вдоль какого-нибудь пути, начинающемся в точке p.
- Если да – переменная x жива (активна) в точке p.
- Если нет – переменная x мертва (неактивна) в точке p.
Примечание от нерадивых студентов. Фактически, это Reaching Definitions (Достигающие определения) наоборот. Пример алгоритма.
for (каждый базовый блок B) { In[B] = ∅ } while (внесены изменения в In) { for (каждый базовый блок, отличный от выходного) { Out[B] = ⋃In[S], S - преемник В In[B] = use[B] ∪ (Out[B] \ def[B]) } }
Тогда живые переменные блока - это его Out.
Доминаторы[править]
Из лекций:
В ГПУ вершина d
является доминатором вершины n
(этот факт записывается как d dom n
или d = Dom(n))
, если любой путь от вершины Entry
до вершины n
проходит через вершину d
.
Другой вариант определения.
Узел d
графа потока доминирует над узлом n
, если любой путь от входного узла графа потока к n
проходит через d
. Заметим, что при таком определении каждый узел доминирует над самим собой.
Форма SSA[править]
Из лекций: Форма статического единственного присваивания (SSA) позволяет в каждой точке программы объединить
- информацию об имени переменной
- с информацией о текущем значении этой переменной (или, что то же самое, с информацией о том, какое из определений данной переменной определяет ее текущее значение в данной точке).
Примечание от нерадивых студентов. Вы также можете почерпнуть некоторую дополнительную информацию в соответствующей статье на Wikipedia.
Граница доминирования[править]
Из лекций: Границей доминирования n, DF(n), называется множество узлов m, удоволетворяющих условиям:
- n является доминатором предшественника m
-
p ∈ Pred(m) & n ∈ Dom(p)
-
- n не является строгим доминатором m
-
n ∉ (Dom (m) – {m})
-
Примечание от нерадивых студентов.