Выбор подходящих опорных переменных для символического анализа

Вопрос или проблема

Итак, я создаю компилятор и сейчас занимаюсь некоторым символическим анализом аффинных выражений, которые могут быть использованы в нескольких оптимизациях.

Пример, который приводится в книге:

for(m = 10; m < 20; m++){
  x = m * 3; 
  A[x] = 0;
}

преобразуется в:

x = 27;
for(m = 10; m < 20; m++){
   x = x + 3;
   A[x] = 0;
}

вышеупомянутая оптимизация является уменьшением мощности: умножение было устранено и заменено на сложение.

Мой вопрос касается анализа, который делает эту трансформацию возможной. Мне нужно передать символические отображения в качестве значения потока данных. Или, в моем случае, множества кортежей со структурой (String, Reference Expression). Где String — это имя определения, а Reference Expression — это выражение, состоящее из ссылочных переменных.

Мой вопрос конкретно заключается в том, как определить, какие переменные являются ссылочными, а какие нет. В моем случае я имею дело с циклами, поэтому переменная индекса должна быть ссылочной переменной, и мне это очевидно. Но что, если переменная не является частью индекса цикла, но была бы хорошей ссылочной переменной. Более конкретно, как мне объяснить компьютеру, что переменная m является индексом цикла. Потому что все это преобразуется в IR перед запуском любого анализа. Единственное, что я могу придумать, — это провести другой анализ заранее, который будет похож на устранение мертвого кода, но на восходящем проходе просто добавлять хорошие ссылочные переменные в наборы gen.

Книга, которую я читаю, не упоминает ничего о другом проходе. Я не знаю, любой совет будет полезен.

Ответ или решение

Вопрос выбора соответствующих ссылочных переменных для символического анализа в компиляторе представляет собой значительный вызов, особенно при работе с аффинными выражениями и оптимизацией кода. Давайте подробнее рассмотрим подходы к определению ссылочных переменных, а также методологию, которая может быть полезна для решения вашей задачи.

Определение ссылочных переменных

Ссылочные переменные – это те переменные, значения которых могут изменяться в результате выполнения программы и влиять на другие части кода. В вашем примере, переменная m является индексом цикла, и её можно считать ссылочной переменной, поскольку она изменяется в каждом проходе цикла и влияет на значение x.

Шаги к определению ссылочных переменных:

  1. Анализ контекста использования переменных:

    • Обратите внимание на области видимости переменных. Например, переменные, объявленные внутри цикла, как m, почти всегда являются ссылочными, так как их значение изменяется в ходе итераций.
    • Также посмотрите на глобальные и локальные переменные. Глобальные переменные могут привести к побочным эффектам в разных частях программы, что делает их кандидатами на включение в набор ссылочных переменных.
  2. Идентификация циклов и условий:

    • Для понимания, что переменная является индикатором цикла, необходимо провести анализ контролей циклов. Идентифицируйте контрольные конструкции (например, for, while) и переменные, которые в них используются.
    • Используйте механизмы парсинга исходного кода или абстрактного синтаксического дерева (AST), чтобы выявить, какие переменные изменяются в цикле.
  3. Сохранение состояния во временных данных:

    • Создайте промежуточное представление данных, в котором можно будет отслеживать, какие переменные являются ссылочными на основе их использования в различных контекстах (например, в циклах, условиях).

Решение проблемы в контексте IR

Поскольку вы говорите о преобразовании в промежуточное представление (IR) до выполнения анализа, вам может понадобиться реализовать подход встреч, похожий на анализ живости переменных или удаления мертвого кода, но в "восходящем" направлении для определения обращений к переменным.

Рекомендации для реализации:

  1. Преобразование в IR:

    • На этом этапе важно сохранить все метаданные о переменных: где они объявлены и как используются. Это информация может использоваться для отслеживания ссылочных переменных.
  2. Проведение предварительного анализа:

    • Вы можете реализовать предварительный анализ, который проходит через IR и собирает данные о переменных, определяя какие из них потенциально могут участвовать в изменениях и использоваться как ссылка.
  3. Генерация и проверка наборов данных:

    • Каждая переменная может иметь инициализацию, использование и изменение. Сохраняйте данные о каждой переменной на этих этапах, включая выполненные операции.
    • Анализируйте набор переменных, при необходимости обновляя или добавляя их в генерируемый набор во время анализа.

Заключение

Определение ссылочных переменных для символического анализа требует тщательного изучения контекста использования переменных и их изменения в ходе выполнения программ, особенно в циклах. Подходы, подобные приведённым выше, могут стать мощным инструментом в вашей разработке компилятора, позволяя эффективно собирать и отслеживать ссылки на переменные.

Если у вас есть дополнительные вопросы или требуется больше конкретики, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...