zoukankan      html  css  js  c++  java
  • 活性变量分析

    Live variable analysis

    In compiler theory, live variable analysis(or simply livenesss analysis) is a classic data-flow analysis performed by compilers to calculate for each program point the variables that may be potentially read before their next write, that is, the variables that are live at the exit from each program point.

    stated simply: a variable is live if it holds a value that may be needed in the future.

    Example:

    The set of live variables at line L3 is {b,c} because both are used in the multiplication, and thereby the call to f and assignment to a. But the set of live variables at line L1 is only {b} since variable c is updated in L2. The value of variable a is never used. Note that f may be stateful, so the never-live assignment to a can be eliminated, but there is insufficient information to rule on the entirely of L3.

    Expression in terms of dataflow equations

    Liveness analysis is a "backwards may" analysis. The analysis is done in a backwards order, and the dataflow confluence operator is set union. In other words, if applying liveness analysis to a function with a particular number of logical branches within it, the analysis is performed starting from the end of the function working towards the beginning(hence "backwards"), and a variable is considered live if any of the branches moving forward within the function might potentially(hence "may") need the variable's current value. This is in contrast to a "backwards must" analysis which would instead enforces this condition on all branches moving forwards.

    The dataflow equations used for a given basic block s and exiting block f in live variable analysis are the following:

    GEN[s]: The set of variables that are used in s before any assignment..

    KILL[s]: The set of variables that are assigned a value in s(in many books, KILL(s) is also defined as the set of variables assigned a value in s before any use, but this does not change the solution of the dataflow equation):

    The in-state of a block is the set of variables that are live at the start of the bock. Its out-state is the set of variables that are live at the end of if. The out-state is the union of the in-states of the block's sucessors. The transfer function of a statement is applied by making the variables that are writtern dead, then making the variables that are read live.

    Second example

    The in-state of b3 only contains b and d, since c has been writtern. The out-state of b1 is the union of the in-state of b2 and b3. The definition of c in b2 can be removed, since c is not live immediately after the statement.

    Solving the data flow equations starts with initializing all in-state and out-states to the empty set. The work list is initialized by inserting the exit point(b3) in the work list(typical for backward flow). Its computed in-state differs from the previous one, so its predecessors b1 and b2 are inserted and the process continues. The progress is summarized in the table below.

    Note that b1 was entered in the list before b2, which forced processing b1 twich(b1 was re-entered as processor of b2). Inserting b2 before b1 would have allowed earlier completion.

  • 相关阅读:
    [2019南昌邀请赛网络赛D][dp]
    [ Educational Codeforces Round 65 (Rated for Div. 2)][二分]
    [hdoj5927][dfs]
    [cf1140D. Minimum Triangulation][dp]
    [hdoj6483][莫队+线段树/ST]
    使用GAC加速 解决CSP问题 Kakuro
    UVA 11427 Expect the Expected
    UVA 11021 Tribles
    UVA 11174 Stand in a Line 树上计数
    《算法概论》第八章的一些课后题目 关于NP-Complete Problem
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10147204.html
Copyright © 2011-2022 走看看