• Nenhum resultado encontrado

Conditional constant propagation

O algoritmo Conditional Constant Propagation permite calcular algumas express˜oes e identificar c´odigo inacess´ıvel. C´odigo inacess´ıvel corresponde a n´os no grafo fluxo de controlo que nunca v˜ao ser executados em todas as possibilidades de execuc¸˜ao do pro- grama. Este c´odigo pode ser removido, diminuindo assim o tamanho do bytecode.

O objetivo deste algoritmo, consiste em descobrir os valores que s˜ao constantes em todas as possibilidades de execuc¸˜ao do programa e propagar essas constantes o mais poss´ıvel no programa [30].

O resultado deste algoritmo consiste em um reticulado para presentar cada uma das definic¸˜oes de valor em cada n´o do grafo SSA. O reticulado usado neste algoritmo ´e apre- sentado na Figura 5.4 [31]. O reticulado ´e uma estrutura alg´ebrica que permite fazer relac¸˜oes entre os seus elementos. No caso do reticulado deste algoritmo, este ´e constitu´ıdo por trˆes n´ıveis, o valor mais alto ´e>, os valores interm´edios consistem num n´umero in- finito de constantes que uma definic¸˜ao de vari´avel pode ter e por fim o n´ıvel mais baixo ´e o⊥ [30]. No algoritmo n˜ao ´e poss´ıvel a uma vari´avel que suba de n´ıvel no reticulado, ou seja, n˜ao ´e poss´ıvel uma vari´avel ao estar no n´ıvel⊥ subir para um outro n´ıvel do re- ticulado. Na mesma l´ogica, se o reticulado estiver no n´ıvel das constantes este j´a n˜ao vai subir para o n´ıvel> do reticulado [30]. No fim da execuc¸˜ao do algoritmo, se o reticulado de uma vari´avel tiver um valor constante significa que em todas as execuc¸˜oes poss´ıveis do programa essa vari´avel vai ter sempre o mesmo valor [30]. Se o valor for⊥, significa que n˜ao se consegue garantir que essa vari´avel v´a ter um valor constante e se o valor for >, significa que naquele momento n˜ao ´e poss´ıvel determinar se o valor vai ser constante ou n˜ao [30]. No inicio de execuc¸˜ao do algoritmo, o reticulado de cada um das vari´aveis vai ter o valorThe Static Single Assignment Form>. 11-21

False True c1 c2 c3 ...

FIGURE 11.25 The lattice of constants.

any ⊓ ⊤ = any any ⊓ ⊥ = ⊥ Ci ⊓ Cj = ⊥, if i ̸= j

Ci ⊓ Cj = Ci, if i = j FIGURE 11.26 The meet operator.

11.4.1 The Lattice of Constants

The infinite lattice of constants used in the constant propagation algorithms is a flat lattice as shown in Figure 11.25. ⊤ stands for an as yet undetermined constant, ⊥ for a nonconstant, and Ci for a constant

value. The meet operator ⊓ is defined as in Figure 11.26. The symbol any stands for any lattice value in Figure 11.26.

11.4.2 The CCP Algorithm: Flow Graph Version

All variables are supposed to be used only after they are defined and are initialized by the Conditional Constant Propagation (CCP) algorithm to ⊤ at every node. This is a special feature of the Wegman–Zadeck algorithm, which enables it to find more constants than other algorithms (in programs with loops). For details of this effect, the reader is referred to [55]. Each node is supposed to have two lattice cells per variable, one to store the incoming value and the other to store the computed value (exit value). There are also two lattice cells at each node to store the old and new values of the expression. All the edges going out of the start node are initially put on the work-list and marked as executable. The algorithm does not process any edges that are not so marked. A marked edge is removed from the work-list, and the node at the target end of the edge is symbolically executed. This execution involves computing the lattice value of all variables (not just the assigned variable). The incoming value of a variable x at a node y is computed as the meet of the exit values of x at the preceding nodes of y, and the values are stored in the incoming lattice cells of the respective variables at the node.

