2016-10-30 20 views
1

При изучении я натолкнулся на следующие утверждения:«Форвард должен проблемы» в дизайне компилятора

Точка соединения - это программная точка, в которой встречаются две ветви.

Доступные выражения - это проблема, стоящая впереди.

Вперед = поток данных извне.

Must = В точке соединения свойство должно удерживаться на всех путях, которые соединены.

Получаю, что общая точка, доступное выражение и вперед. Но я понимаю, что именно подразумевается под MUST.

Кто-то, пожалуйста, объясните, что ДОЛЖНО с примером.

ответ

0

Рассмотрим следующий пример:

a = 10 
if condition 
    x = a + 1 // First calculation only in true branch. 
else 
    x = 3 
end 
y = a + 1 // Can we eliminate this redundant calculation? 

Здесь арифметическое выражение a + 1 вычисляется два раза. Цель анализа доступных выражений состоит в том, чтобы выяснить, можно ли устранить один из этих вычислений путем повторного использования ранее вычисленного значения. Если можно исключить вычисление, компилятор может оптимизировать код для хранения результата повторного использования в регистре.

Чтобы устранить избыточные вычисления, следующие условия должны быть выполнены:

  • Нет переменной, которая используется в расчетах не были переназначены между вычислениями. В данном примере a не переназначается.
  • Выражение будет рассчитываться по всему пути, ведущему к утверждению, в котором выражение устранено. Здесь выражение вычисляется только в ветви true, но не в ветке false. Таким образом, если условие было ложным, a + 1 еще не было рассчитано, что означает, что мы не можем исключить расчет.

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