Составители:
Рубрика:
5.3.3.2. Удаление псевдонимов переменных
Это преобразование позволяет избавиться от лишних присваива-
ний и уменьшает количество локальных переменных. Под переменной
будем понимать, опять же, как локальные переменные, так и параметры
методов.
Переменная Y является псевдонимом переменной X тогда и только
тогда, когда:
1. переменная X используется в теле метода только один раз, при-
чем в инструкции ldloc(ldarg)X;
2. за инструкцией ldloc(ldarg)Xнепосредственно следует инст-
рукция stloc(starg)Y(впрочем, допускается наличие между ни-
ми любого количества инструкций dup). Причем инструкция
stloc(starg) Y является первым использованием переменной Y
(назовем ее инструкцией инициализации переменной Y).
Схема удаления псевдонима Y переменной X показана на рис. 5.4.
При удалении осуществляются два действия:
1. Инструкция инициализации переменной Y заменяется инструк-
цией pop.
2. Все использования переменной Y заменяются использованиями
переменной X.
5.3.3.3. Воспроизведение констант
Это преобразование позволяет избавиться от переменных, имеющих
константное значение.
Переменная Y имеет константное значение C тогда и только тогда,
когда:
Динамическая генерация кода
181
Под переменными мы будем понимать как локальные переменные, так и
параметры методов.
Другими словами, избыточные инструкции stloc и starg удаляются
только для переменных, не использующихся в инструкциях ldloca и ldarga.
Для обнаружения избыточных инструкций сохранения значений вы-
полняется анализ использования переменной, состоящий из двух фаз:
1. Построение графа использования переменной.
2. Анализ графа использования переменной.
Инструкции ldloc(ldarg)Xи stloc(starg)Xбудем называть инструк-
циями использования переменной X.
Мы будем говорить, что в графе потока управления инструкция ис-
пользования B следует за инструкцией использования A на пути w, если:
1. инструкции A и B используют одну и ту же переменную X;
2. путь w соединяет A и B;
3. путь w не содержит ни одной инструкции использования пере-
менной X, кроме инструкций A и B.
Граф использования переменной X – это ориентированный граф, в уз-
лах которого находятся инструкции использования переменной X, а дуги
задают отношение следования для этих инструкций. То есть, если инст-
рукция B следует за инструкцией A на каком-либо пути в графе потока уп-
равления, то в графе использования переменной X имеется дуга от инст-
рукции A к инструкции B.
Анализ графа использования переменной заключается в нахождении
таких инструкций stloc(starg), за которыми не следует ни одной инст-
рукции ldloc(ldarg). Эти инструкции являются избыточными и заменя-
ются инструкциями pop.
На рисунке 5.3 изображен пример графа использования переменной.
Серым цветом обозначены избыточные инструкции stloc.
Рис. 5.3. Пример графа использования переменной
180
CIL и системное программирование в Microsoft .NET
stloc X ldloc X
stloc X
stloc X
stloc X
Рис. 5.4. Удаление псевдонима Y переменной X
ldloc X
stloc Y
ldloc Y
ldloc X
pop
ldloc X
180 CIL и системное программирование в Microsoft .NET Динамическая генерация кода 181
Под переменными мы будем понимать как локальные переменные, так и 5.3.3.2. Удаление псевдонимов переменных
параметры методов. Это преобразование позволяет избавиться от лишних присваива-
Другими словами, избыточные инструкции stloc и starg удаляются ний и уменьшает количество локальных переменных. Под переменной
только для переменных, не использующихся в инструкциях ldloca и ldarga. будем понимать, опять же, как локальные переменные, так и параметры
Для обнаружения избыточных инструкций сохранения значений вы- методов.
полняется анализ использования переменной, состоящий из двух фаз: Переменная Y является псевдонимом переменной X тогда и только
1. Построение графа использования переменной. тогда, когда:
2. Анализ графа использования переменной. 1. переменная X используется в теле метода только один раз, при-
Инструкции ldloc(ldarg) X и stloc(starg) X будем называть инструк- чем в инструкции ldloc(ldarg) X;
циями использования переменной X. 2. за инструкцией ldloc(ldarg) X непосредственно следует инст-
Мы будем говорить, что в графе потока управления инструкция ис- рукция stloc(starg) Y (впрочем, допускается наличие между ни-
пользования B следует за инструкцией использования A на пути w, если: ми любого количества инструкций dup). Причем инструкция
1. инструкции A и B используют одну и ту же переменную X; stloc(starg) Y является первым использованием переменной Y
2. путь w соединяет A и B; (назовем ее инструкцией инициализации переменной Y).
3. путь w не содержит ни одной инструкции использования пере- Схема удаления псевдонима Y переменной X показана на рис. 5.4.
менной X, кроме инструкций A и B. При удалении осуществляются два действия:
Граф использования переменной X – это ориентированный граф, в уз- 1. Инструкция инициализации переменной Y заменяется инструк-
лах которого находятся инструкции использования переменной X, а дуги цией pop.
задают отношение следования для этих инструкций. То есть, если инст- 2. Все использования переменной Y заменяются использованиями
рукция B следует за инструкцией A на каком-либо пути в графе потока уп- переменной X.
равления, то в графе использования переменной X имеется дуга от инст-
рукции A к инструкции B.
Анализ графа использования переменной заключается в нахождении
таких инструкций stloc(starg), за которыми не следует ни одной инст- ldloc X ldloc X
рукции ldloc(ldarg). Эти инструкции являются избыточными и заменя-
ются инструкциями pop.
На рисунке 5.3 изображен пример графа использования переменной. stloc Y pop
Серым цветом обозначены избыточные инструкции stloc.
stloc X ldloc X
ldloc Y ldloc X
stloc X
Рис. 5.4. Удаление псевдонима Y переменной X
stloc X stloc X
5.3.3.3. Воспроизведение констант
Это преобразование позволяет избавиться от переменных, имеющих
Рис. 5.3. Пример графа использования переменной константное значение.
Переменная Y имеет константное значение C тогда и только тогда,
когда:
Страницы
- « первая
- ‹ предыдущая
- …
- 95
- 96
- 97
- 98
- 99
- …
- следующая ›
- последняя »
