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.

  • 相关阅读:
    bootstrap-table实现分页、导出数据至excel
    Python求多个list的交集、并集、差集 & list 排序
    JS
    python 格式化输出(% VS format)
    pyqt5_实例:修改xml文件中节点值
    博客迁移
    Reverse is Multiplex, You Need PinTools.
    ISCC2018_leftleftrightright-Writeup
    如何在linux主机上运行/调试 arm/mips架构的binary
    强网杯2018
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10147204.html
Copyright © 2011-2022 走看看