Составители:
Рубрика:
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
- …
- следующая ›
- последняя »