Now the expression at the node is evaluated according to the rules given in Figure 11.28. If the node contains an assignment statement, and if the new value of the expression is lower (in lattice value) than the existing value of the assignment target variable, then all outgoing edges of the node are marked as executable and added to the work-list. The new value is also stored in the exit lattice cell of the assignment target variable.

If the node contains a branch condition, and if the new value of the expression is lower than its existing value, then one of the following two actions is taken. If the new value is ⊥, both the successor edges of the node are marked and added to the work-list. If the new value is a constant (true or false), only the corresponding successor edge is marked and added to the work-list. This step enables elimination of

unreachable code. The new value of the expression is also stored in a lattice cell at the node.

Figura 5.4: Reticulado do algoritmo Conditional Constant Propagation

A execuc¸˜ao do algoritmo consiste em baixar o n´ıvel do reticulado para todas as vari´aveis consoante a informac¸˜ao que vai recebendo. Esta informac¸˜ao vai ser adicionada de acordo com as regras apresentadas na figura 5.5 [31]. O any nestas regras, consiste em qualquer valor constante que esteja no segundo n´ıvel do reticulado. Para a avaliac¸˜ao dos comandos “if ” e “unfold” ´e ´util utilizar as regras apresentadas na figura 5.6 [31]. Estas

Cap´ıtulo 5. Algoritmos de otimizac¸˜ao 63

regras permitem calcular as express˜oes destes comandos, aumentando a probabilidade de encontrar c´odigo inacess´ıvel.

anyu > = any (5.1)

anyu ⊥ = ⊥ (5.2)

ϕi u ϕj = ϕi ifϕi = ϕj (5.3)

ϕiu ϕj =⊥ if ϕi 6= ϕj (5.4)

Figura 5.5: Regra para o operadoru

true∨ any = true (5.5)

any∨ true = true (5.6)

false∧ any = false (5.7)

any∧ false = false (5.8)

Figura 5.6: Regra para express˜oes

O algoritmo utiliza as arestas do grafo SSA correspondentes ao fluxo de controlo, como as arestas de cada definic¸˜ao de vari´avel para os seus usos (arestas SSA). As arestas de fluxo de controlo s˜ao utilizadas para identificar c´odigo inacess´ıvel, enquanto que as arestas SSA s˜ao utilizadas para propagar as constantes pelo c´odigo. O algoritmo utiliza duas listas, em que uma guarda os n´os do grafo SSA que s˜ao visitados e a outra armazena as arestas SSA quando existe uma alterac¸˜ao de valor [31].

As arestas relativas ao fluxo de controlo do grafo SSA s˜ao adicionadas `a lista sempre que um n´o do grafo tenha apenas um sucessor. Outra situac¸˜ao ´e quando encontra um n´o com joint points. Ao encontrar um joint point (significa que ´e um “unfold”, “ifStateCon- tains” ou “unfold”) a sua express˜ao vai ser avaliada adicionando `a lista o ramo correspon- dente [31]. Por exemplo, se ao avaliar um “if ” o resultado da express˜ao for verdadeira, ent˜ao o ramo verdadeiro do “if ” vai ser adicionado. Se o resultado for falso, ent˜ao vai ser adicionado o ramo falso. Por fim, se o resultado for⊥, tanto o ramo verdadeiro como falso v˜ao ser adicionados `a lista.

As arestas SSA s˜ao adicionadas `a lista de arestas SSA, sempre que existe uma mudanc¸a de valor nessa definic¸˜ao. Garantindo assim, que sempre que uma definic¸˜ao de vari´avel te-

Cap´ıtulo 5. Algoritmos de otimizac¸˜ao 64

nha o seu valor de reticulado alterado todos os seus usos v˜ao ter em conta essa mudanc¸a [31]. No fim da execuc¸˜ao do algoritmo, se um dos n´os do grafo SSA n˜ao for visitado signi- fica que este n´o e todo o c´odigo contido nele pode ser marcado como c´odigo inacess´ıvel.

Documentos relacionados