Инструкция Phi

Материал из Compilers Wiki
Версия от 21:17, 16 марта 2018; Admin (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
PHI := %IDENT '=' BASETY 'phi' ( @IDENT VAL ),

Прежде всего, инструкции phi НЕ нужны при написании программ на QBE. Одним из решений, позволяющим избежать использования формы SSA, является использование переменных, выделенных стеком, для всех переменных исходной программы, и выполнения присваиваний и иницализаций с использованием операций памяти. Это то, что обычно делают пользователи LLVM.

First and foremost, phi instructions are NOT necessary when writing a frontend to QBE. One solution to avoid having to deal with SSA form is to use stack allocated variables for all source program variables and perform assignments and lookups using Memory operations. This is what LLVM users typically do.

Другое решение - просто исправить код, который не находится в форме SSA! В отличие от LLVM, QBE может фиксировать программы не в форме SSA, не требуя шаблона загрузки и хранения в памяти. Например, приведенная ниже программа будет правильно скомпилирована QBE.

Another solution is to simply emit code that is not in SSA form! Contrary to LLVM, QBE is able to fixup programs not in SSA form without requiring the boilerplate of loading and storing in memory. For example, the following program will be correctly compiled by QBE.
@start
        %x =w copy 100
        %s =w copy 0
@loop
        %s =w add %s, %x
        %x =w sub %x, 1
        jnz %x, @loop, @end
@end
        ret %s

Теперь, если вы хотите знать, что такое phi-инструкции и как их использовать в QBE, читайте далее.

Now, if you want to know what phi instructions are and how to use them in QBE, you can read the following.

Инструкции Phi относятся к форме SSA. В значениях формы SSA могут быть назначены только один раз, без phi-инструкций это требование слишком велико, чтобы представлять множество программ. Например, рассмотрим следующую программу на C.

Phi instructions are specific to SSA form. In SSA form values can only be assigned once, without phi instructions, this requirement is too strong to represent many programs. For example consider the following C program.
Пример 1.
int f(int x) {
        int y;
        if (x)
                y = 1;
        else
                y = 2;
        return y;
}

Переменная y переприсваивается дважды, решение для ее перевода в форму SSA заключается в вставке phi-инструкции.

The variable y is assigned twice, the solution to translate it in SSA form is to insert a phi instruction.
Пример 2.
@ifstmt
        jnz %x, @ift, @iff
@ift
        jmp @retstmt
@iff
        jmp @retstmt
@retstmt
        %y =w phi @ift 1, @iff 2
        ret %y

Phi-инструкции возвращают один из аргументов в зависимости от того, откуда было передано управление. В примере 2 %y устанавливается в 1, если была задействована ветвь @ift, и 2 в противном случае.

Phi instructions return one of their arguments depending on where the control came from. In the example, %y is set to 1 if the @ift branch is taken, or it is set to 2 otherwise.

Важное замечание о инструкциях phi состоит в том, что QBE предполагает, что если переменная определена с помощью phi, она учитывает все инварианты SSA. Поэтому очень важно не использовать инструкции phi, если вы не знаете точно, что делаете.

An important remark about phi instructions is that QBE assumes that if a variable is defined by a phi it respects all the SSA invariants. So it is critical to not use phi instructions unless you know exactly what you are doing.



Источник: c9x.me