Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 97 стр.

UptoLike

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 тогда и только тогда,
                                                                                когда: